Code Bye

有段简单的代码在codeblock和VS2015上运行结果不一致求指导= =

这是问题:给出一个数N,问N能否能表示成某个正整数X的K次幂(K>1),N可能有多种表示方法,请找出最大的X并输出相应的K。例如 16=2^4=4^2,64=4^3=2^6=8^2则16应表示为4^2,64应表示为8^2。
解答:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
while (1)
{
int n, x, k;
cin >> n;
if (n == 0) break;
for (x = n – 1; x>1; x–)
{
for (k = 2; pow(x, k)<n; k++)
{
}
if (pow(x, k) == n) break;
}
if (x == 1)
cout << 0 << ” ” << 0;
else
cout << x << ” ” << k << endl;
}
}
在codeblock中输入4,8等一些数字正常,输入27 ,100等数字输出0 0;
在VS2015中输入27,100分别输出3,3 ,10 2正常…
解决方案

10

Pow函数,不知道能不能正确的求出结果,原因是这是个参数和返回值,都是浮点类型的函数
至少第一个参数和返回值浮点类型的

40

应该是pow函数引起的。
你的codeblock调用的应该是浮点数的pow版本,也就是说返回值是浮点型,和int进行==比较。
由于浮点数存在精度误差,所以一直无法满足pow(x, k) == n
你改成
if(abs(pow(x, k) - n) < 0.0001)

试试

20

1、不同平台下pow函数实现可能不同
2、浮点数计算是有误差的

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明有段简单的代码在codeblock和VS2015上运行结果不一致求指导= =