1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Program
A2_21a; Var k,n1,n,i,j,s,q,p:integer; BEGIN readln(k); n1:=10; for i:=1 to k-2 do n1:=n1*10;
for i:=n1 to n1*10 -1 do begin n:=i; s:=0; while (n<>0) do begin q:=n mod 10; p:=q; for j:=1 to k-1 do p:=p*q; s:=s+p; if (s>i) then break; n:=n div 10; end; if (s=i) then writeln(i); end; readln; END. |
//Program
A2.21a; #include
<iostream>
using
namespace std;
int
main() { int k,n1,n,i,j,s,q,p; cin>>k; n1=10; for(i=1;i<k-1;i++) n1*=10; for(i=n1;i<n1*10;i++) { n=i; s=0; while (n) { q=p=n%10; for(j=1;j<k;j++) p*=q; s+=p; if(s>i) break; n/=10; } if(s==i)cout<<i<<endl; } return 0; } |
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 |
Program
A2_21b; Var k,n1,n,i,j,s,q,p:integer; c:array[0..9] of integer; BEGIN readln(k); c[0]:=0; c[1]:=1; for
i:=2 to 9 do begin p:=i; for j:=1 to k-1 do p:=p*i; c[i]:=p; end; n1:=10; for i:=1 to k-2 do n1:=n1*10; for i:=n1 to n1*10 - 1
do begin n:=i; s:=0; while (n<>0) do begin s:=s+c[n mod 10]; if (s>i) then break; n:=n div 10; end; if (s=i) then writeln(i); end; readln; END. |
//Program
A2.21b; #include
<iostream>
using
namespace std;
int main() { int k,n1,n,i,j,s,q,p; int c[10]={0,1}; cin>>k; n1=10; for(i=1;i<k-1;i++) n1*=10; for(i=2;i<10;i++) {
p=i; for(j=1;j<k;j++) p*=i; c[i]=p; } for(i=n1;i<n1*10;i++) { n=i; s=0; while (n) { s+=c[n%10]; if(s>i) break; n/=10; } if(s==i)cout<<i<<endl; } return 0; } |
Найти все k-значные числа Армстронга (2<k<10).
К-значное число является числом Армстронга, если сумма к-ых степеней его цифр равна самому числу.
Например, 153=1^3 + 5^3 + 3^3, 8208=8^4 + 2^4 +8^4 являются числами Армстронга. Если k=3, то диапазон проверки чисел 100 – 999, если k=4, то 1000 – 9999.
В программе A2_21a в строке 7 нижняя граница чисел n1=10^(k-1). В цикле (строки 9 – 21) перебираются все к-значные числа и для каждого числа находится суммак-ых степеней его цифр – строка 15. Если эта сумма равна исходному числу (строка 20) число выводится на экран. Если в процессе вычисления суммы, она становится больше проверяемого числа, то дальше это число не проверяется (строка 17). Этим мы чуть-чуть уменьшаем общее время вычисления. Однако при к=8 и, особенно, при к=9, время вычисления достаточно большое (до десятка минут). Чтобы уменьшить время вычисления, к-ые степени цифр от 0 до 9 можно подсчитать заранее и сохранить их.
В программе A2_21b степени всех цифр подсчитывается заранее и сохраняются в массиве с (строки 7 -13). В строке 21 эти значения используются при вычислении суммы к-ых степеней цифр числа. Время вычисления при к=9 уменьшится (примерно в 4-5 раз), однако останется все таки большим (несколько минут). Дальнейшее уменьшение времени возможно специальным методом подсчета суммы.