Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
krasotka93
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 29
1

Получить все числа Армстронга

06.03.2014, 19:05. Просмотров 1607. Ответов 11
Метки нет (Все метки)

Натуральное число из n цифр является числом Армстронга, если сумма его цифр, возведенных в n-ю степень, равна самому числу (например, 153=13+53+33). Получить все числа Армстронга, состоящие из двух, трех и четырех цифр. gj;fkeqcnf
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2014, 19:05
Ответы с готовыми решениями:

Получить числа Армстронга
Натуральное число с n цифр является числом Армстронга, если сумма его цифр,...

Числа Армстронга. Алгоритм находит не все числа
Написал алгоритм поиска чисел Армстронга. Однако столкнулся со странной (на...

Не выводятся все числа Армстронга
Нужно вывести 4-хзначные числа Армстронга. Одно дает, другое не правильное....

Найти все числа Армстронга от 1 до к
1)Определить, делителем каких чисел а, в, с является число к. 2)Составить...

Найти все числа Армстронга от 1 до K
2)натуральное число, в записи которого n цифр, называется числом Армстронга, а...

11
andreyfreelans
410 / 60 / 28
Регистрация: 21.02.2011
Сообщений: 2,301
06.03.2014, 22:19 2
krasotka93,
C++
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
#include <stdio.h> // Подключаем
#include <conio.h> // модули
 
