Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2008, 14:56   #1
Лунёв Виктор
Новичок
Джуниор
 
Регистрация: 05.12.2008
Сообщений: 2
По умолчанию Задача С++ Определение "счастливого" билета

Выбирая билеты мне понравился вопрос.
Когда дело дошло до реализации немного пожалел об этом)
Вообщем сам вопрос звучит так:" Определите я вляется ли Ваш трамвайный билет счастливым?"

Я привел для себя некоторые константы:
1 в билете не более и не менее 6 цифр;
2 наименьшее значение билета 001001 серия и номер соответственно.

дальше получился вот такой код:
#include <iostream> //библиотека дя работы с потоками ввода вывода
using namespace std;// библиотека, iostream без .h
void proverka(long); //описание(прототип) до опредиления функции
int main(void) //главная функция
{
long nomer = 0;// Определение переменной с присваиванием значения
cout<<"Введите номер билета \n"; // Диалог пользователя cout выходной cin входной
cin>>nomer;// ввод переменной nomer с клавиатуры
if(nomer==0) // логическая проверка
cout<<"\nНекоректный ввод числа, введите 6 цифр(x_x)!!!"; //вывод ошибки
if(nomer>999999) // логическая проверка
cout<<"\nНекоректный ввод числа, введите 6 цифр(x_x)!!!"; //вывод ошибки
if(nomer<=999999) // логическая проверка
proverka(nomer);// вызов функции proverka
cout<<'\n';// переходод на новую строку

} //завершение программы

void proverka(long n) //опредиление функции proverka
{ // открытие блока функции
int ost = 0, x = 0, y = 0; // определение с присваиванием
long dec=100000;// определение с присваиванием
for (int i=0;i<6;i++) //цикл с определением переменной
{ //раскрываем цикл
ost=n%dec;// производим деление с остатком переменных и присваивание переменной ost
n-=ost;// отделение остатка от n с присваиванием
n/=dec; //деление с присваиванием n для определения целого значения
if(i<3)x+=n;// проверка i для суммированиия первых трез цифр
else y+=n;// суммирование последних трех цифр

n=ost; // присваиванивание меняем значение n для новой обработки циклом
dec/=10; //меняем значение dec для цикла
} //закрываем цикл

if(x==0||y==0)// логическая проверка
cout<<"\nсерия или номер не могут быть равны нулю, некоректный ввод (x_x)!!!";//вывод ошибки
if(x!=0 && y!=0)// логическая проверка
cout<<"\nx="<<x&& // вывод значения
cout<<"\ny="<<y&& //вывод значения
x==y?cout<<"\nБилет счастливый (O_o) "<<x<<'='<<y:cout<<"\nБилет не счастливый (^_^) "<<x<<"<>"<<y; // вывод
} // закрытие функции


Вопрос заключается в том чтобы отладить его, тоесть вставить проверки

При введении меньшего или большего чем 6 количества символов должна выводится ошибка
При вводе букв или цифр переменная равна 0 так что проверка на ввод букв я думаю не требутся.

вот в принципе и все.
Если что нужно разьяснить из кода пишите.
Буду всем благодарен кто поможет.
Лунёв Виктор вне форума Ответить с цитированием
Старый 05.12.2008, 16:03   #2
werser
Форумчанин
 
Регистрация: 11.06.2007
Сообщений: 233
По умолчанию

Советую сделать так:
Используйте массив из 6 елементов к примеру с названием bil
1..6
За тем введите 6 чисел
(Ввод массива я думаю вам известен)
Потом
Если сумма bil[1]+bil[2]+bil[3] == bil[4]+bil[5]+bil[6]
То принтф что ваш билет счасливый в ином случае "Вам не повезло"


Зачем Вы себе усложняете задачю которая решаетса за 3 мин?
werser вне форума Ответить с цитированием
Старый 05.12.2008, 17:47   #3
Лунёв Виктор
Новичок
Джуниор
 
Регистрация: 05.12.2008
Сообщений: 2
По умолчанию

Спасибо!
Вечером как домой приду попробую код выложу.
Но если все таки кто нибудь заинтересуется буду рад!
Лунёв Виктор вне форума Ответить с цитированием
Старый 22.06.2009, 13:53   #4
Doublefaced
Форумчанин
 
Регистрация: 01.03.2009
Сообщений: 100
По умолчанию

Помогите сделать под Делфи!
Doublefaced вне форума Ответить с цитированием
Старый 18.11.2009, 12:40   #5
_pw
Новичок
Джуниор
 
Регистрация: 18.11.2009
Сообщений: 2
По умолчанию Извиняюсь за некропостерство

Нужна программа подсчета количества счастливых билетов. Чтобы было одним циклом и без ввода данных. Можно и через массив.
Код:
	int num=0,count=0,i, j, k, l, m, n;
	do
	{
		n=num%10;
		m=(num%100)/10;
		l=(num%1000)/100;
		k=(num%10000)/1000;
		j=(num%100000)/10000;
		i=(num%1000000)/100000;
		if((i+j+k)==(l+m+n))
		{
			count++;
		}
		num++;
	}
	while (num < 1000000);
	cout<<"Acount is "<<count<<"\n";
