一、 倒序数是将一个阿拉伯数的各位上的数字以逆序的形式写成的数。该阿拉伯数的第一位变成最后位,最后位变成第一位。例如数1245被写成5421。注意产生的新数字前边所有的数字0是被略去的。倒序数的尾部无多余的数字0。请将阿拉伯数转变为倒序数。
输入
输入的第一行仅有一个正整数n,表示有n组测试数据。接下来有n行,每一行是一组测试数据,长度不超过100。每一行上的字符串表示一个非负整数,它是你需要转换的数。
输出
对每一组测试数据在一行上输出倒序数,该倒序数中前导的数字0被略去了。
输入样例 输出样例
3
24 42
43400 434
305 503 (25分)
二、 对一个正整数n,求出n!中末尾0的个数。
输入
输入有若干行。每一行上有一个整数T,是测试数据组数,接着有T行,每一行包含一个确定的正整数n(n≤1000000000)。
输出
对输入行中的每一个数据n,输出一行,其内容是n!中末尾0的个数。
输入样例 输出样例
3
3 0
100 24
1024 253 (25分)
三、 给定两个字符串a和b,定义式子a*b表示两个字符串的连接。例如a=“abc”,b=“def”,则a*b=“abcdef”。如果将连接看成乘法,则按照普遍的方法,一个非负整数的幂表示为:a0=“”(the empty string),
a(n+1)=a*(an)。
输入
输入字符串s,每组样例一行,s为可打印字符。s的长度在1—1000000之间。最后一组数据后为句号(.)。
输出
每个字符串s输出最大的n满足s=an,其中a为任意字符串。
输入样例 输出样例
abcd 1
aaaa 4
ababab 3 (25分)
四、 若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的N(N为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。
输入
输入文件的第一行有一个正偶数N(N≤200),表示待挑选的自然数的个数。第二行给出N个不超过30000的正整数,相邻的两个数之间用一个空格分开。
输出
对每个正整数,输出一个整数K,表示你求得的“最佳方案”组成“素数伴侣”的对数。
输入样例 输出样例
4 2
2 5 6 13 (25分)
一.
1.c
<textarea cols="50" rows="15" name="code" class="c-sharp">#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_LENGTH 100 void reverse(int interge) { int i, len; char tmp; char ss[MAX_LENGTH]; memset(ss, '/0', MAX_LENGTH); while(! (interge % 10)) interge /= 10; sprintf(ss, "%d", interge); len = strlen(ss); for( i = 0; i < len / 2; i++ ) tmp = ss[i], ss[i] = ss[len-1-i], ss[len-1-i] = tmp; printf("%s/n", ss); } void main() { int interge; int i; int num; scanf("%d", &num); for( i = 0; i < num; i++) { scanf("%d", &interge); reverse(interge); } } </textarea> .2.c
二.
2.c
<textarea cols="50" rows="15" name="code" class="c-sharp">#include <stdio.h> void omg(int interge) { int result = 0; while(interge >= 5) result += interge /= 5; printf("%d/n", result); } void main() { int num; int interge, i; scanf("%d", &num); for(i = 0; i < num; i++) { scanf("%d", &interge); omg(interge); } } </textarea>
三.
3.c
<textarea cols="50" rows="15" name="code" class="c-sharp">#include <stdio.h> #include <string.h> #define MAX_LENGTH 100000 void omg(char buf[]) { int len, i, j; int flag = 0; len = strlen(buf); for(i = 1; i <= len/2; i++) { for(j = 0; j < len-i; j++) { if(buf[j] != buf[j+i]) { flag = 1; break; } } if(flag == 0) { printf("%d/n", len/i); return; } flag = 0; } printf("1/n"); } void main() { char buf[MAX_LENGTH]; while( 1 ) { scanf("%s", buf); if(strcmp(buf, ".") == 0) break; omg(buf); } } </textarea>
四.
4.c
<textarea cols="50" rows="15" name="code" class="c-sharp">#include <stdio.h> #include <math.h> #define MAXN 200 #define X 1 //有星号的1 #define SCAN 2 //已扫描 #define MARK 4 //已标记 #define CIR 2 //圆圈标记 typedef struct state{ int s[MAXN]; int num[MAXN]; }STAT; int Srow[MAXN],Scol[MAXN]; //row行(奇数),col列(偶数) int ss[MAXN][MAXN]; /* {1,0,1,0,0,1,0}, {0,0,1,1,1,0,1}, {1,0,1,0,0,0,0}, {1,0,0,0,0,1,0}, {0,1,0,0,1,0,1}, {0,0,1,0,0,1,0}}; */ int stat[MAXN][MAXN]; //状态标记 STAT Rstat; //行状态 STAT Cstat; //列状态 void init2(int,int); void print(int,int); int maxset(int,int); int isss(int m)//判断素数 { int i,n = sqrt(m); if(m == 1 || m == 2) return 1; for(i = 2;i <= n;i++) if(!(m%i)) return 0; return 1; } int getjz(int row,int col) //构造0-1矩阵 { int i,j; for(i = 0;i < row;i++) for(j = 0;j < col;j++){ ss[i][j] = isss(Srow[i]+ Scol[j])?1:0; } } int init(int *row,int *col){//初始化输入 int i,j; int n; int temp; printf("n :"); scanf("%d",&n); for(i = 0;i < n;i++){ scanf("%d",&temp); if(temp%2) Srow[(*row)++] = temp; else Scol[(*col)++] = temp; } getjz(*row,*col); } //初始化星号标记 void init2(int row,int col) { int i,j; for(i = 0;i < row;i++){ for(j = 0;j < col;j++){ if(ss[i][j] && !Cstat.s[j]){ Cstat.s[j] = X; //列上做标记有星号的1 stat[i][j] = X; //总体标记 Rstat.s[i] = X; //行上做标记有星号的1 break; } } } //初始化完成 } int main(){ int row = 0,col = 0; int i,j; init(&row,&col); row = 4,col = 4; init2(row,col); print(row,col); for(i = 0;i < row;i++){ for(j = 0;j < col;j++) printf("%d",ss[i][j]); printf("/n"); } printf("/n/n"); while(maxset(row,col)); printf("/n/n"); //输出伴侣 for(i = 0;i < row;i++) for(j = 0;j < col;j++){ if(stat[i][j]) printf("%d,%d | ",Srow[i],Scol[j]); } printf("/n/n"); } int maxset(int row,int col) { int i,j,ii,jj; int boo1,boo2,isx; //开始 for(i = 0;i < row;i++) { Rstat.s[i] = Rstat.num[i] = 0; //行状态清空 for(j = 0;j < col;j++) //寻找带星号的行 if(stat[i][j]) { Rstat.s[i] = X; break; } } for(i = 0;i < col;i++) { Cstat.s[i] = Cstat.num[i] = 0; //列状态清空 for(j = 0;j < row;j++) //对不带星号的列做标记 if(stat[j][i]) break; if(j == row) Cstat.s[i] = MARK; } //printf("step2/n"); //扫描和标记 do{ //扫描列 boo1 = boo2 = isx = 0; for(i = 0;i < col;i++) if((Cstat.s[i] & MARK) == MARK && (Cstat.s[i] & SCAN) != SCAN){ //被标记,未扫描 for(j = 0;j < row;j++) //行是j if(ss[j][i] && !stat[j][i] && (Rstat.s[j] & MARK) != MARK){ //在列中寻找不带星号的1且行未被标记 Rstat.num[j] = i; //用列名标记该行 Rstat.s[j] |= MARK; } Cstat.s[i] |= SCAN; //已扫描 boo1 = 1; } //扫描行 for(i = 0;i < row;i++) if((Rstat.s[i] & X) == X && (Rstat.s[i] & MARK) == MARK && (Rstat.s[i] & SCAN) != SCAN){ //在已标记,未扫描的行中寻找带星号的1 for(j = 0;j < col;j++){ if(stat[i][j]){ //stat == 1则已经表示位置上有1且带星号 Cstat.num[j] = i; //行名称标记该列 Cstat.s[j] |= MARK; // printf("%d/n",i); isx = 1; } } Rstat.s[i] |= SCAN; //已扫描 boo2 = 1; } }while(isx || boo1 && boo2); //printf("step3/n"); //扩大独立集 boo1 = 0; for(i = 0;i < row;i++) { if((Rstat.s[i]&MARK) == MARK && (Rstat.s[i]&X) != X){ //是否存在已标记的行不包含带星号的1 boo1 = 1; for(j = 0;j < row;j++) if((Rstat.s[j]&MARK) == MARK && (Rstat.s[j]&X) != X){ //回溯到第一个已被标记且不带星号的1的行 jj = Rstat.num[j]; //查找行中对应的列 stat[i][jj] |= CIR; //先对该1的位置画圆圈标记 // printf("i:%d,j:%d/n",i,j); do{ //进入重复步凑 ii = Cstat.num[jj]; //查找列中对应的应该标记的行坐标 stat[ii][jj] |= CIR; //标记行列画圈 // printf("i:%d,j:%d/n",ii,jj); if((Cstat.s[jj] & MARK) == MARK && !Cstat.num[jj])break; //当标记了步凑1中的列,则跳出 jj = Rstat.num[ii]; //继续查找行中对应的列坐标 stat[ii][jj] |= CIR; if((Cstat.s[jj]&MARK) == MARK && !Cstat.num[jj])break; }while(1); // break; } //扩展独立集 for(i = 0;i < row;i++) for(j = 0;j < col;j++){ if((stat[i][j] & CIR) == CIR){ stat[i][j] &= ~CIR; if((stat[i][j] & X) == X) stat[i][j] &= ~X; else stat[i][j] |= X; } } break; } } if(!boo1){ return 0; } return 1; } void print(int row,int col){ int i,j; printf("/n/n"); for(i = 0;i < row;i++){ for(j = 0;j < col;j++) printf("%d",stat[i][j]); printf("/n"); } }</textarea>