iİnformatikanın məktəbdə tədrisi

2-21r

Найти все 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 раз), однако останется все таки большим (несколько минут). Дальнейшее уменьшение времени возможно специальным методом подсчета суммы.

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;

}