我请求那些认为这个问题早先被问过的人,请先阅读。
我需要打印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;
}
答案 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;
}