我正在尝试创建一个能够计算任意数字校验和的函数,包括浮点数。
例如:
360° = 3+6+0 = 9
180° = 1+8+0 = 9
90° = 9+0 = 9
45° = 4+5 = 9
22.5° = 2+2+5 = 9
11.25° = 1+1+2+5 = 9
5.625° = 5+6+2+5 = 18 = 1+8 = 9
2.8125° = 2+8+1+2+5 = 18 = 1+8 = 9
1.40625 = 1+4+0+6+2+5 = 18 = 1+8 = 9
0.703125 = 0+7+0+3+1+2+5 = 18 = 1+8 = 9
0.3515625 = 0+3+5+1+5+6+2+5 = 27 = 2+7 = 9
0.17578125 = 0+1+7+5+7+8+1+2+5 = 36 = 3+6 = 9
...
我写了这个小代码,它计算整数的校验和:
#include<iostream>
using namespace std;
int checksum(int param)
{
int sum = 0;
while (param > 0)
{
sum += param % 10;
param /= 10;
}
while (sum > 9) { sum = checksum(sum); }
return sum;
}
int main()
{
int number = 0;
cout<<"Enter number:"<<endl;
cin>> number;
cout<< checksum(number);
cin.get(); cin.get();
return 0;
}
如何改进它,以便它也适用于浮点数?
背景
我试图找出我的例子中的模式是否会永远继续,结果为9作为校验和。
更新
不幸的是,C ++对于这个项目来说还不够精确。例如。如果我计算0.703125 / 2
,则结果将为0.3515625
,但在C ++中,结果为0.351563
。
我的代码:http://www.pasteall.org/61345/cpp
答案 0 :(得分:1)
假设你想计算浮点数的5位小数的校验和,然后简单地将你的浮点数乘以100000并取“'floor'然后用你的函数计算校验和。
修改强>
由于float和double有进动问题,最好不要用它们来计算更多数字的校验和(双数为15位)。对于更多数字使用浮点数的字符串表示。
答案 1 :(得分:1)
通过对数字求和,我从未听说过实数上的校验和。你应该采用4或8字节的二进制表示,并对它们求和。这将具有实际意义。
答案 2 :(得分:0)
我能够通过myselve解决它。
输入: 1.97654
输出: The checksum of 1.97654 is 5
#include<iostream>
#include<sstream>
#include<string>
#include<math.h> /* pow */
using namespace std;
int checksum(int param)
{
int sum = 0;
while (param > 0)
{
int r1 = param % 10;
sum += r1;
param /= 10;
}
while (sum > 9) { sum = checksum(sum); }
return sum;
}
int main()
{
string number;
cout<<"Enter number:"<<endl;
cin>> number;
double param_as_double = stod(number);
int front_part = stoi(number);
double after_point_part = param_as_double - front_part;
ostringstream strs;
strs << after_point_part;
string after_point_part_str = strs.str();
int nachkomma_len = after_point_part_str.length()-1;
after_point_part *= pow(10.00,nachkomma_len-1);
strs.str("");
strs << after_point_part;
after_point_part_str = strs.str();
int after_point_part_int = stoi(after_point_part_str);
int SUM = 0;
SUM = checksum(front_part);
SUM += checksum(after_point_part_int);
SUM = checksum(SUM);
cout<<"The checksum of "<<number<<" is "<< SUM <<endl;
cin.get(); cin.get();
return 0;
}
可能它需要更多的代码,但我很累,因此懒得去改进它。我还没有足够的时间来测试它是否存在错误,所以我不确定它是否适用于100%。