团体程序设计天梯赛-练习集 L1-017 到底有多二 (15 分) 解题思路分析

博客内容讲述了如何计算一个整数中数字2的出现频率与其位数的关系,即'犯二的程度'。程序通过遍历整数的每一位,判断是否为2、是否为负数和是否为偶数,根据规则计算比例并输出结果。文章还讨论了在判断偶数和负数时需要注意的细节,如字符转换和负号处理。
摘要由CSDN通过智能技术生成

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

输入格式:

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

输出格式:

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

输入样例:

-13142223336

输出样例:

81.82%

 题目并不长,也不难理解,话不多说先放代码:

#include<stdio.h>
#include<string.h>
int main()
{
	char N[51];  //定义字符数组,由于要存储字符串,所以要多留一位来存储/0,字符串以/0结尾 
	scanf("%s",&N);
	int len=strlen(N);  //使用string.h中的函数strlen()来判断输入数组长度并存储在len 
	int i,count=0;
	for(i=0;i<len;i++)  //遍历数组中每一个字符,注意上限 
	{
		if(N[i]=='2')  // 判断这个字符是否为 2,这里的 2 要加单引号 
		   count++;  //count计数 
	}
	double flag1=1.0,flag2=1.0; //定义两个倍数 
	if((N[len-1]-'0')%2==0)  //先判断是否为偶数,其实只需要判断最后一位即可 
	{
		flag1=2.0;
	}
	if(N[0]=='-')  //判断是否为负数,只需要判断第一个字符是否为 - ,同样要加单引号 
	{
		flag2=1.5;
		len--;  //这里这个len自减很重要,因为如果是负数,负号不能算在数字个数中参与最终计算 
	}
	printf("%.2lf%%",1.0*count/len*flag1*flag2*100);  //注意这里的输出%需要在前面加一个% 
	return 0;
}

问题一:2的个数的判断

由于定义的是字符数组,数字是以字符形式存储的,所以遍历每一个字符判断是否等于字符2即可,这里再判断时要给 2 加上单引号。

for(i=0;i<len;i++)  //遍历数组中每一个字符,注意上限 
	{
		if(N[i]=='2')  // 判断这个字符是否为 2,这里的 2 要加单引号 
		   count++;  //count计数 
	}

问题二:偶数的判断

判断是否为偶数只需要判断最后一位是否为偶数或0即可,值得注意的是在进行求余运算时,与上同理,字符进行运算要先格式转换,其实就是在后面加上 - '0' ,就可以进行运算,其实不加这个也可以,因为偶数字符对应的ASCII码也是偶数,但同时也会出现一个问题,就是如果最后一位我输入了一个ASCII码也是偶数的字符比如 Z ,会输出判定为偶数的结果,这显然是不严谨的,虽然题目测试点并不会给出这样的例子,但一定要注意格式的正确。

 这是没有 - ' 0 ' 运算的结果,可以发现,Z被判定为偶数,答案依然正确,这是荒谬的,虽然就题目来说在测试点测试下是正确的。

问题三:负数的判断

负数的判断只需要判断第一位字符是不是 ' - '即可,与前面判断2的方法一样,这里要注意的是,如果是负数,那么就要len减一,因为负号是不能算在数字个数里的,不然最后的计算会产生错误

if(N[0]=='-')  //判断是否为负数,只需要判断第一个字符是否为 - ,同样要加单引号 
	{
		flag2=1.5;
		len--;  //这里这个len自减很重要,因为如果是负数,负号不能算在数字个数中参与最终计算 
	}

End


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Huaperion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值