重启c语言- 到底有多二

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);
}

猜你喜欢

转载自blog.csdn.net/weixin_43723423/article/details/104636454
今日推荐