算法训练普通试题.docx
- 文档编号:11995403
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:102
- 大小:40.86KB
算法训练普通试题.docx
《算法训练普通试题.docx》由会员分享,可在线阅读,更多相关《算法训练普通试题.docx(102页珍藏版)》请在冰点文库上搜索。
算法训练普通试题
试题编号ALGO-101
算法训练图形显示
问题描述
编写一个程序,首先输入一个整数,例如5,然后在屏幕上显示如下的图形(5表示行数):
*****
****
***
**
*
本题的C++参考代码如下:
#include
usingnamespacestd;
intmain()
{
intn;
cin>>n;
for(inti=0;i for(intj=1;j<=n-i;j++) { cout<<"*"; if(j cout<<""; else cout< } return0; } 本题的C参考代码如下: #include intmain() {inti,j,a[100][100],n; while(scanf("%d",&n)! =EOF) {for(i=0;i for(j=0;j { printf("*"); if(j! =n-i-1) printf(""); if(j==n-1-i) printf("\n"); } } } 试题编号ALGO-97 算法训练排序 问题描述 编写一个程序,输入3个整数,然后程序将对这三个整数按照从大到小进行排列。 输入格式: 输入只有一行,即三个整数,中间用空格隔开。 输出格式: 输出只有一行,即排序后的结果。 输入输出样例 样例输入 9230 样例输出 3092 本题的C++参考代码如下: #include usingnamespacestd; intmain() { inta,b,t,c; while(cin>>a>>b>>c) { if(a { t=a;a=b;b=t; } if(a { t=a;a=c;c=t; } if(b { t=b;b=c;c=t; } cout< } return0; } 本题的C参考代码如下: #include #include #definenum100 intmain(void) { inti,j,t,a[3]={0}; for(i=0;i<3;i++) {scanf("%d",&a[i]); } for(i=0;i<3;i++) for(j=i;j<3;j++) if(a[i]<=a[j]){t=a[i];a[i]=a[j];a[j]=t;} for(i=0;i<3;i++) {printf("%d",a[i]); if(i! =2)printf(""); } printf("\n"); return0; } 试题编号ALGO-95 算法训练2的次幂表示 问题描述 任何一个正整数都可以用2进制表示,例如: 137的2进制表示为10001001。 将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式: 137=2^7+2^3+2^0 现在约定幂次用括号来表示,即a^b表示为a(b) 此时,137可表示为: 2(7)+2(3)+2(0) 进一步: 7=2^2+2+2^0(2^1用2表示) 3=2+2^0 所以最后137可表示为: 2(2 (2)+2+2(0))+2(2+2(0))+2(0) 又如: 1315=2^10+2^8+2^5+2+1 所以1315最后可表示为: 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2 (2)+2(0))+2+2(0) 输入格式 正整数(1<=n<=20000) 输出格式 符合约定的n的0,2表示(在表示中不能有空格) 样例输入 137 样例输出 2(2 (2)+2+2(0))+2(2+2(0))+2(0) 样例输入 1315 样例输出 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2 (2)+2(0))+2+2(0) 提示 用递归实现会比较简单,可以一边递归一边输出 本题的C++参考代码如下: #include usingnamespacestd; //递归实现思路是先转换成二进制 intfun(intn) { inti=0; inta[20]={0}; intm=n; while(m) { a[i]=m%2; m/=2; i++; } for(intj=i-1;j>=0;j--)//高位到低位排列但是要注意每位的权改变 { if(a[j]==1) { //若是最后一个1则之后不要加号 intflag=1; for(intk=j-1;k>=0;k--) { if(a[k]==1) { flag=0; break; } } if(flag)//是最后一位 { if(j==1) cout<<"2"; else { if(j==0) cout<<"2("< else { cout<<"2("; fun(j); cout<<")"; } } } else//不是最后一位 { if(j==1) cout<<"2+"; else { if(j==0) cout<<"2("< else { cout<<"2("; fun(j); cout<<")+"; } } } } } return0; } intmain() { intn; cin>>n; fun(n); cout< return0; } 本题的C参考代码如下: #include intl=0; chartemp[1000]={0}; voidshow(intn) { if(n==0){temp[l]='0';l++;return;} if(n==2){temp[l]='2',l++;return;} inta[15]={0},i=0,j; while(n! =0) { a[i]=n%2; n/=2; i++; } for(j=i-1;j>=0;j--) if(a[j]==1) { if(j==1) { if(temp[l-1]==')'||temp[l-1]=='2'){temp[l]='+';l++;} temp[l]='2';l++; } else { if(temp[l-1]==')'||temp[l-1]=='2'){temp[l]='+';l++;} temp[l]='2';l++; temp[l]='(';l++; show(j); temp[l]=')';l++; } } } intmain() { intn; scanf("%d",&n); show(n); printf("%s",temp); return0; } 试题编号ALGO-92 算法训练前缀表达式 问题描述 编写一个程序,以字符串方式输入一个前缀表达式,然后计算它的值。 输入格式为: “运算符对象1对象2”,其中,运算符为“+”(加法)、“-”(减法)、“*”(乘法)或“/”(除法),运算对象为不超过10的整数,它们之间用一个空格隔开。 要求: 对于加、减、乘、除这四种运算,分别设计相应的函数来实现。 输入格式: 输入只有一行,即一个前缀表达式字符串。 输出格式: 输出相应的计算结果(如果是除法,直接采用c语言的“/”运算符,结果为整数)。 输入输出样例 样例输入 +52 样例输出 7 本题的C++参考代码如下: #include usingnamespacestd; intmain() { charc; inta,b; cin>>c>>a>>b; intres; if(c=='+')res=a+b; elseif(c=='-')res=a-b; elseif(c=='*')res=a*b; elseres=a/b; cout< return0; } 本题的C参考代码如下: #include intmain() {inta[2]; inti,j; charc=getchar(); for(i=0;i<2;i++) scanf("%d",&a[i]); if(c=='+') j=a[0]+a[1]; elseif(c=='-') j=a[0]-a[1]; elseif(c=='*') j=a[0]*a[1]; elseif(c=='/') j=a[0]/a[1]; printf("%d",j); return0; } 试题编号ALGO-91 算法训练Anagrams问题 问题描述 Anagrams指的是具有如下特性的两个单词: 在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的。 例如,“Unclear”和“Nuclear”、“Rimon”和“MinOR”都是Anagrams。 编写一个程序,输入两个单词,然后判断一下,这两个单词是否是Anagrams。 每一个单词的长度不会超过80个字符,而且是大小写无关的。 输入格式: 输入有两行,分别为两个单词。 输出格式: 输出只有一个字母Y或N,分别表示Yes和No。 输入输出样例 样例输入 Unclear Nuclear 样例输出 Y 本题的C++参考代码如下: #include #include #include #include #include #include #include #include #include #include usingnamespacestd; charGetCapital(charc) { if(c<='Z') returnc; else returnc-('a'-'A'); } intmain(intargc,char**argv){ map stringt; cin>>t; for(inti=0;i a[GetCapital(t[i])]++; cin>>t; for(inti=0;i b[GetCapital(t[i])]++; if(a==b) cout<<"Y"; else cout<<"N"; return0; } 本题的C参考代码如下: #include voidsort(chara[],intlen) { inti,j,max; for(i=0;i { max=i; for(j=i+1;j if(a[j]>a[max])max=j; j=a[i];a[i]=a[max];a[max]=j; } } voidstrtoupper(chara[],intlen) { inti; for(i=0;i if(a[i]>='a'&&a[i]<='z')a[i]-=32; } intmystrcmp(chara[],intl1,charb[],intl2) { if(l1! =l2)return0; inti; for(i=0;i if(a[i]! =b[i])return0; return1; } intmystrlen(char*p) { intl=0; while(*p++! =0) l++; returnl; } intmain() { chars1[1000]={0},s2[1000]={0}; intl1,l2; scanf("%s%s",s1,s2); l1=mystrlen(s1); l2=mystrlen(s2); strtoupper(s1,l1); strtoupper(s2,l2); sort(s1,l1); sort(s2,l2); if(mystrcmp(s1,l1,s2,l2))printf("Y"); elseprintf("N"); return0; } 试题编号ALGO-90 算法训练出现次数最多的整数 问题描述 编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20。 然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。 如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。 输入格式: 第一行是一个整数N,N£20;接下来有N行,每一行表示一个整数,并且按照从小到大的顺序排列。 输出格式: 输出只有一行,即出现次数最多的那个元素值。 输入输出样例 样例输入 5 100 150 150 200 250 样例输出 150 本题的C++参考代码如下: #include"iostream" #include"string" usingnamespacestd; intmain() { intn; cin>>n; if(n<=0)return0; string*a=newstring[n]; inti; for(i=0;i cin>>a[i]; stringnumber=a[0]; intcount=1; intflag=1; for(i=1;i { if(a[i].compare(a[i-1])==0) flag=flag+1; if(a[i].compare(a[i-1])==0||i==n-1) { if(flag>count) { count=flag; number=a[i-1]; } flag=1; } } cout< return0; } 本题的C参考代码如下: #include intmain() { intn,i,j,t,max=1,num=0; scanf("%d",&n); if(n>0) { inta[n]; for(i=0;i scanf("%d",a+i); j=num=a[0]; t=1; for(i=1;i if(a[i]==j) { ++t; if(t>max) { max=t;num=a[i]; } } else { t=1; j=a[i]; } printf("%d",num); } return0; } 试题编号ALGO-87 算法训练字串统计 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。 输入格式 第一行一个数字L。 第二行是字符串S。 L大于0,且不超过S的长度。 输出格式 一行,题目要求的字符串。 输入样例1: 4 bbaabbaaaaa 输出样例1: bbaa 输入样例2: 2 bbaabbaaaaa 输出样例2: aa 数据规模和约定 n<=60 S中所有字符都是小写英文字母。 提示 枚举所有可能的子串,统计出现次数,找出符合条件的那个 本题的C++参考代码如下: #include #include intmain() { chars[65],str[65]; intmax=0,t,n,len; scanf("%d%s",&n,s); len=strlen(s); if(n<=len) { charss[65],tt[65]; for(inti=len;i>=n;i--) { ss[i]=tt[i]='\0'; for(intj=0;j<=len-i;j++) { t=1; for(intk=0;k ss[k]=s[k+j]; for(intx=j+1;x<=len-i;x++) { for(inty=0;y tt[y]=s[y+x]; if(strcmp(ss,tt)==0) t++; } if(t>max) { max=t; strcpy(str,ss); //printf("%s\n",str); } } } printf("%s\n",str); } } 本题的C参考代码如下: #include #include intmain(){ charS[1000],str[1000][1000],temp[100],out[100]; intL,i=0,s,otongji=0,ttongji,a,b,c; scanf("%d%c%c",&L,&S[0],&S[0]); while(S[i]! ='\n'){ scanf("%c",&S[i+1]); i++; } S[i]='\0'; for(s=i+1;L<=s;L++){ for(a=0;a for(b=0;b str[a][b]=S[a+b]; } str[a][b]='\0'; } for(i=0;i for(b=0;b if(str[b][0]! ='\0'){
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 训练 普通 试题