c - 在阿姆斯壮数中没有得到想要的输出
问题描述
它是一个在所需范围之间查找 armstrong 数的程序假设我想在 100 到 1000 范围之间找到 amstrong 然后它显示输出为 370 371 407 但不是 153 找不到问题所在
#include<stdio.h>
#include<math.h>
int main()
{
int num,start,end,n,rem,res;
printf("Enter the range :");
scanf("%d %d",&start,&end);
printf("Amstrong number between %d and %d are : ",start,end);
for(int i=start;i<=end;i++)
{
//int i=153;
num=i;
n=0;
while(num)
{
num/=10;
++n;
}
num=i;
res=0;
while(num)
{
rem=num%10;
res=res+pow(rem,n);
num/=10;
}
if(res==i)
printf("%d\t",i);
}
return 0;
}
解决方案
用户 KamilCuk 似乎有正确的想法。
请原谅使用 c++ 而不是 c,但是,您的意外输出(或在这种情况下缺少输出)的原因基本相同。
我已经测试了它的具体值 407 而不是 153,因为这是对我来说不能正常工作的 armstrong 数字(尽管这可能会有所不同)。
void checkArm()
{
cout << "Armstrong numbers in range are:" << endl;
for (int i = 407; i <= 407; i++)
{ //isolate digits
int digHun, digTen, digOne;
digHun = i / 100;
digTen = i / 10 - 10 * digHun;
digOne = i % 10;
cout << "Test 1: " << i << endl;
// the pow function itself provides expected output on terminal
cout << pow(digHun, 3) << endl;
cout << pow(digTen, 3) << endl;
cout << pow(digOne, 3) << endl;
//here's the problem!
cout << "bool check supplied: " << ((pow(digHun, 3) + pow(digTen, 3) + pow(digOne, 3)) == i) << endl;
cout << "bool check 407: " << ((pow(digHun, 3) + pow(digTen, 3) + pow(digOne, 3)) == 407) << endl;
cout << "bool check typecasted: " << (int(pow(digHun, 3) + pow(digTen, 3) + pow(digOne, 3)) == i) << endl;
//part that was supposed to print 407 if it weren't for problem described above
if ((pow(digHun, 3) + pow(digTen, 3) + pow(digOne, 3)) == i)
{
cout << "Main test" << i << endl;
}
}
}
我的编译器的输出是:
bool check supplied: 0
bool check 407: 0
bool check typecasted: 1
请注意,仅当我们的表达式在比较之前被强制转换为 int 类型时,条件才成立。只需将此表达式转换为 int 类型即可完成工作。
本质上,对于这两个程序,问题都与 pow 函数有关。尽管 c 和 cpp 之间存在差异,但 pow() 会为两者返回一个双精度值。此外,传递给 pow() 的参数在执行之前被隐式类型转换为 double。
(举个例子,您的编译器将 153 转换为 153.00000etc,然后将其与 153.00023etc 进行比较,它是 pow() 函数的输出。在双重比较的情况下,这些结果并不相等。实际上,您可以使用 setprecision() 函数来验证这一点。这将产生编译器在比较期间看到的内容)
您可以在此处验证 pow() 确实返回了一个双精度值。
我希望这能从概念的角度澄清这个问题(即使语言不同)。
推荐阅读
- swift - 如何向 Firebase 数组添加另一个键/值
- maven - Maven Checkstyle 不允许导入
- node.js - 在 Mac OS 上使用带有电子的 sqlite3 的问题
- python - 我正在尝试使用 Python 正则表达式解析一些日志文件,但出现以下错误:行继续符后出现意外字符
- sql - 选择累积和小于数字的位置(按优先级顺序)
- java - NetSuite 的 OAuth 1.0 身份验证
- c - Pypy CFFI 内存管理问题
- c# - AWS .NET SDK SimpleEmail SendEmail 返回“无法加载类型”错误
- ms-access - MS Access 2013 导出查询到 XML 不保存文件
- c# - 将 XML 层次结构展平为 CSV 的最佳方法是什么?