计算一个点数的校验和

Calculate checksum of a point number

本文关键字:校验和 一个 计算      更新时间:2023-10-16

我正在尝试创建一个能够计算任何数字的校验和的函数,包括浮点数。

例如:

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%工作。