阿姆斯特朗的数字。打印阿姆斯特朗号码

时间:2017-08-20 07:25:54

标签: c++ pow

我请求那些认为这个问题早先被问过的人,请先阅读。

我需要打印1到10000之间的所有阿姆斯特朗号。我的问题是,无论何时我的程序运行并达到150,它都会

(1^3) + ((5^3)-1) + (0^3)

而不是

(1^3) + (5^3) + (0^3).

因此它不打印153(这是一个阿姆斯特朗号),当然因为总和结果是152.我不知道其他一些数字是否也在这样做。但我确实检查过直到200,其他数字没有问题,除了在150-160范围内。

这是编译错误吗?我应该重新安装我的编译器吗?目前我正在使用代码块。

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    for(int i = 0;i <= 10000;++i)
    {
        int r = i;
        int dig = 0;
        while(r != 0)
        {
            dig++;
            r /= 10;
        }
        int n = i, sum = 0;
        while(n != 0)
        {
            int d = n % 10;
            sum += pow(d, dig);
            n /= 10;
        }
        if(sum == i)
            cout << i << ' ';
    }
    cout << "\n\n\n";
    return 0;
}

3 个答案:

答案 0 :(得分:0)

您应该在调试器中运行代码。此外,您的代码无法为我编译(GCC 6),因为您使用的cout没有std::using namespace std;。那么它如何在您的系统上编译?您还使用math.h,在C ++中,您应该使用cmath

修复此问题后,我在版本6.4.1中使用g++在Fedora 24上获得以下输出:

0 1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474

153包含在那里,因此编译器有错误或程序有未定义的行为,因此出现错误。

我查看了definition for Armstrong numbers并做了一个非常简短的Python实现:

# Copyright © 2017 Martin Ueding <dev@martin-ueding.de>
# Licensed under the MIT/Expat license.

def is_armstrong(number):
    digits = [int(letter) for letter in str(number)]
    score = sum(digit**len(digits) for digit in digits)
    return score == number

armstrong = list(filter(is_armstrong, range(10000)))
print(' '.join(map(str, armstrong)))

输出与我的机器上的C ++程序完全匹配:

0 1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474

查看代码我无法发现未定义的行为,看起来很明智。首先计算数字位数,然后计算总和。也许您应该尝试使用其他编译器,如GCC,LLVM或Ideone。代码块是自带编译器还是使用系统编译器?你在运行什么操作系统?

你说你刚学会编程。听到这个很酷!我希望你有一个good C++ book或其他资源。对于C ++,互联网上有很多不好的建议。还要确保你有一本至少有C ++ 11的书,其他一切都已经过时了。

我已经改变了你的程序并创建了一些只执行一项任务的简短函数,以便更容易阅读和推理。我不确定你是否已经了解功能,所以不要担心,如果现在看起来很复杂: - )。

#include <cmath>
#include <iostream>

int get_digit_count(int const number) {
    int digits = 0;
    int remainder = number;

    while (remainder > 0) {
        ++digits;
        remainder /= 10;
    }

    return digits;
}

bool is_armstrong_number(int const number) {
    int const digit_count = get_digit_count(number);
    int remainder = number;
    int sum = 0;

    while (remainder > 0) {
        int const last_digit = remainder % 10;
        sum += std::pow(last_digit, digit_count);
        remainder /= 10;
    }

    return number == sum;
}

int main() {
    for (int i = 0; i <= 10000; ++i) {
        if (is_armstrong_number(i)) {
            std::cout << i << ' ';
        }
    }
    std::cout << std::endl;
}

答案 1 :(得分:0)

This algorithm generates and prints out Armstrong numbers to 999, but can easily be expanded to any length using the same methodology.

n = 1;   %initialize n, the global loop counter, to 1

for i = 1 : 10   %start i loop

    for j = 1 : 10   %start j loop

        for k = 1 : 10   %start k loop

            rightnum = mod(n, 10);   %isolate rightmost digit

            midnum = mod(fix((n/10)), 10);   %isolate middle digit 

            leftnum = fix(n/100);   %isolate leftmost digit    

        if ((n < 10))   %calulate an for single-digit n's   
            an = rightnum;     
              end

        if ((n > 9) & (n < 100))   %calculate an for 2-digit n's
            an = fix(rightnum^2 + midnum^2);         
              end

        if ((n  > 99) & (n < 1000))   %calculate an for 3-digit n's
            an = fix(leftnum^3 + midnum^3 + rightnum^3);     
              end

            if (n == an)   %if n = an display n and an
                armstrongmatrix = [n an];
                disp(armstrongmatrix);
            end

        n = n + 1;   %increment the global loop counter and continue

        end
    end

end

答案 2 :(得分:0)

您可以使用数组:

#include<iostream>
using namespace std;
int pow(int, int);
int checkArm(int);
int main() {
    int range;
    cout<<"Enter the limit: ";
    cin>>range;
    for(int i{};i<=range;i++){
        if(checkArm(i))
            cout<<i<<endl;
    }
    return 0;
}
int pow(int base, int exp){
    int i{0};
    int temp{base};
    if(exp!=0)
        for(i;i<exp-1;i++)
            base = base * temp;
    else
        base=1;
    return base;
}
int checkArm(int num) {
    int ar[10], ctr{0};
    int tempDigits{num};
    while(tempDigits>0){
        tempDigits/=10;
        ctr++;
    }
    int tempArr{num}, tempCtr{ctr};
    for(int i{0};i<=ctr;i++){
        ar[i] = tempArr / pow(10,tempCtr-1);
        tempArr = tempArr % pow(10,tempCtr-1);
        tempCtr--;
    }
    int sum{};
    for(int k{};k<ctr;k++){
        sum+=pow(ar[k],ctr);
    }
    if(sum==num)
        return 1;
    else
        return 0;
}