计算一个点数的校验和
Calculate checksum of a point number
我正在尝试创建一个能够计算任何数字的校验和的函数,包括浮点数。
例如: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
假设你想计算校验和到浮点数的小数点后5位,然后简单地将你的浮点数乘以100000并取'floor'然后用你的函数计算校验和。
编辑
由于float和double有进动问题,最好不要使用它们来计算更多数字的校验和(double为15位)。
我从来没有听说过实数的校验和,通过对数字求和。您应该采用二进制表示,4或8字节,并将它们相加。这是有意义的
我能够自己解决它。
输入: 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;
}
可能是更多的代码然后必要的,但我累了,因此太懒改进它。我还没有足够的时间来测试它的bug,所以我不确定它是否100%工作。
相关文章:
- 如何用尽可能少的数据将数据缓冲区计算为零校验和值
- 计算校验和的逐位运算符
- 如何从存储在 QByteArray 中的十六进制值计算校验和
- 如何在 c++ 中计算对象的哈希/校验和/指纹?
- C++文件传输的校验和算法
- 如何从 IP 校验和字段中计算十六进制值
- 计算句子的校验和(XOR)(由不同变量/类型的组合形成)
- 目录校验和
- 编译后如何计算某些二进制功能(或基本块)的校验和
- PMS5003带有ESP8266-许多校验和错误
- 未正确的校验和释放对象 - 打印时错误
- 将C++校验和函数转换为 Java
- 确定是否使用boost.asio计算UDP校验和
- 校验和CRC 16从C 到Java
- 不同的CRC32校验和同一文件
- Qt,tcp/ip通信校验和
- 正在计算ICMP数据包校验和
- 错误的校验和错误遍布程序
- 计算一个点数的校验和
- 如何为一个简单的C++程序选择正确的校验和,以及如何实现它