原题链接
一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数到底有多二。
输入格式:
输入第一行给出一个不超过50位的整数N。
输出格式:
在一行中输出N犯二的程度,保留小数点后两位。
输入样例:
-13142223336
输出样例:
81.82%
难点:输入的整数有50位,所以我采用了字符串数组解决(不太清楚long long int够不够),除此之外好像没什么要注意的
代码:
#include<stdio.h>
#include<string.h>
int main()
{
int num,total,i;
double out;
char s[52]; //储存输入的整数
while(scanf("%s",s)!=EOF)
{
num=0; //2的个数
total=0; //输入的整数的总位数
out=1; //表示犯二程度
if(s[0]=='-') //确定输入的数为整数还是负数
{
out*=1.5;
i=1;
} //如果输入的数为负数,则字符串开头为符号位,也就是负号,故数字位从第二位开始,也就是s[1]
else i=0;
while(s[i]!='\0')
{
if(s[i]=='2') num++;
total++;
i++;
} //一位位读取字符串数组
if((s[i-1]-'2')%2==0) out*=2;
out=out*100*num/total;
printf("%.2lf%%",out);
memset(s,'\0',sizeof(s)); //初始化字符串数组s
}
return 0;
}