题目
一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336
是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数到底有多二。
输入格式:
输入第一行给出一个不超过50位的整数N
。
输出格式:
在一行中输出N
犯二的程度,保留小数点后两位。
输入样例:
-13142223336
输出样例:
81.82%
思路
- 录入数字为字符串;
- 遍历字符串,求2的个数;
- 分负数和正数情况讨论;负数要 * 1.5,正数要 * 1;
注意:是否乘偶数系数与正负无关(可能是题目没表述清楚)。
知识点
精确到小数点后2位,用如下代码:
cout<<fixed<<setprecision(2)<<result<<'%';
涉及到的知识点可以参考c++保留n位小数输出(百分数形式,保留n位有效数字,设置宽度)_小白yaa的博客-CSDN博客
代码
#include <iostream>
#include <string>
#include <iomanip>
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;
}