L1-017 到底有多二 C++解法

题目

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

输入格式:

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

输出格式:

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

输入样例:

-13142223336

输出样例:

81.82%

 思路

  1. 录入数字为字符串;
  2. 遍历字符串,求2的个数;
  3. 分负数和正数情况讨论;负数要 * 1.5,正数要 * 1;
    注意:是否乘偶数系数与正负无关(可能是题目没表述清楚)。

 知识点

精确到小数点后2位,用如下代码:

cout<

 涉及到的知识点可以参考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;
}

你可能感兴趣的:(C++常遇问题总结,C++常见知识点,c++,算法,开发语言,PTA)