初学小白在各高校ACM Online Judge上刷题时,总会遇到这样或那样的问题。比如,题目的隐蔽要求,溢出,3*n,全角半角,\n,==,&a,符号,各类运算符结合性,1<=a<=3 …稻花香里说丰年,听取W.A.声一片!
有关数据类型和精度问题example1.1:求圆柱的体积等,输出结果和标准答案小数点后第二位有细微差别,WA如下:
#include <stdio.h> #include <math.h> #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 <stdio.h> 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 InputSample Output65 60OK √110 100Exceed 10%. Ticket 200 ×200 120Exceed 67%. License Revoked √1.1在计算机中同样是不精确的表示,所以1.1*100可能是110.000000000000014…因此,在判断浮点数是否相等时,可以借鉴《高等数学》中对于“无限接近”的ξ来近似表示相等。修改如下:
#include <stdio.h> 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 <stdio.h> 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 <stdio.h> 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<stdio.h> 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<stdio.h> #include<math.h> 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<stdio.h> _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<stdio.h> 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; } 数组和指针