Skip to content

L1-017 到底有多二

Statement

Metadata

  • 作者: 陈越
  • 单位: 浙江大学
  • 代码长度限制: 16 KB
  • 时间限制: 400 ms
  • 内存限制: 64 MB

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

输入格式

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

输出格式

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

输入样例

-13142223336

输出样例

81.82%

鸣谢安阳师范学院段晓云老师和软件工程五班李富龙同学补充测试数据!

Solution

#include <ctype.h>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;

typedef long long LL;
const double PI = 3.14159265358979323846264338327;
const double E = 2.718281828459;
const double eps = 1e-6;
const int MAXN = 0x3f3f3f3f;
const int MINN = 0xc0c0c0c0;
const int maxn = 1e5 + 5;
const int MOD = 1e9 + 7;

int main() {
    string s;
    cin >> s;
    int len = s.size();
    int flag[2] = {0};
    int vis = 0;
    for (int i = 0; i < len; i++) {
        if (s[i] == '-') {
            flag[0] = 1;
        } else {
            if (s[i] == '2')
                vis++;
            if (i == len - 1 && s[i] % 2 == 0)
                flag[1] = 1;
        }
    }
    double ans = 0.0;
    if (flag[0])
        ans = vis * 1.0 / (len - 1) * 1.5;
    else
        ans = vis * 1.0 / len;
    if (flag[1])
        ans *= 2;
    printf("%.2lf%%\n", ans * 100);
}

Last update: May 4, 2022
Back to top