Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача, Посмотрите ... 
:(
    Опции темы
Spaun
  Дата 9.12.2004, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.12.2004

Репутация: нет
Всего: нет



Число из 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
PM MAIL   Вверх
Dimich
Дата 10.12.2004, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: нет
Всего: 7



А зачем рассматривать варианты из 2,3 и 4 цифр? Может красивше будет написать универсальный вариант? Т.е. передрать в цикле все числа от 10 до 9999, разбирать их на цифры и проводить с ними вычисления?
--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
Akina
Дата 10.12.2004, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Цитата(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)



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Elfin
Дата 13.12.2004, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 28.10.2004

Репутация: нет
Всего: нет



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.


PM MAIL   Вверх
Romtek
Дата 7.1.2005, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 7.12.2004
Где: Холон

Репутация: нет
Всего: 4



Тут решение покрасивее:
Числа Армстронга
--------------------
Romiras HomeLab - материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и пр.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0919 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.