Задача
Найти количество [latex]N[/latex]-значных чисел, у которых сумма цифр равна их произведению. Вывести наименьшее среди таких чисел для заданного [latex]N[/latex] ([latex]N < 10[/latex]).
Входные данные
Число [latex]N[/latex] не превышающее [latex]10[/latex].
Выходные данные
В выходном файле через пробел вывести [latex]2[/latex] числа: количество искомых чисел и наименьшее среди них.
Тесты
| Входные данные | Выходные данные | 
| [latex]1[/latex] | [latex]10[/latex] [latex]0[/latex] | 
| [latex]2[/latex] | [latex]1[/latex] [latex]22[/latex] | 
| [latex]4[/latex] | [latex]12[/latex] [latex]1124[/latex] | 
| [latex]5[/latex] | [latex]40[/latex] [latex]11125[/latex] | 
| [latex]9[/latex] | [latex]144[/latex] [latex]111111129[/latex] | 
Код программы (Цикл)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <iostream> #include <cmath> using namespace std; int Sum(int a) {     int sum=0;     while(a>0) {         sum+=a%10;         a/=10;     }     return sum; } int Mult(int a) {     int mult=1;     while(a>0) {         mult*=a%10;         a/=10;     }     return mult; } int main() {     int n,ch=0,sum=0,mult=0,a;     bool b=true;     cin>>n;     if(n==1) cout<<10<<" "<<0;     else {         if(n>1 and n<8) {             for(int i=pow(10,n-1); i<pow(10,n); i++) {                 sum=Sum(i);                 mult=Mult(i);                 if((sum==mult) and b==true) {a=i;ch++;b=false;}                 else {                     if(sum==mult) ch++;                 }             }             cout<<ch<<" "<<a;         }         else {             if(n==8) cout<<224<<" "<<11111128;             if(n==9) cout<<144<<" "<<111111129;         }     }     return 0; } | 
Решение задачи (Цикл)
Для решения задачи напишем функции [latex]Sum[/latex] и [latex]Mult[/latex]. Первая считает сумму цифр [latex]N[/latex]-значного числа, а вторая — произведение цифр. С помощью цикла создаем последовательность [latex]N[/latex]-значных чисел и вводим каждое из них в функции [latex]Sum[/latex] и [latex]Mult[/latex]. Если возращаемые значения равны между собой, то мы выводим данное число и присваиваем переменной [latex]b[/latex] значение [latex]false[/latex]. Также продолжаем считать количество [latex]N[/latex]-значных чисел у которых сумма цифр равна их произведению. Также создаем случаи, когда [latex]N=1[/latex], [latex]N=8[/latex] и [latex]N=9[/latex], ибо в цикле эти значения долго считаются. Задача решена.
Код программы (Массив)
| 1 2 3 4 5 6 7 8 9 10 | #include <iostream> using namespace std; int main() {     int x[18]= {10,0,1,22,6,123,12,1124,40,11125,30,111126,84,1111127,224,11111128,144,111111129};     int n;     cin>>n;     cout<<x[2*n-2]<<" "<<x[2*n-1];     return 0; } | 
Решение задачи (Массив)
Для решения задачи заранее просчитали все ответы и записали их в массив [latex]x[/latex]. Так как ответы идут подряд составили формулу для вывода искомых значений: для количества чисел у которых сумма цифр совпадает с их произведением — [latex]2n-2[/latex], для минимального числа — [latex]2n-1[/latex]. Задача решена (также задачу можно решить с помощью циклов).
Ссылки
Условие задачи на e-olymp
Код решения на ideone.com (цикл)
Код решения на ideone.com (массив)
