1、CCF历年真题C语言答案解析题1:出现次数最多的数#includeint main() int i,j, n, s; int t = 1; int a10001 = 0; scanf(%d, &n); for (i = 0; i at) t=s; if (as = at) t=(st? s:t); printf(%d, t); return 0;题2:ISBN号码#includeint main() int sum=0; char a13 = 0; gets(a); sum = (a0 - 0)*1 + (a2 - 0) * 2 + (a3 - 0) * 3 + (a4 - 0) * 4 +
2、(a6 - 0) * 5 + (a7 - 0) * 6 + (a8 - 0) * 7 + (a9 - 0) * 8 +(a10 - 0) * 9; if (sum%11 = a12-0)|(sum%11=10&a12=X) /注意正确情况几种类型 printf(Right); else if (sum%11 = 10) a12 = X; else a12 = sum%11 + 0; puts(a); return 0;题3:相反数#includeint main() int i, j, n,t=0; int a501; scanf(%d, &n); for (i = 0; i n; i+) s
3、canf(%d, &ai); for (i = 0; i n-1; i+) for (j = i + 1; j n; j+) if (ai + aj = 0) t+; printf(%d, t); return 0;题4:窗口#includetypedef struct window1 int x1,x2,y1,y2,order; window;void Inputwindow(window ws,int n) int i; for(i=1;i=n;i+) scanf(%d%d%d%d,&wsn-i.x1,&wsn-i.y1,&wsn-i.x2,&wsn-i.y2); wsn-i.order=
4、i; int getpos(window ws,int n,int x,int y) int i; for(i=0;i=wsi.x1&x=wsi.y1&y=0;i-) wsi+1=wsi; ws0=w;int main() int i,n,m,x,y,pos; scanf(%d%d,&n,&m); window wsn; Inputwindow(ws,n); for(i=0;im;i+) scanf(%d%d,&x,&y); pos=getpos(ws,n,x,y); if(pos=-1) printf(IGNOREDn); else printf(%dn,wspos.order); move
5、window(ws,n,pos); return 0; 题5:相邻数对#include#includeint main() int i, j, n,t=0; int a1001; scanf(%d, &n); for (i = 0; i n; i+) scanf(%d, &ai); for (i = 0; i n - 1; i+) for (j = i + 1; j n; j+) if (abs(ai - aj) = 1) t+; printf(%d, t); return 0;题6:画图#includeint main() int i, j, n,k, t = 0; int a1014; s
6、canf(%d, &n); for (i = 0; i n; i+) scanf(%d%d%d%d, &ai0, &ai1, &ai2, &ai3); for (i = 0; i 101; i+) for (j = 0; j 101; j+) for (k = 0; k = ak0 & j = ak1 & i ak3) break; if (k n) t+; printf(%d, t); return 0; 题7:门禁系统#includeint main() int i, n, s = 0; int a1001 = 0 ; scanf(%d, &n); for (i = 0; i n; i+)
7、 scanf(%d, &s); as+; printf(%d , as); return 0;题8:z字形扫描#includeint main() int i, j, k, n; int a500500; scanf(%d, &n); for (i = 0; in; i+) for (j = 0; jn; j+) scanf(%d, &aij); for (k = 0; k2 * n - 1; k+) for (i = 0; in; i+) for (j = 0; jn; j+) if (i + j = k) if (k % 2 = 0) printf(%d , aji); else prin
8、tf(%d , aij); return 0;题9:图像旋转#include#define N 1000 int aNN;int main() int i, j, n, m; scanf(%d%d, &n, &m); for (i = 0; i n; i+) for (j = 0; j m; j+) scanf(%d, &aij); for (j = 1; j =m; j+) for (i = 0; i n; i+) if (i != 0) printf( ); printf(%d, aim - j); printf(n); return 0;题10:数字排序#includeint main(
9、) int i, j, n,s=0; int a1001 = 0; /注意初始化赋值 scanf(%d, &n); for (i = 0; i 0; i-) /i为从后找起的频数 for (j = 0; j 1001; j+) /数组下标从小到大 if (aj = i) /找自己 printf(%d %dn, j, aj); return 0;题11:数列分段#includeint main() int i, n,t=0; int a1001; scanf(%d, &n); for (i = 0; i n; i+) scanf(%d, &ai); for (i = 0; i n - 1; i+
10、) if (ai != ai + 1) t+; printf(%d, t + 1); return 0;题12:日期计算#includeint main() int y, d, day, i; int mouth13 = 0,31,28,31,30,31,30,31,31,30,31,30,31 ; scanf(%d%d, &y, &d); if (y % 4 = 0 & y % 100 != 0) | (y % 400 = 0) mouth2+; for (i = 1; i mouthi) d = d - mouthi; if (d = 0) d = mouthi; break; else
11、break; /注意中断,确保月份不出错 printf(%dn%d, i, d); return 0;题13:数位之和#includeint main() int n, sum = 0; scanf(%d, &n); while (n) sum = sum + n%10; n = n / 10; printf(%d, sum); return 0;题14:消除类游戏#includeint main() int i, j,k, n, m,t=1; int a3131 = 0 ; int b3131 = 0 ; scanf(%d%d, &n, &m); for (i = 0; i n; i+) f
12、or (j = 0; j m; j+) scanf(%d, &aij); for (i = 0; i n; i+) for (j = 0; j = 3) for (k = j - t + 1; k = j; k+) bik = 1; t = 1; for (j = 0; j m; j+) for (i = 0; i = 3) for (k = i - t + 1; k = i; k+) bkj = 1; t = 1; for (i = 0; i n; i+) for (j = 0; j m; j+) if (bij) aij = 0; /将找到的赋0 for (i = 0; i n; i+)
13、for (j = 0; j m; j+) printf(%d , aij); printf(n); return 0;题15:折点计数#includeint main() int i, n,t=0; int a1001; scanf(%d, &n); for (i = 0; i n; i+) scanf(%d, &ai); for (i = 0; i n-2; i+) if (ai + 1 ai & ai + 1 ai & ai + 1 ai + 2) t+; printf(%d, t); return 0;题16:俄罗斯方块#includeint main() int i, j, n; in
14、t k = 0,count=0,down=0; int x4, y4; int a1510; int b44; for (i = 0; i 15; i+) for (j = 0; j 10; j+) scanf(%d, &aij); for (i = 0; i 4; i+) for (j = 0; j 4; j+) scanf(%d, &bij); scanf(%d, &n); for (i = 0; i 4; i+) for (j = 0; j 4; j+) if (bij = 1) xk = i; yk = j; k+; while (1) for (i = 0; i 4; i+) if
15、(axi + downyi + n - 1 = 0) count+; if (count = 4) down+; count = 0; else if (xi + down = 14) for (j = 0; j 4; j+) axj + downyj + n - 1 = 1; break; else for (j = 0; j 4; j+) axj + down - 1yj + n - 1 = 1; break; for (i = 0; i 15; i+) for (j = 0; j 10; j+) printf(%d , aij); printf(n); return 0; 题17:最大波
16、动#include#includeint main() int i, n,t=0; int a1001 = 0 ; scanf(%d, &n); for (i = 0; i n; i+) scanf(%d, &ai); for (i = 0; i n-1; i+) if (t abs(ai - ai + 1) t = abs(ai - ai + 1); printf(%d, t); return 0;题18:火车购票#includeint main() int i, j, n, t,k; int flag; int a100 = 0 ; int b20 = 0; scanf(%d, &n);
17、for (i = 0; i 20; i+) bi = 5; for (i = 0; i n; i+) scanf(%d, &t); flag = 0; for (j = 0; j = t) /有连续座位 for (k = 1; k 0) /无连续座位且有人买票 for (j = 0; j = 1) /分散买票 printf(%d , j * 5 + (5 - bj) + 1); t-; bj-; printf(n); /注意换行的情况 return 0;题19:中间数#includeint main() int i,j,n,zuo,you; int t = -1; int a1001; sca
18、nf(%d, &n); for (i = 0; i n; i+) scanf(%d, &ai); for (i = 0; i n; i+) zuo = 0; /注意初始化 you = 0; for (j = 0; j aj) zuo+; if (ai aj) you+; if (zuo = you) t = ai; printf(%d, t); return 0;题20:工资计算#includeint main() int i, t; int x = 0; scanf(%d, &t); if (t = 3500) printf(%d, t); for (i = 3600; i = 3600 & i = 5100 & i = 8100 & i = 12600 & i = 38600 & i = 58600 & i = 83600) x += (i - 83500)*0.45 + 45 + 300 + 900 + 6500 + 6000 + 8750; if (i - x = t) printf(%d, i); break; return 0;题21:分蛋糕#includeint main() int i, n, k; int sum = 0, t = 0; int a1001; scanf(%d%d, &n, &k); for (i = 0; i n; i+) scanf