求高手看看我这个代码错在哪里了。。///输入5个字符串倒置顺序,按由小到大的顺序输出(用指针做)

华为OJ系列(一)
新回复邮件提醒
作为游客留言:
支持用技术支持:当前位置: >>
数组 2: 题目 - 最长单词 2描述 输入一个以'.'结尾的简单英文句子,单词之间用空格分隔,没有缩写形式和其它特殊 形式;输出该句子中最长的单词。 关于输入 一个以'.'结尾的简单英文句子,单词之间用空格分隔,没有缩写形式和其它特殊形式 关于输出 该句子中最长的单词。如果多于一个,则输出第一个 例子输入I am a student of Peking University.例子输出University提交程序#include&stdio.h& #include&string.h& int main() { int i=0,j=0,t=0,p; char str[100][100]={&&},max[100]=&&,result[100]=&&; for(i=0;;i++) { for(j=0;;j++) {scanf(&%c&,&str[i][j]); if (str[i][j]==' ') if(str[i][j]=='.') } if(str[i][j]=='.') } strncpy(max,str[i],j); for(t=0;t&i;t++) {if(strlen(str[t])&strlen(max)) strcpy(max,str[t]);} if(strlen(max)==(strlen(str[i])-1)) printf(&%s&,max); else {p=strlen(max)-1; strncpy(result,max,p); printf(&%s&,result);} }All in All描述 给定两个字符串 s 和 t,判断 s 是否是 t 的子序列。即从 t 中删除一些字符,将剩余的 字符连接起来,即可获得 s。s 和 t 都由 ASCII 码的数字和字母组成,且长度不超过 100000。 关于输入 输入为两行字符串序列,第一行为字符串 s,第二行为字符串 t。 关于输出 若是子序列,输出 yes,否则输出 no 例子输入ab125a3b1et925例子输出yes #include &stdio.h& #include &string.h& int main() { char str1[100005],str2[100005]; while(~scanf(&%s%s&,str1,str2)) { if(strstr(str2,str1)) { printf(&yes\n&); } int len1,len2,i,j,cnt = 0, len1 = strlen(str1); len2 = strlen(str2); for(i = 0; i&len1; i++) { flag = 1; for(j = 0; j&len2; j++) { if(str1[i] == str2[j]) { cnt++; flag = 0; strcpy(str2,str2+j+1); // puts(str2); len2 = strlen(str2); } } if(flag) { } } if(flag) { printf(&no\n&); } if(cnt == len1) printf(&yes\n&); else printf(&no\n&); } return 0; } 习题(12-6) 回文子串描述 给定一个字符串,输出所有回文子串。 回文子串即从左往右输出和从右往左输出结果是一样的字符串 比如: abba cccdeedccc 都是回文字符串我们要查找的子串长度应该大于等于 2 关于输入 输入是一行,即可一个字符串。长度 500 以内 比如: abcddcbaab 关于输出 输出所有的回文子串,一个满足条件的子串一行。 子串长度小的优先输出,出现在原始字符串靠左的子串优先输出。 比如对于 abcddcbaab 输出: dd aa cddc baab bcddcb abcddcba 例子输入165561例子输出33 1177552332211257756556123321165561提示 (此题与红与黑选做一题)#include&stdio.h& #include&string.h& int main() { char s[501]=&&,temp[501]={&&},temp1[501]={&&}; int i=0,j=0,r=0,p=0,q=0, gets(s); num=strlen(s); for(i=2;i&=i++) for(j=0;j&=strlen(s)-i;j++) { p=j; for(r=0;r&i;r++) { temp[r]=s[p]; p++; } for(q=0;q&i;q++) { temp1[q]=temp[i-q-1]; } if(strcmp(temp1,temp)==0) printf(&%s\n&,temp); } }字符串最大跨距来源 描述 有三个字符串 S,S1,S2,其中,S 长度不超过 300,S1 和 S2 的长度不超过 10,想检测 S1 和 S2 是否同时在 S 中出现,且 S1 位于 S2 的左边,并在 S 中互不交叉(即,S1 的右边 界点在 S2 的左边界点的左侧)。计算满足上述条件的最大跨距(即,最大间隔距离: 最右边的 S2 的起始点与最左边的 S1 的终止点之间的字符数目)。如果没有满足条件的 偶对 S1,S2 存在,则输出 -1 元培-From Whf例如,S = &abcd123ab888efghij45ef67kl&, S1=&ab&, S2=&ef&,其中,S1 在 S 中出现 了 2 次,S2 也在 S 中出现了 2 次,最大跨距则为:18 关于输入 三个串:S1, S2, S3,其间以逗号间隔(注意,S1, S2, S3 中均不含逗号); 关于输出 S1 和 S2 在 S 最大跨距;若在 S 中没有满足条件的 S1 和 S2,则输出-1 例子输入 abcd123ab888efghij45ef67kl,ab,ef例子输出18 #include&stdio.h& #include&string.h& int main() { char s[301]=&&,s1[11]=&&,s2[11]=&&; int i=0,t=0,j=0,r=0,p=0,a=0,b=0,c; for(i=0;;i++) { scanf(&%c&,&s[i]); if(s[i]==','){s[i]='\0';} } for(i=0;;i++) { scanf(&%c&,&s1[i]); if(s1[i]==',') {s1[i]='\0';} } for(i=0;;i++) { scanf(&%c&,&s2[i]); if(s2[i]=='\n') {s2[i]='\0';} }//输入 i=0;j=0; for(;i&strlen(s);i++) { if(j==strlen(s1)) {a=i;} if(s[i]==s1[j]) j++; else {j=0;p++;i=p-1;} } i=strlen(s)-1; j=strlen(s2)-1; p=strlen(s)-1; for(;i&=0;i--) { if(j&=0) { b=i+1;} if(s[i]==s2[j]) j--; else {j==strlen(s2)-1;p--;i=p;} }//找到 s1s2 在 s 中的位置c=b-a-1; //求间距 if(c&=0) printf(&%d\n&,c); else printf(&-1\n&); }有年代的病历单来源 描述 小英是药学专业大三的学生,暑假期间获得了去医院药房实习的机会。 在药房实习期间,小英扎实的专业基础获得了医生的一致好评,得知小英在计算概论中 取得过好成绩后,主任又额外交给她一项任务,解密抗战时期被加密过的一些伤员的名 单。 经过研究,小英发现了如下加密规律(括号中是例子) 1. 原文中所有的字符都被循环左移了三个单位(dec 2. 逆序存储(abcd -& dcba ) 3. 大小写反转(abXY -& ABxy) 关于输入 共 n+1 行 第一行是名单中名字的个数 n(1&=n &= 1000) 随后是 n 行,每行是一个加密的字符串。(串长小于 12) -& abz) 医学部计算概论 2011 年期末考试(王志钢) 关于输出 n行 按照字典顺序输出解密后的字符串 例子输入5 WDDFSSP SDSDSDDo SDKGGFSIa LLLHFGFOl GSOOWFASOq例子输出Dlvijjngv Orijikooo Rggvgvgv Trvdizrrvj svviggz #include&stdio.h& #include&string.h& int main() { int n=0,i=0,j=0; char s[1001][13]={&&},t[1001][13]={&&},temp[1001][13]={&&}; scanf(&%d\n&,&n); for(i=0;i&n;i++) gets(s[i]); //printf(&\n&); for(i=0;i&n;i++) {for(j=0;j&strlen(s[i]);j++) if(s[i][j]&=90) s[i][j]+=32; else s[i][j]-=32;} for(i=0;i&n;i++) for(j=0;j&strlen(s[n-1-i]);j++) t[i][j]=s[n-1-i][strlen(s[n-1-i])-1-j]; // for(i=0;i&n;i++) //printf(&%s\n&,t[i]); //printf(&\n&); for(i=0;i&n;i++) {for(j=0;j&strlen(t[i]);j++) if(t[i][j]==88||t[i][j]==120||t[i][j]==89||t[i][j]==121||t[i][j]==90| |t[i][j]==122) t[i][j]-=23; else t[i][j]+=3;}for(i=0;i&n;i++) for(j=0;j&n-i-1;j++) { if(strcmp(t[j],t[j+1])&0) { strcpy(temp[j],t[j]); strcpy(t[j],t[j+1]); strcpy(t[j+1],temp[j]);} } for(i=0;i&n;i++) printf(&%s\n&,t[i]); }寻找平面上的极大点来源 描述 在一个平面上,如果有两个点(x,y),(a,b),如果说(x,y)支配了(a,b),这是指 x&=a,y&=b; 用图形来看就是(a,b)坐落在以(x,y)为右上角的一个无限的区域内。 给定 n 个点的集合,一定存在若干个点,它们不会被集合中的任何一点所支配,这些点 叫做极大值点。 编程找出所有的极大点,按照 x 坐标由小到大,输出极大点的坐标。 本题规定:n 不超过 100,并且不考虑点的坐标为负数的情况。 关于输入 POJ 3703 输入包括两行,第一行是正整数 n,表示是点数,第二行包含 n 个点的坐标,坐标值都 是整数,坐标范围从 0 到 100,输入数据中不存在坐标相同的点。 关于输出 按 x 轴坐标最小到大的顺序输出所有极大点。 输出格式为:(x1,y1),(x2,y2),...(xk,yk) 注意: 输出的每个点之间有&,&分隔,最后一个点之后没有&,&,少输出和多输出都会被判 错 例子输入51 2 2 2 3 1 2 3 1 4例子输出(1,4),(2,3),(3,1) #include&stdio.h& int main() { int n=0,i=0,j=0,r=0,p=0,x[101]={0},y[101]={0},maxx[101]={0},maxy[101]={0} ,temp1,temp2; scanf(&%d\n&,&n); for(i=0;i&n;i++) scanf(&%d %d&,&x[i],&y[i]); //for(i=0;i&n;i++) //printf(&(%d,%d)&,x[i],y[i]); for(i=0;i&n;i++) { for(j=0;j&n;j++) {if((x[i]&x[j])||(y[i]&y[j])) r++;} if(r==n-1) {maxx[p]=x[i];maxy[p]=y[i];p++;} r=0; } //for(i=0;i&p;i++) //printf(&(%d,%d)&,maxx[i],maxy[i]); for(i=0;i&p;i++) for(j=0;j&p-i-1;j++) { if(maxx[j]&maxx[j+1]) { temp1=maxx[j]; maxx[j]=maxx[j+1]; maxx[j+1]=temp1; temp2=maxy[j]; maxy[j]=maxy[j+1]; maxy[j+1]=temp2;} } printf(&(%d,%d)&,maxx[0],maxy[0]); for(i=1;i&p;i++) printf(&,(%d,%d)&,maxx[i],maxy[i]); }旋转输出矩阵来源 描述 给定一个 N*N 的矩阵,假设从左上角开始,旋转着依次输出矩阵中的每个元素,那么, 一个 5*5 的矩阵,会按照下面的顺序输出。 计算概论助教陈峰宏(周明辉班)当然,这是个作业题。现在要求更进一步,假设根据上述方案,我们需要从开头(左上 角)和结尾(中心,也就是原来的顺序中最后一个数)按照一正一反的顺序依次输出矩 阵中的元素。也就是说,5*5 的矩阵,会按照下面的顺序输出给定你该矩阵,请按照上述方式输出矩阵中的每个元素 关于输入 第一行一个数 N 接下来 N 行,每行 N 个数(用空格分隔),描述了该 N*N 的矩阵 数据范围:1&=N&=100 关于输出 一行,N*N 个数,用空格分隔。按照上述顺序输出的矩阵的每个元素 例子输入4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16例子输出1 10 2 11 3 7 4 6 8 5 12 9 16 13 15 14 #include&stdio.h& int main() { int a[100][100]={0},i=0,j=0,t=0,r,s,q,p,m,n,x[10000]={0},y[10000]={0}; scanf(&%d&,&n); for(i=0;i&n;i++) for(j=0;j&n;j++) scanf(&%d&,&a[i][j]); //只读出一圈(从易到难) if(n==1) { printf(&%d\n&,a[0][0]); } else if(n%2==0) { for(r=0;n-2*r-1&=1;r++) { for(j=r;j&n-1-r;j++) {x[t]=a[r][j]; t++;} for(i=r;i&n-1-r;i++) {x[t]=a[i][n-1-r]; t++;} for(j=n-1-r;j&r;j--) {x[t]=a[n-1-r][j]; t++;} for(i=n-1-r;i&r;i--) {x[t]=a[i][r]; t++;} } for(s=0;s&t;s++) y[s]=x[t-1-s]; printf(&%d %d&,x[0],y[0]); for(q=1;;q++) { printf(& %d %d&,x[q],y[q]); if(q==t/2-1) } t=0; } else if(n%2!=0) { for(r=0;n-2*r-1&=1;r++) { for(j=r;j&n-1-r;j++) {x[t]=a[r][j]; t++;} for(i=r;i&n-1-r;i++) {x[t]=a[i][n-1-r]; t++;} for(j=n-1-r;j&r;j--) {x[t]=a[n-1-r][j]; t++;} for(i=n-1-r;i&r;i--) {x[t]=a[i][r]; t++;} } x[t]=a[(n-1)/2][(n-1)/2]; for(s=0;s&=t;s++) y[s]=x[t-s]; for(q=0;;q++) { printf(&%d %d &,x[q],y[q]); if(q==t/2-1) } printf(&%d\n&,x[(t-1)/2+1]); } }生日相同 2.0 版本描述 在一个有 180 人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名 字,出生月日。试找出所有生日相同的学生。 关于输入 第一行为整数 n,表示有 n 个学生,n ≤ 180。此后每行包含一个字符串和两个整数, 分别表示学生的名字(名字第一个字母大写,其余小写,不含空格,且长度小于 20)和 出生月(1 ≤ m ≤ 12)日(1 ≤ d ≤ 31)。名字、月、日之间用一个空格分隔 关于输出 每组生日相同的学生,输出一行,其中前两个数字表示月和日,后面跟着所有在当天出 生的学生的名字,数字、名字之间都用一个空格分隔。对所有的输出,要求按日期从前 到后的顺序输出。 对生日相同的名字,按名字从短到长按序输出,长度相同的按字典 序输出。如没有生日相同的学生,输出”None” 例子输入6Avril 3 2Candy 4 5Tim 3 2Sufia 4 5Lagrange 4 5Bill 3 2例子输出3 2 Tim Bill Avril4 5 Candy Sufia Lagrange #include&stdio.h& #include&string.h& struct birthday { char name[21]; } p[181];int main() { struct birthday p[180]; int i,j,n,t=0,s=0,l=0,q=0,k=0,r=0,a[180][2]={0},temp2=0,temp3=0; char same[181][21]={&&},temp[21],temp1[21]; scanf(&%d\n&,&n); for(i=0;i&n;i++) scanf(&%s %d %d&,p[i].name,&p[i].month,&p[i].day); for(i=0;i&n-1;i++) for(j=0;j&n-1-i;j++) { if(p[j].month&p[j+1].month) { strcpy(temp1,p[j].name);strcpy(p[j].name,p[j+1].name);strcpy(p[j+1].n ame,temp1); temp2=p[j].p[j].month=p[j+1].p[j+1].month=temp2; temp3=p[j].p[j].day=p[j+1].p[j+1].day=temp3; } else if(p[j].month==p[j+1].month&&p[j].day&p[j+1].day) { strcpy(temp1,p[j].name);strcpy(p[j].name,p[j+1].name);strcpy(p[j+1].n ame,temp1); temp2=p[j].p[j].month=p[j+1].p[j+1].month=temp2; temp3=p[j].p[j].day=p[j+1].p[j+1].day=temp3; } } for(i=0;i&n;i++) { r=0;l=0; for(j=i+1;j&n;j++) { if(p[i].month==0) if(p[i].month==p[j].month&&p[i].day==p[j].day) { r++; p[j].month=0; strcpy(same[l],p[j].name); l++; k++; } } if(r&0) { printf(&%d %d&,p[i].month,p[i].day); strcpy(same[l],p[i].name); for(t=0;t&=l-1;t++) for(s=0;s&=l-1-t;s++) { if(strlen(same[s])&strlen(same[s+1])||(strlen(same[s])==strlen(same[s +1])&&same[s][0]&same[s+1][0])||(strlen(same[s])==strlen(same[s+1])&& same[s][0]==same[s+1][0]&&same[s][1]&same[s+1][1])||(strlen(same[s])= =strlen(same[s+1])&&same[s][0]==same[s+1][0]&&same[s][1]==same[s+1][1 ]&&same[s][2]&same[s+1][2])||(strlen(same[s])==strlen(same[s+1])&&sam e[s][0]==same[s+1][0]&&same[s][1]==same[s+1][1]&&same[s][2]==same[s+1 ][2]&&same[s][3]&same[s+1][3])) {strcpy(temp,same[s]);strcpy(same[s],same[s+1]);strcpy(same[s+1],temp );} }for(t=0;t&=l;t++) printf(& %s&,same[t]); //for(r=0;r&=j;r++) //same[r][21]={&&}; printf(&\n&); } } if(k==0) printf(&None&); } 函数: 提取数字串按数值排序来源 描述 输入一串不超过 300 个字符的符号序列,请将其中的所有数字串提出,并将每个数字串 作为整数看待(假设可以用 int 表示),按从小到大顺序输出结果,输出的整数之间以 逗号间隔。如果没有数字,则输出 0;例如: *1ad9jk81-11101?aght88ir09kp,其中的整数包括:,6781,9, 81,1,从小到大排序后,应该输出: 9,9,81,88,345,,11101 关于输入 在一行内输入一串符号 关于输出 从小到大排序的整数序列,如果没有数字,则输出 0; 例子输入 元培-From Whf*1ad9jk81-11101?aght88ir09kp例子输出9,9,81,88,345,101 #include&stdio.h& #include&string.h& #include&math.h& int main() { char * * getnumbertype(char s1[301]); void numberchange(char s2[301][301],int a[301]); int i,j,p=0,r,s,t,temp1=0,temp2,a[301]={0},n=0; char s1[301]={&&},s2[301][301]={&&}; gets(s1); for(p=0;p&strlen(s1);p++) {if(s1[p]!='0'&&s1[p]!='1'&&s1[p]!='2'&&s1[p]!='3'&&s1[p]!='4'&&s1[p] !='5'&&s1[p]!='6'&&s1[p]!='7'&&s1[p]!='8'&&s1[p]!='9') temp1++;} if(strlen(s1)==0) printf(&0\n&); else if(temp1==strlen(s1)) printf(&0\n&); else { memcpy(s2,getnumbertype(s1),sizeof(s2)); numberchange(s2,a);while(a[n]!=0) {n++;} for(i=0;i&n-1;i++) for(j=0;j&n-1-i;j++) { if(a[j]&a[j+1]) {temp1=a[j];a[j]=a[j+1];a[j+1]=temp1;} } printf(&%d&,a[0]); for(i=1;i&n;i++) printf(&,%d&,a[i]); } } char * * getnumbertype(char s1[301]) { int i,j,p=0; char s2[301][301]={&&}; for(i=0;;i++) { for(j=0;;j++) { if(p==strlen(s1)) if(j==0&&s1[p]!='0'&&s1[p]!='1'&&s1[p]!='2'&&s1[p]!='3'&&s1[p ]!='4'&&s1[p]!='5'&&s1[p]!='6'&&s1[p]!='7'&&s1[p]!='8'&&s1[p]!='9') {j=-1;p++;} if(j!=0&&s1[p]!='0'&&s1[p]!='1'&&s1[p]!='2'&&s1[p]!='3'&&s1[p ]!='4'&&s1[p]!='5'&&s1[p]!='6'&&s1[p]!='7'&&s1[p]!='8'&&s1[p]!='9') {p++;} s2[i][j]=s1[p]; p++; } if(p==strlen(s1)) } return(s2); } void numberchange(char s2[301][301],int a[301]) { int i=0,j; while(s2[i][0]!=0) { j=0; while(s2[i][j]!=0) { a[i]+=pow(10,strlen(s2[i])-j-1)*((int)(s2[i][j])-48); j++; } i++; } return(a); }1140 最短前缀来源 描述 一个字符串的前缀是从该字符串的第一个字符起始的一个子串。例如 &carbon&的字串 是: &c&, &ca&, &car&, &carb&, &carbo&, 和 &carbon&。注意到这里我们不认为空串 是字串, 但是每个非空串是它自身的字串. 我们现在希望能用前缀来缩略的表示单词。 例如, &carbohydrate& 通常用&carb&来缩略表示. 现在给你一组单词, 要求你找到唯 一标识每个单词的最短前缀 在下面的例子中,&carbohydrate& 能被缩略成&carboh&, 但是不能被缩略成&carbo& 2797 (或其余更短的前缀) 因为已经有一个单词用&carbo&开始 一个精确匹配会覆盖一个前缀匹配,例如,前缀&car&精确匹配单词&car&. 因此 &car& 是 &car&的缩略语是没有二义性的 , “car”不会被当成&carriage&或者任何在列表中 以&car&开始的单词. 关于输入 输入包括至少 2 行,至多 1000 行. 每行包括一个以小写字母组成的单词,单词长度至 少是 1,至多是 20. 关于输出 输出的行数与输入的行数相同。每行输出由相应行输入的单词开始,后面跟着一个空格 接下来是相应单词的没有二义性的最短前缀标识符。 例子输入carbohydratecartcarburetorcaramelcariboucarboniccartilagecarboncarriage cartoncarcarbonate例子输出carbohydrate carbohcart cartcarburetor carbucaramel caracaribou caricarbonic carbonicartilage carticarbon carboncarriage carrcarton cartocar car carbonate carbona #include&stdio.h& #include&string.h& int main() { char s[1001][21]={&&},temp={&&}; int t=0,i=0,j=0,k=0,r=0,c,max=0; do {gets(s[t]);t++;} while(s[t-1][0]); // printf(&%s\n&,s[1]); for(i=0;i&t;i++) { for(r=0;r&t;r++) { for(j=0;;) { if(r==i) if(s[i][j]==s[r][j]) {j++;if(j&max) max=j;} if(j==strlen(s[i])||j==strlen(s[r])) } } if(max==strlen(s[i])||strlen(s[i])==1) printf(&%s %s\n&,s[i],s[i]); else if(max==0) printf(&%s %c\n&,s[i],s[i][0]); else { printf(&%s &,s[i]); for(k=0;k&max+1;k++) printf(&%c&,s[i][k]); printf(&\n&); } max=0; j=0; } } 循环移动来源 描述 给定一组整数,要求利用数组把这组数保存起来,然后实现对数组的循环移动。假定供 有 n 个整数,则要使前面各数顺序向后移 m 个位置,并使最后 m 个数变为最前面的 m 个 数(m&n)。 POJ 2682,PG1038注意,不要用先输出后 m 个数,再输出前 n-m 个数的方法实现,也不要用两个数组的方 式实现。要求只用一个数组的方式实现,一定要保证在输出结果时,输出的顺序和数组中数的顺 序是一致的。在学习完指针后,再用动态数组及指针方式实现对数组的循环移动。 关于输入 输入有两行:第一行包含一个正整数 n(n&=100)和一个正整数 m,第二行包含 n 个正整 数。每两个正整数中间用一个空格分开。 关于输出 输出有一行: 经过循环移动后数组中整数的顺序依次输出, 每两个整数之间用空格分隔。 例子输入11 415 3 76 67 84 87 13 67 45 34 45例子输出67 45 34 45 15 3 76 67 84 87 13提示 #include&stdio.h& int main() { int i,j,n,m,a[101]={0},b[101]={0}; scanf(&%d %d&,&n,&m); for(i=0;i&n;i++) scanf(&%d&,&a[i]); for(i=0,j=m;i&n-m;i++) {b[j]=a[i];j++;} for(i=n-m,j=0;j&m;j++) {b[j]=a[i];i++;} printf(&%d&,b[0]); for(i=1;i&n;i++) printf(& %d&,b[i]);}习题(9-4) 区间内的真素数来源 描述 计算正整数 M 和 N 之间(N 不小于 M)的所有真素数。 元培-From Whf真素数的定义:如果一个正整数 P 为素数,且其反序也为素数,那么 P 就为真素数。 例如,11,13 均为真素数,因为 11 的反序还是为 11,13 的反序为 31 也为素数。 关于输入 输入两个数 M 和 N,空格间隔,N 值不超过 5 位。 关于输出 按从小到大输出 M 和 N 之间(包括 M 和 N )的真素数,逗号间隔。如果之间没有真 素数,则输出 No ; 例子输入10 35例子输出11,13,17,31 #include&stdio.h& #include&math.h& int main() { int realsushu(int a); int m,n,i,j,t; scanf(&%d%d&,&m,&n); for(i=m,t=0;i&=n;i++) { if(realsushu(i)!=0) {printf(&%d&,realsushu(i));t++;}} for(j=i+1;j&=n;j++) { if(realsushu(j)!=0) {printf(&,%d&,realsushu(j));t++;}} if(t==0) printf(&No\n&); }int realsushu(int a) { int b=0,i,r,t=0,p=0; for(i=a;i&0;i=i/10) b=10*b+i%10; for(i=2;i&=a/2;i++) {if(a%i==0) t++;} for(i=2;i&=b/2;i++) {if(b%i==0) p++;} if(t==0&&p==0) r=a; else r=0; }习题(14-4) 距离排序 来源 描述POJ 3702给出三维空间中的 n 个点(不超过 10 个),求出 n 个点两两之间的距离,并按距离由大 到小依次输出两个点的坐标及它们之间的距离。 关于输入 输入包括两行,第一行包含一个整数 n 表示点的个数,第二行包含每个点的坐标(坐标 都是整数)。点的坐标的范围是 0 到 100,输入数据中不存在坐标相同的点。 关于输出 对于大小为 n 的输入数据,输出 n*(n-1)/2 行格式如下的距离信息: (x1,y1,z1)-(x2,y2,z2)=距离 其中距离保留到数点后面 2 位。 例子输入40 0 0 1 0 0 1 1 0 1 1 1例子输出(0,0,0)-(1,1,1)=1.73(0,0,0)-(1,1,0)=1.41(1,0,0)-(1,1,1)=1.41(0,0,0)-(1,0,0)=1.00(1,0,0)-(1,1,0)=1.00(1,1,0)-(1,1,1)=1.00提示 注意: 冒泡排序满足下面的性质,选择排序和快速排序(qsort 或 sort)需要对下面的情况进行 额外处理 使用冒泡排序时要注意边界情况的处理,保证比较的两个数都在数组范围内1. 对于一行输出中的两个点(x1,y1,z1)和(x2,y2,z2),点(x1,y1,z1)在输入数据中应 出现在点(x2,y2,z2)的前面。比如输入: 2 0 0 0 1 1 1 输出是: (0,0,0)-(1,1,1)=1.73 但是如果输入: 2 1 1 1 0 0 0 输出应该是: (1,1,1)-(0,0,0)=1.732. 如果有两对点 p1,p2 和 p3,p4 的距离相同,则先输出在输入数据中靠前的点对。比如输入: 3 0 0 0 0 0 1 0 0 2 输出是: (0,0,0)-(0,0,2)=2.00 (0,0,0)-(0,0,1)=1.00 (0,0,1)-(0,0,2)=1.00 如果输入变成: 3 0 0 2 0 0 1 0 0 0 则输出应该是: (0,0,2)-(0,0,0)=2.00 (0,0,2)-(0,0,1)=1.00 (0,0,1)-(0,0,0)=1.00#include&stdio.h& #include&math.h& /*struct distance { int a[10]={0}; int b[10]={0}; int c[10]={0}; double d[10][10]={0}; } */ int main() { int n,i,j,im,jm,a[10]={0},b[10]={0},c[10]={0}; double d[10][10]={0},max=0; scanf(&%d\n&,&n); scanf(&%d%d%d&,&a[0],&b[0],&c[0]); for(i=1;i&n;i++) scanf(& %d%d%d&,&a[i],&b[i],&c[i]); // printf(&%d%d%d\n&,a[1],b[1],c[1]); for(i=0;i&n;i++) for(j=0;j&n;j++) d[i][j]=sqrt((a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j])+(c[i]-c[ j])*(c[i]-c[j])); // printf(&%lf\n&,d[0][3]); im=-1;jm=-1; for(;;) { max=0; for(i=0;i&n;i++) { for(j=i+1;j&n;j++) { if(d[i][j]&max) {max=d[i][j];im=i;jm=j;} } // printf(&%d %d &,im,jm); //printf(&%d &,max); } if(im==-1&&jm==-1) if(im&=jm) {im=-1;jm=-1;} printf(&(%d,%d,%d)-(%d,%d,%d)=%.2lf\n&,a[im],b[im],c[im],a[jm],b[jm], c[jm],d[im][jm]); d[im][jm]=0;im=-1;jm=-1; } for(i=0;i&n;i++) for(j=0;j&n;j++) { if((int)d[i][j]==0) else printf(&(%d,%d,%d)-(%d,%d,%d)=%.2lf\n&,a[i],b[i],c[i],a[j],b[j],c[j], d[i][j]); }*/ } /*用函数实现 Fibonacci 数列来源 描述 用函数实现 Fibonacci 数列:0,1,1,2,3,5,8,13,21,?? 关于输入 主函数中输入项数 n。 关于输出 输出 Fibonacci 数列的第 n 项值。 例子输入 计算概论 07(工学院)?周文灵4 例子输出2提示 必须用函数实现!#include&stdio.h& int main() { int fibo(int n); int n, scanf(&%d\n&,&n); result=fibo(n); printf(&%d\n&,result); } int fibo(int n) { if(n==1) result=0; else if(n==2) result=1; else result=fibo(n-1)+fibo(n-2); return(result); }1090 分解因数描述 给出一个正整数 a,要求分解成若干个正整数的乘积,即 a = a1 * a2 * a3 * ... * an, 并且 1 & a1 &= a2 &= a3 &= ... &= an,问这样的分解的种数有多少。注意到 a = a 也是一种分解。 关于输入 第 1 行是测试数据的组数 n,后面跟着 n 行输入。每组测试数据占 1 行,包括一个正整 数 a (1 & a & 32768) 关于输出 n 行,每行输出对应一个输入。输出应是一个正整数,指明满足要求的分解的种数 例子输入 2220例子输出14 #include&stdio.h& #include&math.h& int f(int q,int x) { if(q&x) { int i,k,p, k=0;sum=0;p=0; for(i=q;i&=x/2;i++) if(x%i==0) k=k+1; if(k==0) return 1; else { for(i=q;i&=sqrt(x);i++) if(x%i==0)sum=sum+f(i,x/i); return sum+1; p=0; sum=0; } } else {if(q==x) return 1; else return 0;} } int main() { int n,i,x, scanf(&%d&,&n); for(i=0;i&n;i++) { scanf(&%d&,&x); sum=f(2,x); printf(&%d\n&,sum); } }习题(15-2) 硬币面值组合描述 使用 1 角、2 角、5 角硬币组成 n 角钱。 设 1 角、2 角、5 角的硬币各用了 a、b、c 个,列出所有可能的 a, b, c 组合。 输出顺序为,按 c 的值从小到大,c 相同的按 b 的值从小到大输出。 要求必须使用递归。 关于输入 输入只有一个整数 n(1 &= n &= 100),代表需要组成的钱的角数。 关于输出 输出有若干行,每行的形式为: i a b c第 1 列 i 代表当前行数 (行数从 001 开始, 固定 3 个字符宽度, 宽度不足 3 的用 0 填充) , 后面 3 列 a, b, c 分别代表 1 角、2 角、5 角硬币的个数(每个数字固定 12 个字符宽度, 宽度不足的在左边填充空格) 例子输入10例子输出0011000 002810003620004430005240006050007501008311009121010002提示 cout && setfill('0')可以设置填充字符为'0'; 设完之后记得调用 setfill(' ')设回空格,否则会影响后续输出。#include &stdio.h& void main() {//用于用户输入的分钱数 int x,y,z;//x 是 1 分,y 是 2 分,z 是 5 分(硬币个数) int num=0;//用于保存有多少种方法 scanf(&%d&,&n); for(z=0;z&=n/5;z++) for(y=0;y&=n/2;y++) for(x=0;x&=n;x++) { if(x+2*y+5*z==n) { printf(&%03d%12d%12d%12d\n&,num+1,x,y,z); num++; } } }递归法: #include&stdio.h& int n,b=0,c=0,i=0; void calc(int m) { if(m&=0) { i++; printf(&%03d%12d%12d%12d\n&,i,n-2*b-5*c,b,c); } if(m&2) { b=0; c++; if(n-5*c&0) calc(n-5*c); } else { b++; calc(m-2); } } int main() { scanf(&%d&,&n); calc(n); }指针: 数组逆序 来源 描述计算概论 05将一个数组中的值按逆序重新存放。例如,原来的顺序为 8,6,5,4,1。要求改为 1,4,5,6,8。 关于输入 输入为两行:第一行数组中元素的个数 n(1 & n & 100),第二行是 n 个整数,每两个 整数之间用空格分隔。 关于输出 输出为一行:输出逆序后数组的整数,每两个整数之间用空格分隔。 例子输入58 6 5 4 1例子输出1 4 5 6 8 #include&stdio.h& int main() { void swap(int *pt1,int *pt2); int *pt1,*pt2; int a[100],n,i; scanf(&%d&,&n); for(i=0;i&n;i++) scanf(&%d&,&a[i]); if(n%2==0){ for(i=0;i&n/2;i++){ pt1=&a[i]; pt2=&a[n-1-i]; swap(pt1,pt2); } } else{ for(i=0;i&n/2;i++){ pt1=&a[i]; pt2=&a[n-1-i]; swap(pt1,pt2); } } printf(&%d&,a[0]); for(i=1;i&n;i++) printf(& %d&,a[i]); } void swap(int *pt1,int *pt2) { temp=*pt1; *pt1=*pt2; *pt2= }向量内积描述 给定两个向量,v1 和 v2.计算他们的内积 = v1(1)*v2(1)+v1(2)*v2(2)+...+v1(n)*v2(n) 要求用函数实现,并且熟悉函数的调用 提示: 函数的的声明可以这么写 int product( int* vec1, int* vec2, int N ) 或者 int product( int vec1[], int vec2[], int N ) 关于输入 输入第一行是 n,表示两个向量的长度是 n(1&=n&=10) 接来下的两行是两个长度为 n 的向量,向量每一维均为 int 型 比如 3 1 2 3 2 3 4 关于输出 输出一个数字,即向量的内积 20 例子输入31 2 32 3 4例子输出20 #include&stdio.h& int main() { int product(int * p1,int * p2); int *p1,*p2,n,v1[10]={0},v2[10]={0},sum=0,i; scanf(&%d&,&n); for(i=0;i&n;i++) scanf(&%d&,&v1[i]); for(i=0;i&n;i++) scanf(&%d&,&v2[i]); for(i=0;i&n;i++) { p1=&v1[i]; p2=&v2[i]; sum+=product(p1,p2); } printf(&%d\n&,sum); } int product(int * p1,int * p2) { m=(* p1)*(* p2);
}计算矩阵边缘元素之和来源 描述 输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行 和最后一行的元素以及第一列和最后一列的元素。 关于输入 第一行为整数 k,表示有 k 组数据。 每组数据有多行组成,表示一个矩阵: 第一行分别为矩阵的行数 m 和列数 n(m&100,n&100),两者之间以空格分隔。 接下来输入的 m 行数据中,每行包含 n 个整数,整数之间以空格作为间隔。 关于输出 输出对应矩阵的边缘元素和,一个一行。 例子输入 //24 41 1 1 10 0 0 01 0 1 00 0 0 0 3 33 4 13 7 12 0 1例子输出515 #include&stdio.h& int main() { // int array_edge_sum(int * b,int m,int n); int i,j,t,r,k,m,n,a[1000]={0},b[100][100]={0},sum=0; scanf(&%d&,&k); for(i=0;i&k;i++){ scanf(&%d%d&,&m,&n); for(t=0;t&m;t++){ for(r=0;r&n;r++){ scanf(&%d&,&b[t][r]); if(r==n-1) scanf(&\n&);} } if(m==1) {for(j=0;j&=n-1;j++) sum+=b[0][j]; *(a+i)=} else if(n==1) {for(j=0;j&=m-1;j++) sum+=b[j][0]; *(a+i)=} else { for(j=0;j&n-1;j++) sum+=*(b[0]+j); for(j=0;j&m-1;j++) sum+=*(b[j]+n-1); for(j=n-1;j&0;j--) sum+=*(b[m-1]+j); for(j=m-1;j&0;j--) sum+=*(b[j]+0); } *(a+i)= sum=0; } for(i=0;i&k;i++) printf(&%d\n&,*(a+i)); }输出亲朋字符串描述 编写程序,求给定字符串 s 的亲朋字符串 s1。亲朋字符串 s1 定义如下: 给定字符串 s 的第一个字符的 ASCII 值加第二个字符的 ASCII 值, 得到第一个亲朋字符;给定字符串 s 的第二个字符的 ASCII 值加第三个字符的 ASCII 值,得到第二个亲朋字符;依此类推,直到给定字符串 s 的倒数第二个字符。亲朋字符 串的最后一个字符由给定字符串 s 的最后一个字符 ASCII 值加 s 的第一个字符的 ASCII 值。 关于输入 输入为一个字符串,字符串的长度大于等于 2,小于等于 100 关于输出 输出为变换后的亲朋字符串 例子输入1234例子输出cege #include&stdio.h& #include&string.h& int main() { char s1[101]={&&},s2[101]={&&}; int i,n; gets(s1); n=strlen(s1); for(i=0;i&strlen(s1)-1;i++) *(s2+i)=*(s1+i)+*(s1+i+1); *(s2+n-1)=*(s1+n-1)+*(s1+0); puts(s2); }验证子串来源 描述 输入两个字符串,验证其中一个串是否为另一个串的子串 关于输入 两个字符串 关于输出 若第一个串 s1 是第二个串 s2 的子串,则输出(s1) is substring of (s2) 否则,若第二个串 s2 是第一个串 s1 的子串,输出(s2) is substring of (s1) 否则,输出 No substring 例子输入 JerryCircle[Java 语言程序设计]abcdddncabca例子输出abc is substring of dddncabca提示 对 String 类的掌握与应用#include&stdio.h& #include&string.h& int main() { char s1[100]={&&},s2[100]={&&},s3[100]={&&}; int i,j,n,m; gets(s1); gets(s2); m=strlen(s1); n=strlen(s2); if(m&n) {strcpy(s3,s1);strcpy(s1,s2);strcpy(s2,s3);} //printf(&%s is substring of %s&,s1,s2); for(i=0,j=0;i&strlen(s2);i++) {if(*(s1+j)==*(s2+i)) j++;} if(j==strlen(s1)) printf(&%s is substring of %s&,s1,s2); else printf(&No substring&); }细菌实验分组来源 描述 有一种细菌分为 A、B 两个亚种,它们的外在特征几乎完全相同,仅仅在繁殖能力上有 显著差别,A 亚种繁殖能力非常强,B 亚种的繁殖能力很弱。在一次为时一个小时的细 菌繁殖实验中,实验员由于疏忽把细菌培养皿搞乱了,请你编写一个程序,根据实验结 果,把两个亚种的培养皿重新分成两组。 关于输入 输入有多行,第一行为整数 n(n≤100),表示有 n 个培养皿。 其余 n 行,每行有三个整数,分别代表培养皿编号,试验前细菌数量,试验后细菌数量。 关于输出 输出有多行: 第一行输出 A 亚种培养皿的数量,其后每行输出 A 亚种培养皿的编号,按繁殖率升序排 列。 北京大学医学部计算概论 08 期末考试题 然后一行输出 B 亚种培养皿的数量,其后每行输出 B 亚种培养皿的编号,也按繁殖率升 序排列。 例子输入51 10 34562 10 56443 10 45664 20 2345 20 232例子输出3132254提示 亚种内部,细菌繁殖能力差异远远小于亚种之间细菌繁殖能力的差异。 也就是说,亚种间任何两组细菌的繁殖率之差都比亚种内部两组细菌的繁殖率之差大。#include&stdio.h& int main() { int n,i,j,t1=0,t2=0,temp,standard=0,a[100]={0},b1[100]={0},b2[100]={0},c1 [100]={0},c2[100]={0}; float d[100]={0},d1[100]={0},d2[100]={0},temp1; scanf(&%d&,&n); for(i=0;i&n;i++) { scanf(&%d%d%d\n&,&a[i],&b1[i],&b2[i]); standard+=* (b2+i)/ * (b1+i); *(d+i)=*(b2+i)/(float)* (b1+i); } standard=standard/n; for(i=0;i&n;i++) { if(*(d+i)&=standard) {*(c1+t1)=*(a+i);*(d1+t1)=*(d+i);t1++;} else {*(c2+t2)=*(a+i);*(d2+t2)=*(d+i);t2++;} } for(i=0;i&t1-1;i++) for(j=0;j&t1-1-i;j++) { if(*(d1+j)&*(d1+j+1)) {temp=*(c1+j); *(c1+j)=*(c1+j+1); *(c1+j+1)= temp1=*(d1+j);*(d1+j)=*(d1+j+1);*(d1+j+1)=temp1;} } for(i=0;i&t2-1;i++) for(j=0;j&t2-1-i;j++) { if(*(d2+j)&*(d2+j+1)) {temp=*(c2+j); *(c2+j)=*(c2+j+1); *(c2+j+1)= temp1=*(d2+j);*(d2+j)=*(d2+j+1);*(d2+j+1)=temp1;} } printf(&%d\n&,t1); for(i=0;i&t1;i++) printf(&%d\n&,*(c1+i)); printf(&%d\n&,t2); for(i=0;i&t2;i++) printf(&%d\n&,*(c2+i)); }删除数组中的元素(链表)来源 描述 给定 N 个整数,将这些整数中与 M 相等的删除 假定给出的整数序列为:1,3,3,0,-3,5,6,8,3,10,22,-1,3,5,11,20,100,3,9,3 应该将其放在一个链表中,链表长度为 20 要删除的数是 3,删除以后,链表中只剩 14 个元素:1 0 -3 5 6 8 10 22 -1 5 11 20 100 9 //要求:必须使用链表,不允许使用数组,也不允许不删除元素直接输出 程序中必须有链表的相关操作:建立链表,删除元素,输出删除后链表中元素, 释放链表 不符合要求的程序即使通过,也会算作 0 分 关于输入 输入包含 3 行: 第一行是一个整数 n(1&=n&=200000),代表数组中元素的个数。 第二行包含 n 个整数,代表数组中的 n 个元素。每个整数之间用空格分隔;每个整数的 取值在 32 位有符号整数范围以内。 第三行是一个整数 k,代表待删除元素的值(k 的取值也在 32 位有符号整数范围内)。 关于输出 输出只有 1 行: 将数组内所有待删除元素删除以后,输出数组内的剩余元素的值,每个整数之间用空格 分隔。 例子输入201 3 3 0 -3 5 6 8 3 10 22 -1 3 5 11 20 100 3 9 33例子输出1 0 -3 5 6 8 10 22 -1 5 11 20 100 9 #include&stdio.h& #include&stdlib.h& struct number { struct number * }; long int n=1; struct number * AppendNewNode(long int m); struct number * DelNode(struct number *head, long int num,long int m); void main() { struct number *head, *p; scanf(&%ld&,&m); if(m&200000) exit(-1); head=AppendNewNode(m); p= while(p!=NULL) { scanf(&%ld&,&p-&num); p=p-& } //printf(&%d&,head-&num); /* p= printf(&\n %d \n&,head-&next-&next-&num); do { printf(&\n %d \n&,p-&num); p=p-& }while(p!=NULL);*/ scanf(&%ld&,&k); p=DelNode(head,k,m); //printf(&%d&,p-&num); printf(&%ld&,p-&num); p=p-& while(p!=NULL) { if(k==p-&num) printf(& %ld&,p-&num); p=p-& } } struct number * AppendNewNode(long int m) { struct number *head=NULL, *newNode, *thisN do{ newNode=(struct number *) malloc(sizeof(struct number)); /* if(newNode==NULL) { printf(&Memory request failed\n&); exit(-1); }*/ newNode-&num=0; if(n==1) { head=newN thisNode= } else thisNode-&next=newN if(n&=m) { thisNode=newN n++; } }while(n&=m); thisNode-&next=NULL; return(head); } struct number * DelNode(struct number *head, long int num,long int m) { struct number *pf,* long int n=1; //if(head==NULL) // { // printf(&List Null!\n&); // return(head); // } //else // { pa= while(n&=m-1) { while((num!=pa-&num)&&(pa-&next!=NULL)) { pf= pa=pa-& n++; } if(num==pa-&num) { if(head==pa) {head=pa-& pa=} else {pf-&next=pa-& pa=pf-&} } //pf=pf-& n++; } // if(num==pa-&num) pa=NULL; //} return(head); } 简化版: #include&stdio.h& #include&stdlib.h& struct number { struct number * }; long int n=1; struct number * AppendNewNode(long int m); struct number * DelNode(struct number *head, long int num,long int m); void main() { struct number *head, *p; scanf(&%ld&,&m); if(m&200000) exit(-1); head=AppendNewNode(m); p= while(p!=NULL) { scanf(&%ld&,&p-&num); p=p-& } scanf(&%ld&,&k); p=DelNode(head,k,m); printf(&%ld&,p-&num); p=p-& while(p!=NULL) { printf(& %ld&,p-&num); p=p-& } } struct number * AppendNewNode(long int m) { struct number *head=NULL, *newNode, *thisN do{ newNode=(struct number *) malloc(sizeof(struct number)); newNode-&num=0; if(n==1) { head=newN thisNode= } else thisNode-&next=newN if(n&=m) { thisNode=newN n++; } }while(n&=m); thisNode-&next=NULL; return(head); } struct number * DelNode(struct number *head, long int num,long int m) { struct number *pf,* long int n=1; pa= while(n&=m) { while((num!=pa-&num)&&(pa-&next!=NULL)) { pf= pa=pa-& n++; } if(num==pa-&num) { if(head==pa) {head=pa-& pa=} else {pf-&next=pa-& pa=pf-&} } n++; } return(head); }数字 7 游戏(演节目)来源 描述 元旦晚会上,有 n 个学生围坐成一圈,开始玩一种数字 7 游戏。围坐成一圈的学生按顺 时针顺序编号,第一个学生的编号为 1,最后一个学生的编号为 n。第一个学生从 1 开 始报数,按顺时针方向,下一个学生接着报下一个数。每当有学生报出来的数是 7 的倍 数,或者是一个含有数字 7 的数时,则该学生出列退出游戏,下一个学生接着报下一个 数。当剩下最后一个学生时,这个学生要为大家表演一个节目。 关于输入 输入仅一个整数 n(n≤100),学生人数。 关于输出 按学生退出游戏的顺序输出学生的编号,每行一个编号。 例子输入 京大学医学部计算概论 08 期末考试题(备选)5例子输出2543 1 #include&stdio.h& int main() { int a[100]={0},n,i,*p,sum=0,t=0,r=0; scanf(&%d&,&n); for(p=a;p&(a+n);p++) *p=1; //printf(&%d&,a[4]); for(i=0;;i++) { if(i==n) i=0; sum+=*(a+i); if(r==n-1)if((*(a+i)==1)&&(sum%7==0||sum%10==7||(sum/10)%10==7||(sum/10 0)%10==7)) {*(a+i)=0; printf(&%d\n&,i+1); r++;}} for(i=0;i&n;i++) if(*(a+i)==1) printf(&%d\n&,i+1); }使用链表: #include&stdio.h& #include&malloc.h& #define LEN sizeof(struct node) struct node { struct node * }; void main() { int i,m,n; struct node *head,*p1,*p2;scanf(&%d&,&n); head=(struct node*)malloc(LEN); head-&a=1; p1= for(i=2;i&=n;i++) { p2=(struct node*)malloc(LEN); p1-&next=p2; p2-&a=i; p1=p2; } p1-&next= p1= for(i=1;n&0;i++) { if((i+1)%7==0||(i+1)%10==7||((i+1)/10)%10==7) { printf(&%d\n&,(p1-&next)-&a); p1-&next=(p1-&next)-& n--; } else p1=p1-& }} 习题(14-9) 找和为 K 的两个元素描述 在一个长度为 n(n&1000)的整数序列中,判断是否存在某两个元素之和为 k。 关于输入 第一行输入序列的长度 n 和 k,用空格分开。 第二行输入序列中的 n 个整数,用空格分开。 关于输出 如果存在某两个元素的和为 k,则输出 yes,否则输出 no。 例子输入9 101 2 3 4 5 6 7 8 9例子输出yes #include&stdio.h& int main() { int n,i=0,j=0,p=0,a[1000]={0},k; scanf(&%d%d\n&,&n,&k); for(i=0;i&n;i++) scanf(&%d&,&a[i]); for(i=0;i&n;i++) for(j=i+1;j&n;j++) if(a[i]+a[j]==k) p++; if(p!=0) printf(&yes\n&); else printf(&no\n&); }习题(11-5) 计算鞍点 来源 描述POJ 3670输入一个二维 (5*5)数组,每行只有一个最大值,每列只有一个最小值。 如果存在鞍点, 则输出鞍点所在的位置 (行和列) , 不存在鞍点时, 要输出“not found”。 鞍点指的是数组中的一个元素,它是所在行的最大值,并且是所在列的最小值。 例如:在下面的例子中(第 4 行第 1 列的元素就是鞍点,值为 8 )。 11 3 5 6 9 12 4 7 8 10 10 5 6 9 11 8 6 4 7 2 15 10 11 20 25 关于输入 输入包含一个 5 行 5 列的矩阵 关于输出 如果存在鞍点,输出鞍点所在的行、列及其值,如果不存在,输出&not found& 例子输入11 3 5 6 912 4 7 8 1010 5 6 9 118 6 4 7 215 10 11 20 25例子输出4 1 8提示 4 1 8#include&stdio.h& int main() { int i,j,k,p1=0,p2=0,r=0,t=0,max,a[5][5]={0}; for(i=0;i&5;i++) for(j=0;j&5;j++) scanf(&%d&,&a[i][j]); // printf(&%d&,a[1][2]); for(i=0;i&5;i++) { p1=i; max=a[i][0]; p2=0; for(j=1;j&5;j++) { if(max&a[i][j]) {max=a[i][j];p2=j;} } for(k=0;k&5;k++) if(a[p1][p2]&a[k][p2]) r++; if(r==4) printf(&%d %d %d\n&,p1+1,p2+1,a[p1][p2]); t++; r=0;else} if(t==5) printf(&not found&); //printf(&%d&,t); }和为 n 连续正数序列描述 输入一个正数 n( n &= 30 ),输出所有和为 n 连续正数序列。 关于输入 一个正数 n ( 0 & n &= 30 ); 关于输出 输出所有和为 n 连续正数序列。每个序列里的数字以空格分隔。 如果找不到连续序列,输出 NO。 例子输入15例子输出1 2 3 4 54 5 67 8提示 注意:序列至少要有两个数字#include&stdio.h& int main() { int n,i=0,j=0,k=0,t=0,sum=0,a[7]={0}; scanf(&%d&,&n); for(i=1;i&15;i++) { a[0]=i;a[1]=i+1;a[2]=i+2;a[3]=i+3;a[4]=i+4;a[5]=i+5;a[6]=i+6; for(j=0;j&7;j++) { sum+=a[j]; if(sum==n&&j!=0) { printf(&%d&,a[0]); for(k=1;k&=j;k++) printf(& %d&,a[k]); printf(&\n&); t++; } } sum=0; } if(t==0) printf(&NO\n&); } 输出前 k 大的数描述 给定一个数组,统计前 k 大的数并且把这 k 个数从大到小输出 关于输入 先输入一个 n 表示数组的长度,然后连续地输入 n 个数。最后输入一个 k。 关于输出 换行输出前 k 大的数 例子输入104 5 6 9 8 7 1 2 3 05例子输出98765 #include&stdio.h& int main() { int n,i,j,k,a[1000]={0}, scanf(&%d\n&,&n); scanf(&%d&,&a[0]); for(i=1;i&n;i++) scanf(& %d&,&a[i]); scanf(&\n%d&,&k); for(i=0;i&n;i++) for(j=0;j&n-i;j++) if(a[j]&a[j+1]) {temp=a[j];a[j]=a[j+1];a[j+1]=} for(i=0;i&k;i++) printf(&%d\n&,a[i]); }最大偏离值来源 描述 输入 n 个无符号整数,找出偏离平均值最远的整数。如果有多个不同整数离平均值同 时最远,则按从小到大输出这几个不同整数,其间以逗号间隔。其中,个数 n 不大于 300 例如,有 6 个数:3,6,7,1,5,4,平均值是 26/6=4.33,与 1 的差值最大。 关于输入 第 1 行,输入整数的个数 n; 第 2 行,输入 n 个整数,整数之间以空格间隔; 关于输出 与平均值差值最大的整数,如果有多个不同整数同时达到最大差值,则从小到大输出相 应的整数,其间以逗号间隔。 例子输入 元培-From Whf71 2 3 4 5 6 7例子输出1,7 #include&stdio.h& int main() { int n,a[300]={0},i,sum=0,j, double aver,dist,temp1; scanf(&%d\n&,&n); scanf(&%d&,&a[0]); for(i=1;i&n;i++) scanf(& %d&,&a[i]); for(i=0;i&n-1;i++) for(j=i;j&n-1-i;j++) if(a[j]&a[j+1]) {temp=a[j];a[j]=a[j+1];a[j+1]=} for(i=0;i&n;i++) sum+=a[i]; aver=sum/(float)n; dist=a[0]- if(dist&1e-9) dist=- for(i=1;i&n;i++) { temp1=a[i]- if((temp1&1e-9&&temp1&dist)||(temp1&1e-9&&temp1+dist&1e-9)) dist=temp1; } if(dist&1e-9) dist=- for(i=0;i&n;i++) if((a[i]-aver-dist&1e-9&&dist+aver-a[i]&1e-9)||(a[i]-aver+dis t&1e-9&&aver-dist-a[i]&1e-9)) {printf(&%d&,a[i]);} if(i&n-1) {for(j=i+1;j&n;j++) if((a[j]-aver-dist&1e-9&&dist+aver-a[j]&1e-9)||(a[j]-aver+dis t&1e-9&&aver-dist-a[j]&1e-9)) printf(&,%d&,a[j]); } printf(&\n&); } 字符串中次数第 2 多的字母来源 描述 输入一串长度不超过 500 个符号的字符串,输出在串中出现第 2 多的英语字母(大小写 字母认为相同)和次数(如果串中有其它符号,则忽略不考虑)。如果有多个字母的次 数都是第 2 多,则按串中字母出现的顺序输出第 1 个。 例 ab&dcAab&c9defgb 元培-From WHF这里,a 和 b 都出现 3 次,c 和 d 都出现 2 次,e、f 和 g 各出现 1 次,其中的符号& 和 9 均忽略不考虑。因此,出现第 2 多的应该是 c 和 d,但是 d 开始出现的位置在 c 的前面,因此,输出为D+d:2(假定在字符串中,次数第 2 多的字母总存在) 关于输入 一个字符串 关于输出 大写字母+小写字母:个数 例子输入ab&dcAab&c9defgb例子输出D+d:2 #include&stdio.h& #include&string.h& int main() { int i,j,k,a[501]={0},max, char s[501]={&&},s1[501]={&&}, gets(s); j=0; for(i=0;i&strlen(s);i++) if((s[i]&=65&&s[i]&=90)||(s[i]&=97&&s[i]&=122)) {s1[j]=s[i];j++;} //puts(s1); for(i=0;i&strlen(s1);i++) for(j=i+1;j&strlen(s1);j++) if((s1[i]==s1[j]||s1[i]==s1[j]+32||s1[i]==s1[j]-32)&&((s1[i]& =65&&s1[i]&=90)||(s1[i]&=97&&s1[i]&=122))) {a[i]++;s1[j]='-';} for(i=0;i&strlen(s1);i++) if(a[i]!=0) a[i]++; max=a[0]; //printf(&%d\n&,a[1]); for(i=0;i&strlen(s1);i++) if(a[i]&=max) max=a[i]; for(i=0;i&strlen(s1);i++) if(a[i]==max) {a[i]=0;} second=0;k=0; for(i=0;i&strlen(s1);i++) if(a[i]&=second) {second=a[i];} //printf(&%d\n&,max); for(i=0;i&strlen(s1);i++) if(a[i]==second) { if(s1[i]&=90&&s1[i]&=65) {temp=s1[i]+32;printf(&%c+%c:%d&,s1[i],temp,second);} else if(s1[i]&=122&&s1[i]&=97){temp=s1[i]-32;printf(&%c+%c:%d&,temp,s1[i], second);} } // } printf(&%d&,'-'); 素数回文数的个数来源 描述 一个数如果从左往右读和从右往左读数字是相同的, 则称这个数是回文数, 如 121, 1221, 15651 都是回文数。判断 11 到任何一个小于 10000 大于 11 的整数之间,既是素数又是 回文数的整数的个数。 关于输入 输入一个整数 N(11 & N & 10000)。 关于输出 输出 11 到输入的这个数之间的既是素数又是回文数的个数。 (这个数大于等于 11 小于 等于 N) 例子输入 计算概论 07(工学院)?周文灵999例子输出16 #include&stdio.h& int sushu(int k,int * a) { int i,j,r,m=0; for(i=0;i&k;i++) { for(j=2,r=0;j&=*(a+i)/2;j++) if(*(a+i)%j==0) r++; if(r==0) m++; } } int main() { int n,i=0,r=0,m=0,j=0,k=0,temp=0,a[10000]={0}; scanf(&%d&,&n); for(i=11;i&=n;i++) { temp=0; for(j=i;j&0;j=j/10) temp=(temp+(j-(j/10)*10))*10; temp=temp/10; if(temp==i) {a[k]=i;k++;} } for(i=0;i&k;i++) printf(&%d\n&,a[i]); m=sushu(k,a); printf(&%d\n&,m); }// //n-gram 串频统计来源 描述 在文本分析中常用到 n-gram 串频统计方法,即,统计相邻的 n 个单元(如单词、汉字、 或者字符) 在整个文本中出现的频率。 假设有一个字符串, 请以字符为单位按 n-gram 统 计长度为 n 的子串出现的频度,并输出最高频度以及频度最高的子串。设定所给的字 符串不多于 500 个字符,且 1 & n &5。 如果有多个子串频度最高,则根据其在序列中 第一次出现的次序输出多个,每行输出一个,如果最高频度不大于 1,则输出 NO 元培-From Whf例如,n=3,所给的串是:abcdefabcd, 则,所有的 3-gram 是:abc,bcd,cde,def,efa,fab,abc,bcd。最后面的 cd 不足以形成 3-gram,则不考虑。这样,abc 和 bcd 都出现了 2 次,其余的只出现了 1 次,于是, 输出结果应该是: 2 abc bcd 关于输入 第一行为 n 第二行为字符串 关于输出 输出最高频度以及频度最高的所有子串。 例子输入3abcdefabcd例子输出2abcbcd#include&stdio.h& #include&string.h& int main() { char s[501]={&&},s1[501][501]={&&}; int n,i,j,a[501]={0},max=0; scanf(&%d\n&,&n); gets(s); //printf(&%d\n&,a[0]); for(i=0;i&=strlen(s)-n;i++) for(j=0;j&n;j++) *(*(s1+i)+j)=*(s+i+j); // printf(&%c\n&,s1[0][0]); // puts(s1[2]); for(i=0;i&=strlen(s)-n;i++) for(j=i;j&=strlen(s)-n;j++) if(strcmp(*(s1+i),*(s1+j))==0&&*(s1+i)!=' ') {*(a+i)=*(a+i)+1;*(s+j)=' ';} // puts(s1[2]); for(i=0;i&=strlen(s)-n;i++) if(max&*(a+i)) max=*(a+i); if(max==1) printf(&NO\n&); else { printf(&%d\n&,max); // printf(&%c\n&,s1[0][0]); // printf(&%d %d\n&,max,a[0]); for(i=0;i&=strlen(s)-n;i++) if(*(a+i)==max) printf(&%s\n&,*(s1+i)); } }全排列描述 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。我们假设对于小写字母有'a' & 'b' & ... & 'y' & 'z',而且给定的字符串中的字母 已经按照从小到大的顺序排列。 关于输入 输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在 1 到 6 之 间。 关于输出 输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字 母序如下定义:已知 S = s1s2...sk , T = t1t2...tk,则 S & T 等价于,存在 p (1 &= p &= k),使 得 s1 = t1, s2 = t2, ..., sp - 1 = tp - 1, sp & tp 成立。 例子输入abc例子输出 abcacbbacbcacabcba #include &stdio.h& #include&string.h& char test[7]; void Arrange(char s[],int n) { int i,j; if(n==len) puts(test); else { for(i=0;i&i++){ for(j=0;j&n;j++){ if(test[j]==s[i]) } if(j==n) { test[n]=s[i]; Arrange(s,n+1); } } } } void main() { char s[7]={&&}; gets(s); len=strlen(s); Arrange(s,0); }#include &stdio.h& #include &stdlib.h& #include &string.h& char x[100]; void swap(int a,int b){ j=x[a];x[a]=x[b];x[b]=j; } int main(){ int i,j,len,l,k; scanf(&%s&,x); len=strlen(x); l=len-1; for(i=len-2;i&=0;i--){ for(j=0;j&=i;j++){ if(x[j]&x[j+1])swap(j,j+1); }} printf(&%s\n&,x); while(1){ for(i=l-1;i&=0;i--)if(x[i]&x[i+1]) if(i==-1) for(j=l;j&=i+1;j--)if(x[j]&x[i]) swap(i,j); for(k=len-2;k&=i+1;k--){ for(j=i+1;j&=k;j++){ if(x[j]&x[j+1])swap(j,j+1); }} printf(&%s\n&,x); } } C 语言 合理的饭票设计 12:40 提问者悬赏:120 分 | zhangyin4321 | 分类:C/C++ | 浏览 120 次题目 - 合理的饭票设计 来源 元培-From WHF 描述 以前大学食堂都使用餐票吃饭,每顿饭菜钱可以为 1 角,2 角,...,最多为 n 角。 如果规定每次吃饭最多只能使用 k 张餐票,是否可以设计 m 种不同面值的餐 票,恰好覆盖从 1 ?? n(角)的所有可能饭菜价(既不超出 n,也不低于 n,这 里的 n 为整数)?满足上述条件的方案有多少? 假设 n 的值不超过 500,饭菜钱单位为角。 例如, m=3, k=2, n=8, 则,面值为:{1,3,4}恰好覆盖 1,2,...,8,再没有其他方案。 因此,这样的方案有 1 种。 若 m=3, k=2, n=9, 则不存在,因此,为 0 种。 若 m=3, k=2, n=6,则有 {1,2,3},{1,2,4}和{1,3,5}共 3 种。 若 m=3, k=2, n=5, 则不存在,因此,为 0 种。 关于输入 第 1 行输入正整数 P, 表示后面有 P 行 后面的 P 行分别为 m,k,n,其间以空格间隔 关于输出 对应输出 P 行,若不存在 m 种面值的饭票,则输出 0,若有,则输出方案数。 例子输入 4 3 2 5 3 2 6 3 2 8 3 2 9 例子输出 0 3 1 0#include&stdio.h& int he(int a[],int n) { int s=0,i; for(i=0;i&n;i++)s+=a[i]; } int pan(int a[],int n) { for(i=0;i&n;i++)if(a[i]==0)return 0; return 1; } void main() { int m[10],k[10],n[10],a[100],b[100],c[100],r,i,s,p,g; scanf(&%d&,&p); for(i=0;i&p;i++)scanf(&%d%d%d&,&m[i],&k[i],&n[i]); for(r=0;r&p;r++) { g=0; for(i=0;i&m[r];i++)a[i]=i+1; while(1) { for(i=0;i&m[r];i++)b[i]=0; for(i=0;i&n[r];i++)c[i]=0; while(b[0]&=k[r]) { b[m[r]-1]++; for(i=m[r]-1;b[i]&k[r]&&i&0;i--) { b[i]=0; b[i-1]++; } if(he(b,m[r])&k[r]) s=0; for(i=0;i&m[r];i++)s+=a[i]*b[i]; if(s==n[r]+1) if(s&=n[r])c[s-1]=1; } if(s!=n[r]+1&&pan(c,n[r])==1)g++; for(i=m[r]-1;i&0;i--) { a[i]++; if(a[i]&=n[r]-m[r]+i+1) } if(i==0) for(;i&m[r]-1;i++)a[i+1]=a[i]+1; } printf(&%d\n&,g); } } 元培-From Whf 描述 假设有 N 盏灯(N 为不大于 5000 的正整数),从 1 到 N 按顺序依次编号,有 M 个人(M 为不 大于 N 的正整数)也从 1 到 M 依次编号,第一个人(1 号)将灯全部关闭,第二个人(2 号) 将编号为 2 的倍数的灯打开,第三个人(3 号)将编号为 3 的倍数的灯做相反处理(即,将 打开的灯关闭,将关闭的灯打开) 。依照编号递增顺序,以后的人都和 3 号一样,将凡是自 己编号倍数的灯做相反处理。请问:当第 M 个人操作之后,哪几盏灯是关闭的,按从小到 大输出其编号,其间用逗号间隔。 关于输入 输入正整数 N 和 M,以逗号间隔 关于输出 顺次输出关闭的灯的编号,其间用逗号间隔 例子输入 10,10 例子输出 1,4,9 我的思路是 i 是人,j 是灯,整除的话就在 a[j]中加 1,最后看 a[j]是不是偶数,把是奇数的 都转移到 b 数组中,然后输出 #include &stdio.h& int a[5001]={0},b[5001]; int main() { int n,m,i,j,k=0; scanf(&%d,%d&,&n,&m); for(i=1;i&=m;i++){ for(j=1;j&=n;j++){ if(j%i==0)a[j]++; } } for(j=1;i&=n;j++){ if(a[j]%2==1){ k++; b[k]=j;}} for(i=1;i&k;i++){ printf(&%d,&,b[i]);} printf(&%d&,b[k]); system(&pause&); return 0; }#include &stdio.h& int a[5001]={0}; int main() { int n,m,i,j; scanf(&%d,%d&,&n,&m); for(i=1;i&=m;i++){ for(j=1;j&=n;j++){ if(j%i==0)a[j]=1-a[j]; } } for(j=1;j&=n;j++){ if(a[j]==1)printf(&%d,&,j); } return 0; } 题目 - 运算符判定 来源 元培-From Whf 描述 两个整数 a 和 b 运算后得到结果 c。表示为:a ? b = c,其中,?可能是加法 +,减法 -, 乘法 *,整除 / 或 取余 %。请根据输入的 a,b,c 的值,确定运算符。如果某种运算成立, 则输出相应的运算符,如果任何运算都不成立,则输出 error. 例如: 输入: 3,4,5 输出: error 若输入: 3,4,3 则输出: % 关于输入 a b 和 c 的值在意行内输入,以逗号间隔 关于输出 五个运算符之一或 error 例子输入 6,7,13 例子输出 + #include&stdio.h& int main() { int a,b,c,flag=0; scanf(&%d,%d,%d&,&a,&b,&c); if(a*b==c) { printf(&*&); flag=1; } if(a-b==c) { printf(&-&); flag=1; } if(a+b==c) { printf(&+&); flag=1; } if(b!=0 &&a%b==c) { printf(&%&); flag=1; } if(b*c==a) { printf(&/&); flag=1; } if (!flag) { printf(&error&); } return 0; }输出不重复的数字来源 描述 输入 n 个整数(n 由用户输入),每个整数的范围在 10-100 之间。 按照输入顺序输出这些整数,以空格分隔;如有重复的数,只输出重复数字中最先输入 的那一个。 关于输入 输入包含两行: 第一行包含一个正整数 n(1&=n&=20000),表示第二行测试数据的数字的个数; 第二行包含以空格分隔的 n 个整数,每个整数大于等于 10、小于 100。 关于输出 输出只有一行, 按照输入的顺序输出其中不重复的数字, 每个数字之间用一个空格分开。 计算概论 2010 例子输入510 12 93 12 75例子输出10 12 93 75 #include&stdio.h& int main() { int n,a[20000],i=0,t=0,p=0; scanf(&%d&,&n); for(i=0;i&=n-1;i++) { scanf(&%d&,&a[i]); } for(i=0;i&=n-1;i++) { for(t=0;t&=i-1;t++) { if(a[i]==a[t]) p++; } if(p!=0) a[i]=0; p=0; } for(i=0;i&=n-1;i++) { if(a[i]!=0) {printf(&%d&,a[i]);} } for(t=i+1;t&=n-1;t++) { if(a[t]!=0) printf(& %d&,a[t]); } } 习题(14-3) 奇数单增序列来源 描述 给定一个长度为 N(不大于 500)的正整数序列,请将其中的所有奇数取出,并按增序 输出。 关于输入 共2行 第 1 行为 N 第 2 行为 N 个正整数,其间用空格间隔。 关于输出 增序输出的奇数序列,数据之间以逗号间隔。 例子输入 元培-From Whf101 3 2 6 5 4 9 8 7 10例子输出1,3,5,7,9 #include&stdio.h& int main() { int n,a[50]={0},b[50]={0},i,t,p,q; scanf(&%d&,&n); for(i=0;i&=n-1;i++) { scanf(&%d&,&a[i]); } for(i=0,t=0;i&=n-1;i++) { if(a[i]%2==1) { b[t]=a[i]; t++; } } q=t; for(i=1;i&=q-1;i++) { for(t=0;t&q-i;t++) { if(b[t]&b[t+1]) { p=b[t]; b[t]=b[t+1]; b[t+1]=p; } } } printf(&%d&,b[0]); for(i=1;i&=q-1;i++) { printf(&,%d&,b[i]); } }计算两个日期之间的天数描述 给定两个年月日,计算之间的天数. 比如
之间差 2 天。year=1,2,...,3000.补充: 闰年是:(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0), 闰年的 2 月份有 29 天。 关于输入 第一行 startYear startMonth startDay 第二行 endYear endMonth endDay 关于输出 输出只有一行是两个日期之间的天数 例子输入例子输出366 #include&stdio.h& int main() { int a[3001]={0},y1,m1,d1,y2,m2,d2,i,delta,n1,n2,s1,s2, scanf(&%d%d%d\n&,&y1,&m1,&d1); scanf(&%d%d%d&,&y2,&m2,&d2); a[0]=366; for(i=1;i&=2999;i++) { if((i%4==0&&i%100!=0)||(i%400==0)) delta=366; else delta=365; a[i]=a[i-1]+ } if((y1%4==0&&y1%100!=0)||(y1%400==0)) { if(m1==1) n1=0; else if(m1==2) n1=31; else if(m1==3) n1=31+29; else if(m1==4) n1=31+29+31; else if(m1==5) n1=31+29+31+30; else if(m1==6) n1=31+29+31+30+31; else if(m1==7) n1=31+29+31+30+31+30; else if(m1==8) n1=31+29+31+30+31+30+31; else if(m1==9) n1=31+29+31+30+31+30+31+31; else if(m1==10) n1=31+29+31+30+31+30+31+31+30; else if(m1==11) n1=31+29+31+30+31+30+31+31+30+31; else if(m1==12) n1=31+29+31+30+31+30+31+31+30+31+30; } else { if(m1==1) n1=0; else if(m1==2) n1=31; else if(m1==3) n1=31+28; else if(m1==4) n1=31+28+31; else if(m1==5) n1=31+28+31+30; else if(m1==6) n1=31+28+31+30+31; else if(m1==7) n1=31+28+31+30+31+30; else if(m1==8) n1=31+28+31+30+31+30+31; else if(m1==9) n1=31+28+31+30+31+30+31+31; else if(m1==10) n1=31+28+31+30+31+30+31+31+30; else if(m1==11) n1=31+28+31+30+31+30+31+31+30+31; else if(m1==12) n1=31+28+31+30+31+30+31+31+30+31+30; } s1=a[y1-1]+n1+d1; if((y2%4==0&&y2%100!=0)||(y2%400==0)) { if(m2==1) n2=0; else if(m2==2) n2=31; else if(m2==3) n2=31+29; else if(m2==4) n2=31+29+31; else if(m2==5) n2=31+29+31+30; else if(m2==6) n2=31+29+31+30+31; else if(m2==7) n2=31+29+31+30+31+30; else if(m2==8) n2=31+29+31+30+31+30+31; else if(m2==9) n2=31+29+31+30+31+30+31+31; else if(m2==10) n2=31+29+31+30+31+30+31+31+30; else if(m2==11) n2=31+29+31+30+31+30+31+31+30+31; else if(m2==12) n2=31+29+31+30+31+30+31+31+30+31+30; } else { if(m2==1) n2=0; else if(m2==2) n2=31; else if(m2==3) n2=31+28; else if(m2==4) n2=31+28+31; else if(m2==5) n2=31+28+31+30; else if(m2==6) n2=31+28+31+30+31; else if(m2==7) n2=31+28+31+30+31+30; else if(m2==8) n2=31+28+31+30+31+30+31; else if(m2==9) n2=31+28+31+30+31+30+31+31; else if(m2==10) n2=31+28+31+30+31+30+31+31+30; else if(m2==11) n2=31+28+31+30+31+30+31+31+30+31; else if(m2==12) n2=31+28+31+30+31+30+31+31+30+31+30; } s2=a[y2-1]+n2+d2; result=s2-s1; printf(&%d\n&,result); }1017 学分绩点来源 描述 北京大学对本科生的成绩施行平均学分绩点制(GPA)。将学生的实际考分根据不同的 学科的不同学分按一定的公式进行计算。 曾经使用的规定如下: 实际成绩 绩点 90-100 4.0 85-89 82-84 78-81 75-77 72-74 68-71 64-67 60-63 3.7 3.3 3.0 2.7 2.3 2.0 1.5 1.0 计算概论 0560 以下 0 1.一门课程的学分绩点=该课绩点*该课学分 2.总评绩点=所有学科绩点之和/所有课程学分之和 现要求你编写程序求出某人 A 的总评绩点(GPA)。 关于输入 第一行 总的课程数 n(n&10); 第二行 相应课程的学分(两个学分间用空格隔开); 第三行 对应课程的实际得分; 此处输入的所有数字均为整数。 关于输出 输出有一行,总评绩点,精确到小数点后 2 位小数。(printf(&%.2f&,GPA);) 例子输入54 3 4 2 391 88 72 69 56例子输出2.52 #include&stdio.h& int main() { int i,n,a[10]={0},b[10]={0}; double c[10]={0},GPA,point=0,sum=0; scanf(&%d&,&n); for(i=0;i&=n-1;i++) scanf(&%d&,&a[i]); for(i=0;i&=n-1;i++) scanf(&%d&,&b[i]); for(i=0;i&=n-1;i++) { if(b[i]&=90&&b[i]&=100) c[i]=4.0; else if(b[i]&=85&&b[i]&=89) c[i]=3.7; else if(b[i]&=82&&b[i]&=84) c[i]=3.3; else if(b[i]&=78&&b[i]&=81) c[i]=3.0; else if(b[i]&=75&&b[i]&=77) c[i]=2.7; else if(b[i]&=72&&b[i]&=74) c[i]=2.3; else if(b[i]&=68&&b[i]&=71) c[i]=2.0; else if(b[i]&=64&&b[i]&=67) c[i]=1.5; else if(b[i]&=60&&b[i]&=63) c[i]=1.0; else c[i]=0; } for(i=0;i&=n-1;i++) { sum+=c[i]*a[i]; point+=a[i]; } GPA=sum/ printf(&%.2lf&,GPA); }统计元音字母个数来源 描述 输入一段英文,计算并输出该段英文中元音字母的个数,不区分大小写。 关于输入 一段英文 关于输出 输出一行 5 个数字,分别为字母 a,e,i,o,u 的个数 例子输入 元培-From WhfThe C programming language is a general-purpose computer programming language originally developed in 1972.例子输出 9 10 6 6 4 #include&stdio.h& int main() { int t,a=0,e=0,i=0,o=0,u=0; char words[400]; gets(words); for(t=0;t&=399;t++) { if(words[t]=='a'||words[t]=='A') a++; if(words[t]=='e'||words[t]=='E') e++; if(words[t]=='i'||words[t]=='I') i++; if(words[t]=='o'||words[t]=='O') o++; if(words[t]=='u'||words[t]=='U') u++; } printf(&%d %d %d %d %d&,a,e,i,o,u); }删除重复元素保留 1 个来源 描述 输入 n 个整型数,把其中重复出现的元素删去(如出现三个 5,则只保留第一次出现的 5,删去后两个 5),将剩余的元素顺次输出。整数个数 n 不大于 300 关于输入 第 1 行,输入整数的个数 n; 第 2 行,输入 n 个整数,整数之间以空格间隔; 关于输出 按原有顺序输出新数组(删除的不输出),数据之间以逗号间隔 例子输入 元培-From Whf10 5 6 7 5 8 5 7 9 8 6例子输出5,6,7,8,9 #include&stdio.h& int main() { int n,a[300],i=0,t=0,p=0; scanf(&%d&,&n); for(i=0;i&=n-1;i++) { scanf(&%d&,&a[i]); } for(i=0;i&=n-1;i++) { for(t=0;t&=i-1;t++) { if(a[i]==a[t]) p++; } if(p!=0) a[i]=0; p=0; } for(i=0;i&=n-1;i++) { if(a[i]!=0) {printf(&%d&,a[i]);} } for(t=i+1;t&=n-1;t++) { if(a[t]!=0) printf(&,%d&,a[t]); } }二维数组回形遍历 来源 描述北京大学 2009 年医学部练习题给定一个 row 行 col 列的整数数组 array,要求从 array[0][0]元素开始,按回形从外 向内顺时针顺序遍历整个数组。如图所示:关于输入 输入的第一行上有两个整数,依次为 row 和 col。 余下有 row 行,每行包含 col 个整数,构成一个二维整数数组。 (注:输入的 row 和 col 保证 0&row&100, 0&col&100) 关于输出 按遍历顺序输出每个整数。每个整数占一行。 例子输入4 41 23 412 13 14 511 16 15 610 98 7例子输出123 45678910111213141516#include&stdio.h& int main() { int a[100][100]={0},i=0,j=0,t=0,r,s,q,p,row,col,m; scanf(&%d%d&,&row,&col); for(i=0;i&i++) for(j=0;j&j++) scanf(&%d&,&a[i][j]); //只读出一圈(从易到难) for(r=0;(row-2*r-1&=1)&&(col-2*r-1&=1);r++) { for(j=r;j&col-1-r;j++) printf(&%d\n&,a[r][j]); for(i=r;i&row-1-r;i++) printf(&%d\n&,a[i][col-1-r]); for(j=col-1-r;j&r;j--) printf(&%d\n&,a[row-1-r][j]); for(i=row-1-r;i&r;i--) printf(&%d\n&,a[i][r]); } if((row==col)&&(row%2!=0)) printf(&%d\n&,a[(row-1)/2][(col-1)/2]); else if(row%2!=0&&col%2!=0&&row&col) { for(m=0;m&=row-m++) printf(&%d\n&,a[(col-1)/2+m][(col-1)/2]); } else if(row%2!=0&&col%2!=0&&row&col) { for(m=0;m&=col-m++) printf(&%d\n&,a[(row-1)/2][(row-1)/2+m]); } else if(row%2==0&&col%2!=0&&row&col) { for(m=0;m&=row-m++) printf(&%d\n&,a[(col-1)/2+m][(col-1)/2]); } else if(row%2!=0&&col%2==0&&row&col) { for(m=0;m&=col-m++) printf(&%d\n&,a[(row-1)/2][(row-1)/2+m]); } return 0; } 约瑟夫问题来源 描述 约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号 开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从 1 开始报数。就 这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最 后猴王的编号。 关于输入 每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 & m,n &=300)。最后一 行是: POJ2746;PG10780 0 关于输出 对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号 例子输入6 212 48 30 0例子输出51 7提示 所给的数据中,m 未必比 n 小!#include&stdio.h& void main() { int a[300]={0},i,t=0,s,p=0,q,m,n,r; for(;;) { scanf(&%d%d&,&n,&m); if(m==0) for(i=0;i&=n-1;i++) a[i]=1; for(r=0;r&n;r++) { for(;;t++) { if(t==n) t=0; if(a[t]==1) p++; if(p==m) } p=0; a[t]=0; t++; if(t==n) t=0; } if(t==0) printf(&%d\n&,n); else printf(&%d\n&,t); t=0; } } 1题目 - 满足条件的数累加 来源 元培-From Whf 描述 将正整数 m 和 n 之间(包括 m 和 n)能被 17 整除的数累加。其中,m & n 关于输入 1 行内输入整数 m 和 n,其间,以空格间隔; 关于输出 累加的结果 例子输入 50 85 例子输出 204#include&stdio.h& int main() { int m,n,i,s=0; scanf(&%d%d&,&m,&n); for(i=m;i&=n;i++) {if(i%17==0)s+=i;} printf(&%d&,s); }2 题目 - 最长最短单词 来源 计概 描述 输入 1 行单词,单词之间有一个空格,试输出第 1 个最长的单词和第 1 个最短单词。 如果所有单词长度相同,那么第一个单词既是最长单词也是最短单词。 关于输入 两行, 第一行,一个整数 n,表示单词数目(n&200) 第二行,空格分开的 n 个单词。 关于输出 两行输出 第 1 行,第一个最长的单词 第 2 行,第一个最短的单词 例子输入 9 I am studying Programming language C in Peking University 例子输出 Programming I #include&stdio.h& int main() { char a[5000]={0},b[200][20]={0}; int i,j,n,p,q,max,min,c[200]={0},k; gets(a); for(k=0,i=0,j=0;a[k]!=0;k++) if(a[k]==','||a[k]==' '){c[i++]=j;j=0;} else b[i][j++]=a[k]; c[i]=j;n=i; p=q=0;max=min=c[0]; for(i=1;i&=n;i++) if(c[i]&max){max=c[i];p=i;} else if(c[i]&min&&c[i]&0){min=c[i];q=i;} puts(b[p]); puts(b[q]); }3 题目 - n-gram 串频统计 来源 元培-From Whf 描述 在文本分析中常用到 n-gram 串频统计方法,即,统计相邻的 n 个单元(如单词、汉字、或 者字符)在整个文本中出现的频率。假设有一个字符串,请以字符为单位按 n-gram 统计长 度为 n 的子串出现的频度,并输出最高频度以及频度最高的子串。设定所给的字符串不多 于 500 个字符,且 1 & n &5。 如果有多个子串频度最高,则根据其在序列中第一次出现的 次序输出多个,每行输出一个,如果最高频度不大于 1,则输出 NO 例如,n=3,所给的串是:abcdefabcd, 则,所有的 3-gram 是:abc,bcd,cde,def,efa,fab,abc,bcd。最后面的 cd 不足以形成 3-gram,则 不考虑。这样,abc 和 bcd 都出现了 2 次,其余的只出现了 1 次,于是,输出结果应该是: 2 abc bcd关于输入 第一行为 n 第二行为字符串关于输出 输出最高频度以及频度最高的所有子串。 例子输入 3 abcdefabcd例子输出 2 abc bcd#include&stdio.h& #include&string.h& int main() { char a[510]={0},b[500][6]={0}; int l,i,j,n,m=0,c[500]={0},s; scanf(&%d\n&,&n); gets(a); l=strlen(a); for(i=0;i&=l-n;i++) for(j=0;j&n;j++) b[i][j]=a[i+j]; for(i=0;i&=l-n;i++) {s=1; for(j=0;j&i;j++) if(c[j]!=-1)if(strcmp(b[j],b[i])==0){s=0;c[j]+=1;c[i]=-1;} if(s)c[i]+=1;} for(i=0;i&=l-n;i++) if(c[i]&m)m=c[i]; if(m==1)printf(&NO&); else {printf(&%d\n&,m); for(i=0;i&=l-n;i++) if(c[i]==m)puts(b[i]);}}4 题目 - 提取数字串按数值排序 来源 元培-From Whf 描述 输入一串不超过 300 个字符的符号序列, 请将其中的所有数字串提出, 并将每个数字串作为 整数看待 (假设可以用 int 表示) , 按从小到大顺序输出结果, 输出的整数之间以逗号间隔。 如果没有数字,则输出 0;例如:*1ad9jk81-11101?aght88ir09kp,其中的整数 包括:,,1,从小到大排序后,应该输出: 9,9,81,88,345,,11101关于输入 在一行内输入一串符号 关于输出 从小到大排序的整数序列,如果没有数字,则输出 0; 例子输入 *1ad9jk81-11101?aght88ir09kp 例子输出 9,9,81,88,345,101 #include&stdio.h& #include&string.h& int main() { char a[350]={0}; int i=-1,j,t=-1,n,b[350]={0},k,s,u; gets(a); for(k=0;a[k]!=0;k++) if(a[k]&47&&a[k]&58)if(t==-1){i++;t=a[k]-48;} else t=t*10+a[k]-48; else if(t!=-1){b[i]=t;t=-1;} if(t!=-1)b[i]=t; n=i; if(i==-1)printf(&0&); else{for(i=n;i&0;i--) for(j=0;j&i;j++) if(b[j]&b[j+1]){s=b[j];b[j]=b[j+1];b[j+1]=s;}; u=n; for(i=0;i&=n;i++) {printf(&%d&,b[i]);u--;if(u&=0)printf(&,&);}} }5 题目 - 降序生成进制数 来源 元培-From Whf 描述 按从大到小顺序依次输出 m( &0 ) 个 n 位( &0 ) 的 k (1 & k & 10)进制数, 注意: (1) 如果实际的 n 位 k 进制数不够 m 个,则按实际个数输出。例如:想输出 88 个 4 位 3 进制数,但所有 4 位 3 进制总共只有 81 个,因此,只需输出 81 个即可; (2) 如果实际的 n 位 k 进制数多于 m 个,则输出最大的 m 个。 假定 n 小于 30 位,m 可以用整数表示。 关于输入 m,n 和 k 在一行内输入,空格间隔 关于输出 输出的两个数之间用逗号间隔,如果输出的结果多于 6 个数,则分多行输出,每行输出 6 个值,最后一行可以少于 6 个(每行的最后一个数之后没有逗号) 。 例子输入 88 4 3 例子输出 20,10 00,20 10,00 20,10 00,20 10,00 20,10 00,20 10,00 20,10 00,20 10,00 20,10 00#include&stdio.h& int main() { int a[35]={0}; int s=1,m,n,k,i,t=0; scanf(&%d%d%d&,&m,&n,&k); for(i=0;i&n;i++) a[i]=k-1; if(n==1) {m=m&k?m:k; for(;;) {printf(&%d&,a[0]); if(--m&=0) if(++t%6==0)printf(&\n&); else printf(&,&); a[0]-=1;}} else for(;;) {for(i=0;i&n;i++)printf(&%d&,a[i]); if(--m&=0) if(a[n-1]&0)a[n-1]-=1; else {a[n-1]+=k-1;a[n-2]-=1; for(i=n-2;i&0;i--) if(a[i]&0){a[i]+=k;a[i-1]-=1;}} if(a[0]&0) if(++t%6==0)printf(&\n&); else printf(&,&);} }6 题目 - 最大零矩阵 来源 元培-From Whf 描述 有一个二位数组 m(&100)行, n(&100) 列,其元素为不大于 100 的非负整数。现要找元 素值均为 0 的最大子二维数组,其中行相邻,列也相邻,行数与列数之积最大(即,所含 0 元素最多),输出该最大积。例如: 2 3 7 8 4 6 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 0 8 0 0 1 0 0 11 12 13 14 0 0 15 16 17 18 0 0这是 6 行,7 列构成的二维数组,其中:由第 4~5 行(最后 2 行),第 1~6 列(最后 6 列)构 成的子数组最大,共有 12 个 0 元素,因此,应该输出 12。其它情况下的子数组都不多于 12 个 0 元素,例如,第 1~5 行与第 1~2 列构成子数组为第二大数组,含有 10 个 0 元素。关于输入 第一行,m 和 n 的值,以空格间隔,m 和 n 均为 不大于 100 的正整数 之后,共 m 行,每行共 n 个元素,其间用空格间格。关于输出 输出,最大零元素子二维数组所含的 0 元素个数,如果没有 0 元素,则输出 0。 例子输入 67 2 5 0 3 0 0 7 0 0 8 0 0 4 0 00 0 0 7 08 0 0 1 011 12 13 14 015 16 17 18 0 6 0 0 0 0 0 例子输出 120#include&stdio.h& #include&string.h& int main() { int a[101][101],i,j,k,l,m,n,u,v=0,p,q,t; scanf(&%d%d&,&m,&n); for(i=0;i&m;i++) for(j=0;j&n;j++) scanf(&%d&,&a[i][j]); for(i=0;i&m;i++) for(j=0;j&n;j++) if(a[i][j]==0){ for(k=i;k&m;k++) for(l=j;l&n;l++) if(a[k][l]==0){t=1; for(p=i;p&=k;p++) for(q=j;q&=l;q++) if(a[p][q]!=0){t=0;} if(t){u=(k-i+1)*(l-j+1);if(u&v)v=u;}}} printf(&%d&,v); }1 题目 - 中间值判断 来源 元培-From Whf 描述 任意给定 n 个整数(n 不大于 100), 这 n 个整数中的最小值 min 和最大值 max 确定了整数序 列的左右边界。在这 n 个整数中,是否存在以最小值 min 和最大值 max 为左右边界的中间 值。如果存在,则输出 YES, 否则,输出 NO。 例如: 三个数 1,3,5,则左边界是 1,右边界是 5,中间位置的值= (1 + 5 ) / 2 = 3,出现在序列中。 同样,如果是三个数 1,3,6,中间值是 3 或者 4,此时的 3 已出现,也成立。 但是,如果是三个数 1,2,6,则没有出现中间值。 关于输入 第一行:整数个数 n; 第二行:n 个整数,其间以空格间隔; 如: 6 1 -2 2 5 -6 9 左右边界点分别是 [-6, 9] 中间点为 1 和 2,均出现。关于输出 如果出现,则输出 YES 否则,输出 NO 例子输入 6 1 -2 2 5 -6 9 例子输出 YES #include&stdio.h& #include&string.h& int main() { int a[101]={0},i,t,n,min,max,s=0; scanf(&%d&,&n); scanf(&%d&,&a[0]); min=max=a[0]; for(i=1;i&n;i++) {scanf(&%d&,&a[i]); if(a[i]&max)max=a[i]; else if(a[i]&min)min=a[i];} if((max+min)%2==0){t=(max+min)/2; for(i=0;i&n;i++)if(a[i]==t){s=1;}} else{t=(max+min)/2; for(i=0;i&n;i++)if((a[i]==t)||(a[i]==t+1)){s=1;}} if(s)printf(&YES&); else printf(&NO&); }2 题目 - 判断整数的奇偶性 来源 元培-From Whf 描述 有一串长度不超过 500 的符号序列,其中有数字和非数字。请将其中的数字顺次拼起来,形 成一个大的非负整数,判断该整数是奇数还是偶数。若是奇数,则输出 ODD;若是偶数, 输出 EVEN。如果整个串中没有数字,则输出 NO 。 关于输入 一串长度不超过 500 的符号序列。 关于输出 输出拼成的整数,给出逗号后再输出是奇数还是偶数。如果输入序列中没有任何数字出现, 则只输出 NO。 注意:如果拼成的整数大于 0,则输出的整数第一位不得是 0,如果拼成的整数为 0,则输 出为: 0,EVEN例子输入 kad0hskh01x,nnxv31kklk20xcmxc89k6zxjcnm3cjk 例子输出 ,ODD #include&stdio.h& #include&string.h& int main() { char c,d; int s=0,t=0; while((c=getchar())!='\n') { if(c&47&&c&58){d=c; if(s==0)s=1; if(s==1)if(t==0)if(c!=48)t=1; if(t)putchar(c);}}; if(s==0)printf(&NO&); else if(t==0)printf(&0,EVEN&); else if(d%2==0)printf(&,EVEN&); else printf(&,ODD&); }3 题目 - 与 K 相关的数 来源 元培 From-WHF 描述 给定一个正整数 K (其中, 1 & k & 10 ), 在[M, N]的范围内找出与 K 相关的所有数 X(即, 10 & M &= X &= N ),按从小到大输出这些数。若不存在这样的数,则输出 NULL。 所谓一个数 X 与 K 相关,是指这个数一定满足如下三个条件之一: (1) 这个数中含有 K; (2) 这个数是 K 的倍数; (3) 这个数的每位相加的和是 K 的倍数 关于输入 K,M,N 三个数,彼此之间用逗号间隔。 关于输出 从小到大输出所有与 K 相关的数, 彼此之间用分号间隔。 若没有满足条件的数, 则输出 NULL。例子输入 3,12,28 例子输出 12;13;15;18;21;23;24;27 #include&stdio.h& #include&string.h& int main() { int k,m=0,n=0,i,s,t,w=0; scanf(&%d,%d,%d&,&k,&m,&n); for(i=m;i&=n;i++) {int v=0,u=0; if(i%k==0)v=1; else for(s=i;s&0;) {t=s%10;if(t==k){v=1;} u+=t;s=s/10;} if(v==0)if(u%k==0)v=1; if(v){if(w==1)printf(&;&); printf(&%d&,i);w=1;}} if(w==0)printf(&NULL&); }4 题目 - 最简真分数序列 来源 元培-From Whf 描述 所谓最简真分数是指分子小于分母,且不能约分的分数。给定 n(1 & n & 200)个非负整数 (每个整数不超过 3 位) ,哪两个整数分别作为分子和分母能够构成最简真分数。输出所有 的最简真分数组合;若没有,则输出 NO。关于输入 第 1 行为正整数个数 n 其后为 n 个非负整数,空格间隔。 关于输出 输出所有最简真分数,分子小的排在前面;若分子相同,分母小的排在前面。各分数之间用 逗号间隔。 若没有,则输出 NO 例子输入 8 3 7 11 0 5 13 15 9例子输出 3/5,3/7,3/11,3/13,5/7,5/9,5/11,5/13,7/9,7/11,7/13,7/15,9/11,9/13,11/13,11/15,13/15#include&stdio.h& #include&string.h& int f(int i,int j) { if(i%j==0)return(j); else return(f(j,i-i/j*j)); } int main() { int a[201]={0},b[201]={0},i,j,n,p,t=0,s=0; scanf(&%d&,&n); for(i=0;i&n;i++) scanf(&%d&,&a[i]); for(i=n-1;i&=0;i--) for(j=0;j&i;j++) if(a[j]&a[j+1]) {p=a[j];a[j]=a[j+1];a[j+1]=p;} if(a[0]&0)b[t++]=a[0]; for(i=1;i&n;i++) if(a[i]!=a[i-1])b[t++]=a[i]; for(i=0;i&t;i++) for(j=i+1;j&t;j++) if(f(b[i],b[j])==1){ if(s)printf(&,&); printf(&%d/%d&,b[i],b[j]); s=1;} if(s==0)printf(&NO&); }5 题目 - 正整数的任意进制转换 来源 元培-From Whf 描述 将 p 进制 n 转换为 q 进制。p 和 q 的取值范围为【2,36】 ,其中,用到的数码按从小 到大依次为:0,1,2,3,4,5,6,7,8,9,A,B,...,Z,不考虑小写字母。 注意:n 的长度不超过 50 位。 三个数之间用逗号间隔。 关于输入 1+m 行, 第 1 行为 m,表示后面有 m 行,m 不小于 1. 其后的 m 行中,每行 3 个数: 进制 p,p 进制数 n,以及进制 q。 三个数之间用逗号间隔 关于输出 转换后的 q 进制数。 例子输入 6 18,,18 15,, 16, 25,3456AB,21 18,AB例子输出
114E0 22B7A4 21A976L 7CG367#include&stdio.h& #include&string.h& void run(int d[],int p,int q) { for(i=0;i&200;i++) d[i]=d[i]*p; for(i=0;i&200;i++){ d[i+1]=d[i+1]+d[i]/q;d[i]=d[i]%q;}} void multi(int b[],int d[],int e,int q) { for(i=0;i&200;i++) b[i]=b[i]+e*d[i]; for(i=0;i&200;i++) {b[i+1]=b[i+1]+b[i]/q;b[i]=b[i]%q;}} int main() { scanf(&%d&,&n); for(;n--&0;) {char c[200]={0}; int a[200]={0},b[200]={0},d[200]={0},p,q,i,j,s,l; scanf(&%d,%s&,&p,c); l=strlen(c)-1; q=c[l]-48; if(c[l-1]!=','){q+=(c[l-1]-48)*10;c[l-2]=0;l=l-3;} else {c[l-1]=0;l=l-2;} if(p==q)printf(&%s\n&,c); else{ for(i=0;i&=l;i++) if(c[l-i]&58)a[i]=c[l-i]-48; else a[i]=c[l-i]-55; d[0]=1; multi(b,d,a[0],q); for(i=1;i&=l;i++) {run(d,p,q); multi(b,d,a[i],q);} for(i=199;;i--) if(b[i]!=0) l=i; for(i=0;i&=l;i++) if(b[i]&10)c[l-i]=b[i]+48; else c[l-i]=b[i]+55; c[l+1]=0; printf(&%s\n&,c);}} }6 题目 - 最长等差数列子集 来源 元培-From Whf 描述 一个等差数列是指以增序排列后, 相邻的两个数后一个与前一个数之差值恒定。 规定一个等 差数列中的数不应少于 3 个。 任给 n ( 2 & n & 5000)个正整数, 请判断可否从中选择子集构成 等差数列。若能,则选出满足条件的最大子集合(即,元素个数最多) ,并按从小到大输出 子集中的元素,逗号间隔。若有多个子集同时满足最大,则取差值最大的子集;若同时有多 个子集满足集合大小最大,且差值也相等,则取起始元素最大的子集。如果没有满足条件的 子集合,则输出 NO. 例如,有 10 个元素:20,14,6,15,22,7,23,8,18,25 从 6 开始的最长等差数列是:6,7,8 和 6,14,22 从 7 开始的最长等差数列是:7,15,23 从 8 开始的最长等差数列是:8,14,20 和 8,15,22 从 14 开始的最长等差数列是:14,18,22 从 15 开始的最长等差数列是:15,20,25 从 18 开始的最长等差数列是:18,20,22 上述

我要回帖

更多关于 字符串倒置顺序 的文章

 

随机推荐