Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Задача


Автор: Spaun 9.12.2004, 22:18
Число из N цифр называется числом Армстронга, если сумма цифр, возведенных в N-ю степень, равна самому числу. Написать программу нахождения все чисел Армстронга, состоящих из двух, трех и четырех цифр или вывести сообщение о том, что таких чисел нет.

Вот я ее решил, только мне метод не нравится, уж черезчур в лобовую.
Может кто-нибудь подскажет, каким другим способом ее можно решить?
Код

var i,k,m,l,s,x,n:integer;
begin
s:=0;
x:=0;
n:=0;
{Для двух  чисел}
for i:=1 to 9 do
 for k:=0 to 9 do
   begin
   if sqr(i+k)=i*10+k then
     begin
     writeln ('Это двузначное число',i*10+k);
     s:=s+1;
     end;
   end;
if s=0 then writeln ('Нет такого двузначного числа Армстронга');
writeln;
{Для трех  чисел}
for i:=1 to 9 do
 for k:=0 to 9 do
   for m:=0 to 9 do
     begin
     if sqr(i+k+m)*(i+k+m)=i*100+k*10+m then
begin
writeln ('Это трехзначное число',i*100+k*10+m);
x:=x+1;
end;
     end;
if x=0 then writeln ('Нет такого трехзначного числа Армстронга');
writeln;
{Для четырех чисел}
for i:=1 to 9 do
 for k:=0 to 9 do
   for m:=0 to 9 do
     for l:=0 to 9 do
begin
if sqr(i+k+m+l)*sqr(i+k+m+l)=i*1000+k*100+m*10+l then
writeln ('Это четырех значное число ',i*1000+k*100+m*10+l);
n:=n+1;
end;
if n=0 then writeln ('Нет такого четырехзначного числа Армстронга');
writeln;writeln;
end.

Прошу сильно не бить... smile

Автор: Dimich 10.12.2004, 13:45
А зачем рассматривать варианты из 2,3 и 4 цифр? Может красивше будет написать универсальный вариант? Т.е. передрать в цикле все числа от 10 до 9999, разбирать их на цифры и проводить с ними вычисления?

Автор: Akina 10.12.2004, 14:10
Цитата(Dimich @ 10.12.2004, 14:45)
Может красивше будет написать универсальный вариант?

это правильнее...
Цитата(Dimich @ 10.12.2004, 14:45)
передрать в цикле все числа от 10 до 9999, разбирать их на цифры и проводить с ними вычисления?

это неоптимально.

Напрашивается рекурсия.

На входе - очередное (недо)число, потребное кол-во цифр.

Если кол. цифр в числе менее потребного - организуем цикл от 0 до 9, дописываем к числу цифру, вызываем себя, передавая число, к коему дописАли очередную цифирь.
Если кол. цифр в числе равно нужному - проверяем, является ли оно числом А., при положительном ответе сообщаем об этом.

Типа

Код

Call Armstrong("",4)

Procedure Armstrong(CurNum,Digits)
if length(CurNum)=Digits
then
  проверяем что оно, если да - выводим
else
  for i = 0 to 9
  Call Armstrong(CurNum+Str(i),4)

Автор: Elfin 13.12.2004, 01:03
Spaun
Да мне точно такую же задачу в универе задавали.... Ты случаем не из Челябинска?

Код

program Project2;

{$APPTYPE CONSOLE}

uses
 SysUtils;

var a, b, c, d, n, k: integer;
str: string;

begin
k:=0;
for n:=10 to 9999 do
   begin
   a:=n div 1000;
   b:=(n div 100) mod 10;
   c:=(n mod 100) div 10;
   d:=n mod 10;
   case n of
   10..99: k:=sqr(c)+sqr(d);
   100..999: k:=sqr(b)*b+sqr(c)*c+sqr(d)*d;
   1000..9999: k:=sqr(sqr(a))+sqr(sqr(c))+sqr(sqr(b))+sqr(sqr(d));
   end;
   if n=k then writeln(chr(15),' ',n);
   end;
readln;
 { TODO -oUser -cConsole Main : Insert code here }
end.


Автор: Romtek 7.1.2005, 12:52
Тут решение покрасивее:
http://forum.sources.ru/index.php?showtopic=53804&hl=%C0%F0%EC%F1%F2%F0%EE%ED%E3

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)