问题:
一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336
是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数到底有多二。
解答:
#include <stdio.h>
int main(){
int num,digits=0,zf=0,n=0,ws,i;
//digits是位数 zf是正负 n是2的个数 ws是尾数
double s1,fin;
char a[100];
//输入数组并记录位数
while((a[digits]=getchar())!='\n'){
ws = a[digits]-'0';
digits += 1;
}
//看有多少个2
for(i=0;i<digits;i++)
if(a[i]=='2')
n++;
//看是不是负数
if (a[0]=='-'){
digits -= 1;
zf = 1;
}
//计算包含2的个数与其位数的比值
s1 = (double)n/digits;
//偶数或者负数
if(ws%2==0)
s1 = s1*2.0;
if(zf==1)
s1 = s1*1.5;
fin = s1*100;
//输出结果
printf("%.2lf%%",fin);
}
#用while循环输入方便记录位数
解答过程中的错误:
1.将a[i]==2,字符数组里的是字符2而非数值2
2.digits的调用顺序不能轻易改变,先得到尾数和遍历求2的数量后,再变换为真正的位数
3整数和整数相除得到的结果还是整数,要得到小数需要进行强制类型转换