L1-017 到底有多二 (15分)(C++)

L1-017 到底有多二 (15分)(C++ )

一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数到底有多二。

输入格式:

输入第一行给出一个不超过50位的整数N。

输出格式:

在一行中输出N犯二的程度,保留小数点后两位。

输入样例:

-13142223336

输出样例:

81.82%

题解思路

这道题我们首先要注意题目要求的输入,对于不超过50位的整数N,单纯的使用long long是不行的,
我们可以考虑使用字符串类型来处理输入这类较大的数据。
其次对于如何将字符类型转化为int类型,笔者选择了一种简单的方式,就是:

int to_int(char a)
{return int(a) - 48;
}

int(a)就是获取字符的ASCII码,‘0’的ASCII码为48,如果再减去48就能返回整数0啦,而负号’-'则会返回-3。
然而对于题目的理解,不知道有没有朋友像笔者一样认为先判断是不是负数,如果是,再判断是不是偶数,
但这样无论如何都不能通过,最后笔者改为了要么是负数,要么是偶数,要么两者都有这样的方式去理解,才通过了。
最后一定要注意输出,保留小数位数和百分号。

附上代码

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
int main()
{int to_int(char a);double ans, base = 1, sum_two = 0.0, length;string a;cin>>a;length = a.length();if(to_int(a[0]) == -3){length -= 1.0;base = 1.5;}if(to_int(a[a.length() - 1] ) % 2 == 0){base *= 2.0;}for(int i=0;i <a.length();i  ){if(to_int(a[i]) == 2){sum_two  = 1.0;}}ans = (sum_two / length)*base;cout<<fixed<<setprecision(2)<<ans*100<<"%";return 0;
}
int to_int(char a)
{return int(a) - 48;
}