一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数到底有多二。
输入第一行给出一个不超过50位的整数N。
在一行中输出N犯二的程度,保留小数点后两位。
-13142223336
81.82%
精确到小数点后2位,用如下代码:
cout<setprecision(2)<'%';
涉及到的知识点可以参考c++保留n位小数输出(百分数形式,保留n位有效数字,设置宽度)_小白yaa的博客-CSDN博客
- #include
- #include
- #include
- using namespace std;
-
- //是否乘偶数系数与正负无关(可能是题目没表述清楚)
-
- int oushu(string n) {
- int m = n[n.length() - 1] - '0';//注意此处要-1才是最后一位!m 为个位
- if (m % 2 == 0)//一个数的最后一位(即个位)能被2整除,那么这个数就是偶数。
- {
- return 2;
- }
- else
- {
- return 1;
- }
- }
-
- int main() {
- string n;//输入的数字用字符串存储
- cin >> n;
-
- int k = 0;//数字中包含2的个数
- double result = 1.0;
- int len = n.length();//字符串的长度
-
- //统计数字中2的个数
- for (int i = 0; i < len; i++)
- {
- if (n[i] == '2')
- {
- k++;
- }
- }
-
- //首先分为两个大的情况:负数和非负数 然后分别讨论各个情况下是否为偶数的情况 用oushu()函数进行了封装,提高代码的复用性
- if (n[0]=='-')
- {
- result = (double)k / (len - 1)*1.5*oushu(n);
- }
- else
- {
- result = (double)k / len * oushu(n);
- }
-
- cout << setiosflags(ios::fixed) << setprecision(2) << result*100 << '%' << endl;
-
- return 0;
- }