This question already has answers here:
Multiplication of two integers in C++

(3个答案)


4年前关闭。




在检测范围内的Kaprekar数时,在C++中发现了此问题。对于号码77778-
unsigned long long sq = pow(n, 2);

返回6,049,417,284而
unsigned long long sq = n * n;

返回1,754,449,988

有什么想法吗?这是pow可以避免的溢出,但是正常的n * n不会。

最佳答案

假设您的n是典型的intunsigned int,这是因为

这条线

unsigned long long sq = n * n;

相当于
unsigned long long sq = (int)(n * n);

因为n * n将在将结果分配给sq之前首先进行处理(均为整数),所以这是溢出问题(并且也欢迎堆栈溢出!)。

您可能还希望通过四处搜索来更多地理解这些术语overflowcasting(由于它们是计算机中非常常见的问题,因此尽早理解它们会很有帮助!)。

这与Kaprekar数无关。在当今的大多数机器中,int是32位的。因此,它只能处理值-2,147,483,648到2,147,483,647(对于无符号整数计数器部分,则只能处理0到4,294,967,295)。

因此,处理n * n将为您提供:
n * n = 6,049,417,284 - 4,294,967,296 = 1,754,449,988 //overflow at (4,294,967,295 + 1)!

如果您事先进行铸造:
unsigned int n = 77778;
unsigned long long sq = pow(n, 2);
unsigned long long sq2 = (unsigned long long)n * n; //note the casting here.
std::cout << sq << std::endl;
std::cout << sq2 << std::endl;

然后结果将是相同的,因为不会出现溢出

关于c++ - C++中的平方数,Kaprekar数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34447435/

10-12 12:20