Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
krasotka93
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 29
06.03.2014, 19:05     Получить все числа Армстронга #1
Натуральное число из n цифр является числом Армстронга, если сумма его цифр, возведенных в n-ю степень, равна самому числу (например, 153=13+53+33). Получить все числа Армстронга, состоящие из двух, трех и четырех цифр. gj;fkeqcnf
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dogg12
 Аватар для dogg12
57 / 23 / 5
Регистрация: 21.02.2011
Сообщений: 506
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()  
}
Байт
 Аватар для Байт
13989 / 8820 / 1231
Регистрация: 24.12.2010
Сообщений: 15,976
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;
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,056
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];
  }
}
krasotka93
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 29
06.03.2014, 23:07  [ТС]     Получить все числа Армстронга #5
блин и как правильно(((
Байт
 Аватар для Байт
13989 / 8820 / 1231
Регистрация: 24.12.2010
Сообщений: 15,976
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-ю степень,
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,056
06.03.2014, 23:12     Получить все числа Армстронга #7
стоп! я не совсем врубился
степень зависит от разрядности?
т.е если три цифры то их нужно возводить в третью степень?
не вторая не четвертая уже не подойдут?
krasotka93
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 29
06.03.2014, 23:34  [ТС]     Получить все числа Армстронга #8
извините, но можно правильный скинуть пожалуйста, и заранее спасибо!
Байт
 Аватар для Байт
13989 / 8820 / 1231
Регистрация: 24.12.2010
Сообщений: 15,976
07.03.2014, 00:20     Получить все числа Армстронга #9
Цитата Сообщение от ValeryS Посмотреть сообщение
не вторая не четвертая уже не подойдут?
По определению так. Но это не мешает вам придумать свои числа, скажем, "Валерьяновские", и числа Армстронга (сильноруково) будут их подмножеством
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,056
07.03.2014, 00:33     Получить все числа Армстронга #10
Цитата Сообщение от Байт Посмотреть сообщение
По определению так.
ну тогда я свое решение снимаю
я все степени перебирал начиная с первой
Цитата Сообщение от Байт Посмотреть сообщение
Но это не мешает вам придумать свои числа, скажем, "Валерьяновские"
вот я их и придумал
Цитата Сообщение от krasotka93 Посмотреть сообщение
извините, но можно правильный скинуть пожалуйста, и заранее спасибо!
тебе предложили несколько вариантов
неужели трудно выбрать?
dogg12
 Аватар для dogg12
57 / 23 / 5
Регистрация: 21.02.2011
Сообщений: 506
07.03.2014, 11:31     Получить все числа Армстронга #11
krasotka93, я вам написал рабочий код. остальные вам предлогают решить вашу задачу иными способами, я их лично не проверял, может их варианты тоже верные.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2014, 15:36     Получить все числа Армстронга
Еще ссылки по теме:

Вывести все числа Армстронга в заданном интервале C++
C++ Найти все числа Армстронга, состоящие из 2, 3 или 4 цифр
C++ Не выводятся все числа Армстронга

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

Или воспользуйтесь поиском по форуму:
volvo
Супер-модератор
 Аватар для volvo
21823 / 14186 / 3953
Регистрация: 22.10.2011
Сообщений: 25,065
Записей в блоге: 2
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 чисел Армстронга на заданном интервале)
Yandex
Объявления
07.03.2014, 15:36     Получить все числа Армстронга
Ответ Создать тему
Опции темы

Текущее время: 12:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru