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

Числа Армстронга...Немогу решить - C++

Восстановить пароль Регистрация
 
TYMON
9 / 9 / 1
Регистрация: 17.06.2010
Сообщений: 344
20.06.2010, 15:18     Числа Армстронга...Немогу решить #1
Помогите, если не сложно...Натуральное число, в записи которого n цифр, называется числом Армстронга, если сумма его цифр, возведенная в степень n, равна самому числу. Найти все чис-ла Армстронга от 1 до к
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2010, 15:18     Числа Армстронга...Немогу решить
Посмотрите здесь:

C++ Немогу решить
Числа Армстронга. Алгоритм. C++
C++ Числа армстронга
числа Армстронга C++
Числа Армстронга C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alik-Soldier
9 / 9 / 0
Регистрация: 01.05.2009
Сообщений: 127
20.06.2010, 16:24     Числа Армстронга...Немогу решить #2
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
#include "stdafx.h"
#include <iostream>
#include <math.h>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    int a = 0, n = 0, sum = 0, control;
    cout<<"Input a number\n";
    cin>>a;
    for(int i=1;i<=a;i++)
    {
        control = i;
        while(control > 0)
        {
            sum += control%10;
            control /= 10;
            n++;
        }
        if((int)pow(double(sum),n) == i)
            cout<<"Number "<< i << " is the number of Armstrong\n";
        n = 0;
        sum = 0;
    }
    return 0;
}
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
20.06.2010, 16:47     Числа Армстронга...Немогу решить #3
ой помню давно баловался с той задачкой, эксперементировал все)

вообщем вот исходник

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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
unsigned long long NumberToPower(unsigned long long number, unsigned short power);
int Power(long long double in_number);
 
int main()
{
    long long double in_number=0;
    long long double out_number=0;
    unsigned long long next_symb=0;
    long long double sum=0;
 
    cin>>in_number;
    cout<<"Posledovatelnost chisel Armstronga::"<< endl<< endl;
    out_number=in_number;
 
    while (in_number>=0)
    {
       while (out_number>0)
       {
          next_symb=out_number%10;
          out_number=out_number/10;
          sum=sum+NumberToPower(next_symb,Power(in_number));
       }
 
       if (sum==in_number)
       cout<< in_number<< " "<< endl;
       in_number--;
       out_number=in_number;
       sum=0;
    }
    cout<< endl<< "complete";
    getch();
    return 0;
}
 
unsigned long long NumberToPower(unsigned long long number, unsigned short power)
{
    if (power == 1)
    return number;
    if (power == 0)
    return 1;
    return (number*NumberToPower(number,power-1));
}
 
int Power(long long double in_number)
{
    if (in_number<10)
    return 1;
    if ((in_number>9) and (in_number<100))
    return 2;
    if ((in_number>99) and (in_number<1000))
    return 3;
    if ((in_number>999) and (in_number<10000))
    return 4;
    if ((in_number>9999) and (in_number<100000))
    return 5;
    if ((in_number>99999) and (in_number<1000000))
    return 6;
    if ((in_number>999999) and (in_number<10000000))
    return 7;
    if ((in_number>9999999) and (in_number<100000000))
    return 8;
    if ((in_number>99999999) and (in_number<1000000000))
    return 9;
    if ((in_number>999999999) and (in_number<=(sizeof(unsigned int))))
    return 10;
}
можно конечно и по простому, без этой таблички
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
nt Power(long long double in_number)
{
    if (in_number<10)
    return 1;
    if ((in_number>9) and (in_number<100))
    return 2;
    if ((in_number>99) and (in_number<1000))
    return 3;
    if ((in_number>999) and (in_number<10000))
    return 4;
    if ((in_number>9999) and (in_number<100000))
    return 5;
    if ((in_number>99999) and (in_number<1000000))
    return 6;
    if ((in_number>999999) and (in_number<10000000))
    return 7;
    if ((in_number>9999999) and (in_number<100000000))
    return 8;
    if ((in_number>99999999) and (in_number<1000000000))
    return 9;
    if ((in_number>999999999) and (in_number<=(sizeof(unsigned int))))
    return 10;
}
но вычисления раз в 10 долже будут
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,687
20.06.2010, 18:29     Числа Армстронга...Немогу решить #4
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
//Натуральное число, в записи которого n цифр, называется числом Армстронга, 
//если сумма его цифр, возведенных в степень n, равна самому числу. 
//Найти все чис-ла Армстронга от 1 до к.
#include <cmath>
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <sstream>
#include <string>
 
typedef std::string       T_str;
typedef std::vector<int>  T_nums;
 
struct T_plus_dig_pow
{
    int stepen_;    
    T_plus_dig_pow(int stepen) : stepen_(stepen)
    {}
    int operator() (int sum, char char_dig)
    {
        return  sum += static_cast<int>(pow(static_cast<double>(char_dig - '0'), stepen_));        
    }
};
 
bool is_not_armstrong_num(int n)
{
    std::ostringstream  dig_str_potok;
    dig_str_potok << n;
    T_str  dig_str(dig_str_potok.str());
    return n != std::accumulate(dig_str.begin(), dig_str.end(), 
                                0, T_plus_dig_pow(dig_str.size()));
}
 
struct T_generate_podrjad
{
    int begin_num_;
    T_generate_podrjad(int  begin_num) : begin_num_(begin_num)
    {}
 
    int operator() ()
    {
        return begin_num_++;
    }
};
 
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите k: ";
    int k;
    std::cin >> k;
    const int  start_num = 0;
    std::cout << "Числа Армстронга в диапазоне от "
              << start_num
              << " до "
              << k
              << ": "
              << std::endl;
    T_nums  nums(k - start_num + 1);
    std::generate(nums.begin(), nums.end(), T_generate_podrjad(start_num));
    std::remove_copy_if(nums.begin(), nums.end(), 
                        std::ostream_iterator<int>(std::cout, "\n"), is_not_armstrong_num);
    return 0;
}
Alik-Soldier
9 / 9 / 0
Регистрация: 01.05.2009
Сообщений: 127
20.06.2010, 19:52     Числа Армстронга...Немогу решить #5
не так задание понял...вот так правильнее...
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
#include "stdafx.h"
#include <iostream>
#include "math.h"
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    int a = 0, n = 0, sum = 0, control;
    cout<<"Input a number\n";
    cin>>a;
    for(int i=1;i<=a;i++)
    {
        control = i;
        while(control > 0)
        {
            control /= 10;
            n++;
        }
        control = i;
        while(control > 0)
        {
            sum += int(pow(double(control%10),n));
            control /= 10;
        }
        if(sum == i)
            cout<<"Number "<< i << " is the number of Armstrong\n";
        n = 0;
        sum = 0;
    }
    return 0;
}
TYMON
9 / 9 / 1
Регистрация: 17.06.2010
Сообщений: 344
20.06.2010, 22:23  [ТС]     Числа Армстронга...Немогу решить #6
Всем спасибо)) Получилось...)
Yandex
Объявления
20.06.2010, 22:23     Числа Армстронга...Немогу решить
Ответ Создать тему
Опции темы

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