Language C Basic Debug

Language C Basic Debug

初学小白在各高校ACM Online Judge上刷题时,总会遇到这样或那样的问题。比如,题目的隐蔽要求,溢出,3*n,全角半角,\n,==,&a,符号,各类运算符结合性,1<=a<=3 …稻花香里说丰年,听取W.A.声一片!

  1. 有关数据类型和精度问题

example1.1:求圆柱的体积等,输出结果和标准答案小数点后第二位有细微差别,WA如下:

#include 
#include 

#define PI 3.14
#define C(r) 2 * PI * r
#define S(r) PI * r * r
#define S2(r) 4 * PI * r * r
#define Va(r) 4.0/3.0 * PI * r * r * r
#define Vb(r, h) PI * r * r * h

int main()
{
	float r , h;
	scanf("%f %f", &r, &h);
	printf("C1=%.2f\n", C(r));
	printf("Sa=%.2lf\n", S(r));
	printf("Sb=%.2f\n", S2(r));
	printf("Va=%.2f\n", Va(r));
	printf("Vb=%.2f\n", Vb(r, h));
	return 0;
}

这个涉及到精度问题,3.14在计算机中是不精确的表示。
标准C允许使用后缀。如3.14为double类型,3.14f 为float类型。或者,可以在下方强制转化为 float(PI);

example1.2:高速公路超速处罚,WA如下

#include 

int main()
{
	float v,lim,x;
	while(scanf("%f%f",&v,&lim) != EOF)
	{
		x=(v-lim)/lim*100;
		if(v<lim*1.1)
		printf("OK\n");
		else if(v<lim*1.5)
		printf("Exceed %.0f%%. Ticket 200\n",x);
		else
		printf("Exceed %.0f%%. License Revoked\n",x);
	}
}
Sample Input Sample Output
65 60 OK √
110 100 Exceed 10%. Ticket 200 ×
200 120 Exceed 67%. License Revoked √

1.1在计算机中同样是不精确的表示,所以1.1*100可能是110.000000000000014…因此,在判断浮点数是否相等时,可以借鉴《高等数学》中对于“无限接近”的ξ来近似表示相等。修改如下:

#include 

int main()
{
	float v,lim,x;
	while(scanf("%f%f",&v,&lim) != EOF)
	{
		x=(v-lim)/lim*100;
		if(v-lim*1.1<-0.0000001)
		printf("OK\n");
		else if(v-lim*1.5<-0.0000001)
		printf("Exceed %.0f%%. Ticket 200\n",x);//注意%%
		else
		printf("Exceed %.0f%%. License Revoked\n",x);//注意拼写和空格
	}
}
  1. 有关递推公式与循环结构(编辑中)

输入一个日期(含年、月、日),输入该日期是该年度中的第几天

#include 

int main()
{
    int year,month,day,n,x,s=0;
    scanf("%d%d%d",&year,&month,&day);
    for(n=1,s=0;n<month;n++)
    {
        switch(n)
        {
            case 1: case 3: case 5:
            case 7: case 8: case 10:
            case 12: x=31;

            case 4: case 6: case 9:
            case 11: x=30;

            case 2:
                {
                if(x%4==0&&x%100!=0||x%400==0) x=29;
                else x=28;
                }
        }
        s=s+x;
    }
    printf("一共有%d天",s+day);
    return 0;
}

*example1.8:*输出2~1000中的守形数

#include 

int main()
{
    int n,s,m;
    bool flag=0;
    s=0;
    for(n=2;n<=1000;n++)
    {

	while(n)
    {
        m=n;
		s=s*10+m%10;
        m=m/10;
        if(s*s==n)
        {
            flag=1;
            break;
        }

    }
    printf("%d",n);
    }
    return 0;}


换钞票

#include

int main()
{
    int n10,n5,n2,n1;
    for(n10=1;n10<10;n10++)
    {
        for(n5=1;n5<20;n5++)
        {
            for(n2=1;n2<40;n2++)
            {
                for(n1=40-n10-n5-n2;40-n10-n5-n2>0&&n1<40;n1++)
                {
                    if(n10*10+n5*5+n2*2+n1==100)
                        printf("10元%02d张,5元%02d张,2元%02d张,1元%02d张\n",n10,n5,n2,n1);
                }
            }
        }
    }
    return 0;
}

编辑中。

#include
#include

double Fibonacci(double n)
{
	double a=1,b=1,t,c=1;
	while(c<n-1)
	{
	t=a+b;
	a=b;
	b=t;
	c++;
	}
	return b;
}

int main()
{
	int i;
	double s,x;
	while(scanf("%lf",&x)!=EOF)
	{
		//printf("f=%d\n",Fibonacci(100));
		for(i=0,s=0;i<=2*x-2;i+=2)
		{
			//printf("f=%lf\n",Fibonacci(i+1));
			s=s+1.0*Fibonacci(i+1)/Fibonacci(i+2);
		}
		printf("%.5lf\n",s);
	}
	return 0;
}

把一个偶数拆成两个不同素数的和,有几种拆法呢?

#include

_Bool check(int num);

main()
{
	int count=0,prime[10000],n,i,j,k,t;
	/*for(i=2;i<=10000;i++)
	{
		if(check(i))
		{
			prime[count]=i;
			count+=1;
		}
	}*/
	
	while(scanf("%d",&n)!=EOF)
	{
		t=0;
		for(j=2;j<=10000;j++)
		{
			if(check(j)&&(check(n-j))&&j<n-j)
				t++;
			/*for(k=j+1;k<=2500;k++)
			{
				if(prime[j]+prime[k]==n)
				//printf("%ld+%ld=%ld\n",prime[j],prime[k],n);
				t++;
			}*/
		}
		printf("%d\n",t);
	}
}

_Bool check(int num)
{
	int i;
	_Bool flag=1;
	for(i=2;i*i<=num;i++)
	{
		if(num%i==0)
		{
			flag=0;
			break;
		}
	}
	if(num>=2) return flag;
	else return 0;
}

求若干个(不超过10000)1992的乘积的末两位数是多少?

#include

long long pown(long long n)
{
	long long i,p=1;
	if(n){
	for(i=1;i<=n;i++)
	{
		p=(p*92)%100;
	}}
	else p=0;
	return p;
}

int main()
{
	long long n;
	while(scanf("%lld",&n)!=EOF)
	{
		printf("%02lld\n",pown(n));
	}
	return 0;
}



你可能感兴趣的:(大一,Debug,C语言,c语言,debug)