Такой вариант преподаватель не принял, потому что не любит оператор % . Говорит, что слишком долго будет считать. Ему надо какой-то способ, который по идее описан в литературе. Никак не могу найти.
6 вложенных циклов тоже не подходит.
Также прпеод сказал, что хочет видеть ОДИН цикл, за который все считается. Сказал, что в журнале "Квант" это рассказывалось. Алгоритм, в частности. http://ega-math.narod.ru/Quant/Tickets.htm Вот те самые статьи, но я так и не смог это преобразить в код..
Надеюсь на вашу помощь
P.S. Правильный ответ 55251

Последний раз редактировалось _pw; 18.11.2009 в 13:25.
_pw вне форума Ответить с цитированием
Старый 18.11.2009, 13:56   #6
dexterua
Пользователь
 
Регистрация: 16.11.2009
Сообщений: 24
По умолчанию

Есть один вариантик решения без использования %

Код:
int main ()
{
	int count=0;
	for(int i=0;i<14;i++)
		if(i<10)count+=((i+1)*(i+2)/2)*((i+1)*(i+2)/2);
		else count=count+((i+1)*(i+2)/2-3*(i+1-10)*(i+2-10)/2)*((i+1)*(i+2)/2-3*(i+1-10)*(i+2-10)/2);
	count*=2;
	cout<<"Acount is "<<count<<"\n";
	getch();
}
Но вот тут теория посложнее =)

Если такой вариант интересный объясню откуда оно берется. (Суммируется количество счастливых билетов, сумма цифр которых =i)


P.S. правильный ответ 55252 :Р
dexterua вне форума Ответить с цитированием
Старый 14.12.2009, 15:23   #7
_pw
Новичок
Джуниор
 
Регистрация: 18.11.2009
Сообщений: 2
По умолчанию

Цитата:
Сообщение от dexterua Посмотреть сообщение
Есть один вариантик решения без использования %

Код:
int main ()
{
	int count=0;
	for(int i=0;i<14;i++)
		if(i<10)count+=((i+1)*(i+2)/2)*((i+1)*(i+2)/2);
		else count=count+((i+1)*(i+2)/2-3*(i+1-10)*(i+2-10)/2)*((i+1)*(i+2)/2-3*(i+1-10)*(i+2-10)/2);
	count*=2;
	cout<<"Acount is "<<count<<"\n";
	getch();
}
Но вот тут теория посложнее =)

Если такой вариант интересный объясню откуда оно берется. (Суммируется количество счастливых билетов, сумма цифр которых =i)


P.S. правильный ответ 55252 :Р
Так вышло, что мне снова нужна эта задача. Можно немного объяснений? Я этот метод видел где-то, понял, что максимальная сумма 27, от этого и отталкивается всё. А как это реализовать, до меня не дошло..
_pw вне форума Ответить с цитированием
Старый 14.12.2009, 19:02   #8
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Вобщем так - будем считать что у нас массив из 6-ти чисел, тогда

int mas[6];
int s=0;
for(int i=0;i<6;i++)
if (i<3) s+=mas[i]; else s-=mas[i];

if (s==0) cout <<"Lucky"<<endl; else cout <<"UnLucky"<<endl;

КОд проще ваших
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 14.12.2009, 19:35   #9
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

Цитата:
Сообщение от _pw Посмотреть сообщение
Нужна программа подсчета количества счастливых билетов. Чтобы было одним циклом и без ввода данных. Можно и через массив.
Счастливые билеты. (Задача предлагалась на Всесоюзной олимпиаде по программированию 1989 года). Последовательность из 2n цифр (каждая цифра от 0 до 9) называется счастливым билетом, если сумма первых n цифр равна сумме последних n цифр. Найти число счастливых последовательностей данной длины.

Решение. (Сообщено одним из участников олимпиады; к сожалению, не могу указать фамилию, так как работы проверялись зашифрованными.) Рассмотрим более общую задачу: найти число последовательностей, где разница между суммой первых n цифр и суммой последних n цифр равна k (k = -9n,..., 9n). Пусть T(n, k) - число таких последовательностей.
Разобьем множество таких последовательностей на классы в зависимости от разницы между первой и последней цифрами. Если эта разница равна t, то разница между суммами групп из оставшихся n-1 цифр равна k-t. Учитывая, что пар цифр с разностью t бывает 10 - (модуль t), получаем формулу
T(n,k) = сумма по t от -9 до 9 чисел (10-|t|) * T(n-1, k-t).
(Некоторые слагаемые могут отсутствовать, так как k-t может быть
слишком велико.)
Alex_FF вне форума Ответить с цитированием
Старый 14.12.2009, 19:45   #10
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Молодец Алекс, я невнимателньо прочитал, там же без входных данных
А я думал есть билет,и надо проверить его на предмет "счастливости"
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder AleksP C++ Builder 7 11.04.2009 13:06
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51
Excel файл открывается не "до конца" (странички "не показываются" только серое поле) Dorvir Microsoft Office Excel 2 28.03.2008 10:03
"Транспортная задача", "Поиск решения" Perroman Microsoft Office Excel 3 12.12.2007 17:12
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49