2015-09-25 7 views
3

Я пытаюсь создать функцию, которая способна вычислять контрольную сумму любого числа, включая числа с плавающей запятой.Вычислить контрольную сумму номера точки

Например:

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 в качестве контрольной суммы.

Update

Unfortunattely C++ не является достаточно точным для этого проекта. Например. если я вычислил 0.703125/2, тогда результат будет 0.3515625, но в C++ результат 0.351563. Мой код: http://www.pasteall.org/61345/cpp

+0

Похоже, что любой отрицательный параметр даст контрольную сумму 0. Это предназначено? –

+2

Почему вы не создаете контрольную сумму из представления бит? –

+0

Вы хотите, чтобы у 380, 180, 38, 18, 9 и 90 у всех была такая же контрольная сумма? Зачем?! –

ответ

1

Предположим, вы хотите рассчитать контрольную сумму до 5 десятичных знаков числа с плавающей запятой, а затем просто умножить число с плавающей запятой на 100000 и взять «пол», а затем рассчитать контрольную сумму с помощью вашей функции.

EDIT

Как поплавок и двуспальный проблема прецессии, лучше не использовать их для вычисления контрольной суммы для получения дополнительной цифры (15 цифр для двойного). Для большего количества цифр используйте строковое представление числа с плавающей запятой.

1

Я никогда не слышал о контрольной сумме на реальные цифры, суммируя цифры. Вы должны взять двоичное представление, 4 или 8 байтов, и суммировать их. Это имело бы смысл.

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%.

+1

Скажите, пожалуйста, это для класса, а не для реального приложения. –

+0

Это не вычисляет контрольную сумму float, она вычисляет контрольную сумму строки. –

+0

Я редактировал заголовок, я говорил о номерах точек. Я немецкий и не знал правильного слова. – Black

Смежные вопросы