作者 陈越单位 浙江大学
一个整数“犯二的程度”定义为该数字中包含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()
{
//2的个数
//负数的话dou1变成1.5
//偶数变成dou2变成2
int cnt=0;
double dou1=1.0,dou2=1.0;
char str[50];
scanf("%s",str);
int len=strlen(str);//数字长度(如果有负号,会加上负号)
for(int i=0;i<len;i++){
if(str[i]=='2'){
cnt++;
}
}
if((str[len-1]-'0')%2==0){
dou2=2.0;
}
if(str[0]=='-'){
dou1+=0.5;
len--; //第一个字符如果是减号的话,数字个数要减一
}
double degree=(1.0*cnt/len)*dou1*dou2*100;
printf("%.2f%%\n",degree);
return 0;
}
刚开始前面两个if写反了,然后发现测试样例输出结果都是正确答案的二分之一,且运行之后只有部分结果正确,因为如果判断正负的语句执行了,len会减一,然后判断奇偶的最后一个下标就不应该是len-1了,所以应该先判断奇偶性,然后再判断正负。
方法二:
每一步都把degree算出来
#include<stdio.h>
#include<string.h>
#define MAXSIZE 60
int main()
{
char a[MAXSIZE]; //字符型数组存储字符串
int n=0;
float degree; //degree表示2的程度
scanf("%s",a);
int len=strlen(a);
for(int i=0;i<len;i++){
if(a[i]=='2'){
n++; //如果为2,则个数加一
}
}
if(a[0]=='-'){ //负数只和a[0]有关
degree=(double)n/(len-1)*1.5; //除去第一位,将len-1作为数字位数
}else{
degree=(double)n/len; //正数则将len作为数字位数
}
if(((a[len-1]-'0')%2)==0){ //判断是否为偶数,通过最后一位数来判断
degree*=2;
}
degree*=100;
printf("%.2f%%",degree);
return 0;
}