PTA第12题- 到底有多二
一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数到底有多二。
输入格式:
输入第一行给出一个不超过50位的整数N。
输出格式:
在一行中输出N犯二的程度,保留小数点后两位。
输入样例:
-13142223336
输出样例:
81.82%
思路:我一开始是想着将数直接读入一个int整型变量空间里面,后来发现读入进去后算不出正确答案,后来debug时发现读入的数值n被整型变量的大小限制了,后来改成了long long型,以为可以了,结果还是不行。哈哈哈哈哈代码如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
long long n;
int i;
double xishu1=1,xishu2=1,j=0,k=1,sum;
scanf("%d",&n);
if(n<0)
{
xishu1=1.5;
n=abs(n);
}
if(n%2==0)
{
xishu2=2;
}
for(i=0;i<50;i++)
{
if(n%10==2)
j=j+1;//j为2的个数
n=n/10;
if(n>0)
k=k+1;//k为输入n的长度
}
sum=j/k*xishu1*xishu2;
printf("%lf %lf %.2lf%%\n",j,k,sum*100);
printf("%lf %lf",xishu1,xishu2);
当n为int整型时,读入样例中的-13142223336后,调试窗口中的n为下图所示
当改为long long时,我以为我行了,结果还是错误,再次调试发现n为下面这个值,还是不行哈哈哈。(此时内心崩溃了)
然后查阅资料发现:
忽然感觉自己走进了死胡同…但是数组我一开始考虑过,只是感觉没有直接读入一个变量方便,所以当时就没用数组,然后现在发现还是要回过去从数组下手,哭。
最终代码如下:
#include<stdio.h>
#include<math.h>
int main()
{
int i;
double sum,j,k,xishu1=1,xishu2=1;
char a[51];
scanf("%s",a);
if(a[0]=='-')
{
xishu1=1.5;
}
for(i=0;a[i]!='\0';i++)
{
if(a[i]=='2')
j=j+1;//j为2的个数
}
if((a[i-1]-'0')%2==0)
{
xishu2=2;
}
if(xishu1==1.5)
k=i-1;
else
k=i;
sum=j/k*xishu1*xishu2*100;//k为数字长度
printf("%.2lf%%",sum);
}