初学小白在各高校ACM Online Judge上刷题时,总会遇到这样或那样的问题。比如,题目的隐蔽要求,溢出,3*n,全角半角,\n,==,&a,符号,各类运算符结合性,1<=a<=3 …稻花香里说丰年,听取W.A.声一片!
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);//注意拼写和空格
}
}
输入一个日期(含年、月、日),输入该日期是该年度中的第几天
#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;
}