Консультация № 168488
29.05.2009, 10:57
0.00 руб.
0 3 2
ПОМОГИТЕ С ДВУМЯ ПРОСТЕЙШИМИ ЗАДАЧАМИ....
*****1*****
Билли Бонс положил в сундук некоторое количество золотых монет. На второй год он вынул из сундука сколько-то монет. Начиная с третьего года, он добавлял столько монет, сколько было в сундуке два года назад.

Требуется написать программу, которая определит, сколько монет было в сундуке в первый и во второй года, если в X-м году там оказалось ровно Y монет.
Входные данные

Входной файл INPUT.TXT содержит натуральные числа X и Y (3 <= X <= 20, 1 <= Y <= 32767).
Выходные данные

В выходной файл OUTPUT.TXT выведите через пробел количество монет в первый и второй года. Гарантируется, что решение задачи всегда существует.
Пример
№ INPUT.TXT OUTPUT.TXT
1 6 25 5 2

Пояснение к примеру
Если в первый год положить 5 монет, а во второй год вынуть 3 монеты, то начиная с первого года в сундуке будет 5, 2, 7, 9, 16, 25, ... монет.


*****2*****
Возьмем четырехзначное число, в котором не все цифры одинаковы, например 6264. Расположим цифры сначала в порядке убывания - 6642; затем, переставив их в обратном порядке, получим 2466. Вычтем последнее число из 6642. На следующем шаге с полученной разностью проделаем тоже самое. Через несколько таких действий получится число, переходящее само в себя и называемое постоянной Капрекара.

Требуется написать программу, которая находит эту постоянную и количество шагов для ее получения из заданного четырехзначного числа.
Входные данные

Входной файл INPUT.TXT содержит одну строку, в которой записано четырехзначное число.
Выходные данные

В выходной файл OUTPUT.TXT записываются: в первой строке постоянная Капрекара, во второй – количество шагов для ее получения.
Пример
№ INPUT.TXT OUTPUT.TXT
1 1234 6174
3

Обсуждение

Неизвестный
29.05.2009, 11:23
общий
А что? Слабо самому олимпиадные задачи решить?
С нашей стороны будет только прилично подождать с ответом один - два дня
Неизвестный
29.05.2009, 12:39
общий
это ответ
Здравствуйте, jahon.

Могу помочь решить 1-ую задачу математически. Оформить программно не могу, т.к. работаю не на этой программе.
Итак решение:
(При решении учитывается что в Х-м году деньги Билли Бонс в сундук уже ложил)
Чтобы узнать сколько денег было положено в первый год в сундук надо M1=(Y-1):X, от полученного результата извлечь целую часть, это и будет ответом сколько в 1-ый год положили денег в сундук. Сколько было в сундуке во второй год лучше узать так: M2=Y-M1*(Y-2)
Неизвестный
29.05.2009, 13:02
общий
это ответ
Здравствуйте, jahon.
1я задача
Код:

#include <fstream>

using namespace std;

int main()
{
ifstream in("INPUT.TXT");
ofstream out("OUTPUT.TXT");
int X,Y;
in>>X>>Y;
int Cx=1,Cy=1,Year=X-2;
while(--Year)
{
int tmp=Cx+Cy;
Cx=Cy;
Cy=tmp;
}
int x,y=0;
do
{
int numerator=Y-y*Cy;
x=numerator/Cx;
if(numerator%Cx)continue;
out<<x<<' '<<y<<endl;
} while (y++<=x);
return 0;
}


2я задача
Код:

#include <fstream>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

class result
{
public:
result(int kaprecar,int steps)
:_kaprecar(kaprecar)
,_steps(steps)
{}
int kaprecar()
{
return _kaprecar;
}
int steps()
{
return _steps;
}
private:
int _kaprecar;
int _steps;
};

result calc(int N)
{
typedef vector<char> dVector;
dVector digits;
int iterCount=0;
while(true)
{
int oldN=N;
int count=4;
while(count-->0)
{
digits.push_back(N%10);
N/=10;
}
sort(digits.begin(),digits.end(),less<int>());
int N1=0,N2=0,mult=1;
for(dVector::const_iterator it=digits.begin();it!=digits.end();++it)
{
N1=N1*10+*it;
N2=*it*mult+N2;
mult*=10;
}
digits.clear();
N=N2-N1;
++iterCount;
if(oldN==N)
{
return result(N,iterCount-1);
}
}
}

int main()
{
int N;
ifstream in("INPUT.TXT");
ofstream out("OUTPUT.TXT");
in>>N;
result r=calc(N);
out<<r.kaprecar()<<endl
<<r.steps()<<endl;
return 0;
}
Форма ответа