L1-017 到底有多二(模拟)

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

输入格式:

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

输出格式:

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

输入样例:

1
-13142223336

输出样例:

1
81.82%

思路:

用string处理,第一位判断是否为负数,最后一位判断是否位偶数,用map统计2出现的次数。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <bits/stdc++.h>
using namespace std;

double t = 1, sum, len;
string N;
map<char, double> m;

int main()
{
cin >> N;
len = N.length();
for(int i = 0; i < N.length(); i++)
{
if(N[i] == '-')
{
t = t * 1.5;
len--;
}
if(i == N.length()-1 && (N[i]-'0') % 2 == 0)
t = t * 2;
m[N[i]]++;
}
cout << fixed << setprecision(2) << t * m['2'] / len * 100 << "%";

return 0;
}