我第一次做大学的家务活,遇到了这个问题:
任务:找到所有n个元素的和,其中n是数字中数的计数(n=1,意思是1,2,3.例如,答案是45)
问题:我编写的代码已经正确地得到了所有测试答案
我想这与变量类型有关,但不太确定可能的解决方案。
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
int n;
double ats = 0, maxi, mini;
cin >> n;
maxi = pow(10, n) - 1;
mini = pow(10, n-1) - 1;
ats = (maxi * (maxi + 1)) / 2 - (mini * (mini + 1)) / 2;
cout << setprecision(0) << fixed << ats;
}发布于 2020-09-25 16:07:21
产生问题的主要原因是pow()函数。它适用于double,而不是int。丢失准确性是代表巨大数字的代价。解决问题的方法有三种:
long long int pow(int x, int pow)函数。但问题是,我们甚至可以溢出long long intX9...9Y0...0表示的是n,字母X和Y是常量。因此,您可以直接打印答案“字符串”而无需计算。发布于 2020-09-25 17:33:06
我觉得你把浮点数拉得超出了它们的精度。让我解释一下:
函数C pow()将双倍作为参数。如果要传递ints,编译器将添加代码,在它们到达pow()之前将它们转换为双倍。(不管怎么说,当您以这种方式声明返回值时,您将其存储为一个双值)。
浮点之所以被称为浮点,正是因为浮点的“浮动”。在双面内有一个符号位,尾数有几个位,指数有几个位。在二进制中,提升到2的幂等于将分数点移到右边(或者如果你把分数点提升到负数的话)。基本上,指数是指分数点在哪里,以二进制表示。使用这种内存中的双倍表示的最大优点是,对于接近于0的数字,可以获得很多精度,并且随着数字的增大而逐渐失去精度。
最后一件事就是发生在你身上的事。您的号码太大了,无法准确存储。所以它被四舍五入到2的最接近的幂之和(2的幂是用二进制表示的所有零的数)。
快速实验:在浏览器中按F12,打开javascript控制台并键入49499999995499995136。在我的例子中,在铬的情况下,我重复同样的问题。
如果你真的想要精度这么大的数字,那么你可以尝试其中一些图书馆,但这是太先进的学生程序,你不需要它。如果用户输入的数字太大,只需添加一个if块并打印一条错误消息(教授喜欢这样做,这实际上是非常正确的)。
https://stackoverflow.com/questions/64065763
复制相似问题