int main()
{
 int x, y, z, n, a, st1, st2, st3;  // Переменные
 
  for (x=1; x<10; x++) // Три вложенных цикла для трехзначного числа
   {         
    for (y=0; y<10; y++) 
     {                         
      for (z=0; z<10; z++) 
       {
        for (n=1; n<10; n++)
         {
           int n1;
           a=100*x+10*y+z; // Целое число сложенное из составных цифр
           st1=1; st2=1; st3=1;
            for (n1=1; n1<=n; n1++)
             { st1=st1*y; st2=st2*z; st3=st3*x; } // Возводим все цифры в степень             
           if (a == st1+st2+st3) // Если сумма степенй равна числу, то...
            { printf ("\n %d", a); } // выводим это число на экран
         }          
       }
     }
   }
 getch(); // Ожидать нажатия любой клавиши
 return 0; // Вернуть 0 функции int main()  
}
0
Байт
Эксперт C
18318 / 12029 / 2506
Регистрация: 24.12.2010
Сообщений: 24,293
06.03.2014, 22:36 3
Вот еще вариант
C++
1
2
3
4
5
6
7
8
9
10
11
for(i=10; i<10000;i++) {
  if (i<100) n = 2;
  else if (i<1000) n=3;
  else n = 4;
  t = i;
  for(s, j =0; j<4; j++, t/=10) {
    c = t%10;
    s +=  c*c*c;
  }
  if (s==i) printf("%d\n", i);
}
Добавлено через 3 минуты
Ошибся. Строка 8 должна выглядеть по другому. Вместо s+=c*c*c; надо
C++
1
2
for(p=1, k=0; k<n; k++) p*=c;
s+=p;
0
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,676
06.03.2014, 23:01 4
Цитата Сообщение от Байт Посмотреть сообщение
if (i<100) n = 2;
Цитата Сообщение от Байт Посмотреть сообщение
for(p=1, k=0; k<n; k++) p*=c;
я конечно понимаю что ты в математике больше чем я сечешь, но почему степень от разрядности зависит?
это так "опыт сын ошибок трудных" или есть какое то доказательство
причем я "нутром чую " что может быть и так но объяснить не смогу
посему
я бы сделал так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int buftmp[4]={0};
int bufPow[4]={0}
for(int i=10;i<10000;i++)
{
 int tmp=i;
 int k;
  for(k=0;tmp;k++,tmp/=10)
     bufPow[k]= buftmp[k]=tmp%10;
 for(;k<4;k++)
     bufPow[k]=buftmp[k]=0; 
while((bufPow[0]+bufPow[1]+bufPow[2]+bufPow[3])<=i)
 {
  if((bufPow[0]+bufPow[1]+bufPow[2]+bufPow[3])==i)
      printf("%d\n", i);
  for(int m=0;m<4;m++)
     bufPow[m]*=buftmp[m];
  }
}
0
krasotka93
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 29
06.03.2014, 23:07  [ТС] 5
блин и как правильно(((
0
Байт
Эксперт C
18318 / 12029 / 2506
Регистрация: 24.12.2010
Сообщений: 24,293
06.03.2014, 23:11 6
Тьфу! Еще одна ошибка (моя).Т.е. все должно работать, но не логично как-то. Вот исправленный код
C++
1
2
3
4
5
6
7
8
9
10
11
12
for(i=10; i<10000;i++) {
  if (i<100) n = 2;
  else if (i<1000) n=3;
  else n = 4;
  t = i;
  for(s=0, j =0; j<n; j++, t/=10) { // Было j <4
    c = t%10;
    for(p=1, k=0; k<n;k++) p *=  c;
    s += p;
  }
  if (s==i) printf("%d\n", i);
}
Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
но почему степень от разрядности зависит?
по определению.
Цитата Сообщение от krasotka93 Посмотреть сообщение
число из n цифр является числом Армстронга, если сумма его цифр, возведенных в n-ю степень,
0
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,676
06.03.2014, 23:12 7
стоп! я не совсем врубился
степень зависит от разрядности?
т.е если три цифры то их нужно возводить в третью степень?
не вторая не четвертая уже не подойдут?
0
krasotka93
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 29
06.03.2014, 23:34  [ТС] 8
извините, но можно правильный скинуть пожалуйста, и заранее спасибо!
0
Байт
Эксперт C
18318 / 12029 / 2506
Регистрация: 24.12.2010
Сообщений: 24,293
07.03.2014, 00:20 9
Цитата Сообщение от ValeryS Посмотреть сообщение
не вторая не четвертая уже не подойдут?
По определению так. Но это не мешает вам придумать свои числа, скажем, "Валерьяновские", и числа Армстронга (сильноруково) будут их подмножеством
1
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,676
07.03.2014, 00:33 10
Цитата Сообщение от Байт Посмотреть сообщение
По определению так.
ну тогда я свое решение снимаю
я все степени перебирал начиная с первой
Цитата Сообщение от Байт Посмотреть сообщение
Но это не мешает вам придумать свои числа, скажем, "Валерьяновские"
вот я их и придумал
Цитата Сообщение от krasotka93 Посмотреть сообщение
извините, но можно правильный скинуть пожалуйста, и заранее спасибо!
тебе предложили несколько вариантов
неужели трудно выбрать?
0
andreyfreelans
410 / 60 / 28
Регистрация: 21.02.2011
Сообщений: 2,301
07.03.2014, 11:31 11
krasotka93, я вам написал рабочий код. остальные вам предлогают решить вашу задачу иными способами, я их лично не проверял, может их варианты тоже верные.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26106 / 17505 / 6944
Регистрация: 22.10.2011
Сообщений: 30,841
Записей в блоге: 6
07.03.2014, 15:36 12
Вариант "Сорвать башню преподавателю" - метапрограммирование во всей красе:
C++
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
 
template <int V, int P>
struct Power
{
    enum {result = V * Power<V, P - 1>::result};
};
template <int V>
struct Power<V, 0>
{
    enum {result = 1};
};
 
template <int N, int D>
struct Sum
{
    enum { value = Power<N % 10, D>::result + Sum<N / 10, D>::value };
};
template <int D>
struct Sum<0, D>
{
    enum {value = 0};
};
 
 
template <int n>
struct THEN
{
    static void func()
    {
        std::cout << n << std::endl;
    }
};
struct ELSE
{
    static void func() {}
};
 
 
template <bool Condition, class Then, class Else>
struct IF
{
    typedef Then RESULT;
};
template <class Then, class Else>
struct IF <false, Then, Else>
{
    typedef Else RESULT;
};
 
template <int N>
struct Digits
{
    enum {value = (N > 9 ? 1 : 0) + Digits<N / 10>::value};
};
template <>
struct Digits<0>
{
    enum {value = 1};
};
 
 
template <int From, int To>
class Loop
{
public:
    static inline void exec()
    {
        IF< Sum<From, Digits<From>::value>::value == From, THEN<From>, ELSE >::RESULT::func();
        Loop<(From > To ? 0 : From + 1), To>::exec();
    }
};
template <int To>
class Loop<0, To>
{
public:
    static inline void exec()
    {
    }
};
 
int main()
{
    Loop<10, 9999>::exec();
    return 0;
}
(для успешной компиляции добавил ключ -ftemplate-depth=10000, иначе компилироваться не будет, слишком большой уровень вложенности шаблонов. Но работает, выдает все 7 чисел Армстронга на заданном интервале)
0
07.03.2014, 15:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2014, 15:36

Вывести все числа Армстронга в заданном интервале
Здравствуйте, В универе дали задание: вывести все числа Армстронга в...

Найти все числа Армстронга, состоящие из 2, 3 или 4 цифр
Натуральное число, состоящее из n цифр является числом Армстронга, если сумма...

Найти все n-значные числа Армстронга для данного n<9
Натуральное n-значное число называется числом Армстронга, если оно равно сумме...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru