一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336
是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数到底有多二。
输入格式:
输入第一行给出一个不超过50位的整数N
。
输出格式:
在一行中输出 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