【C/PTA】数组进阶练习(三) 您所在的位置:网站首页 b和d的第一笔都是l对么 【C/PTA】数组进阶练习(三)

【C/PTA】数组进阶练习(三)

2024-03-26 06:27| 来源: 网络整理| 查看: 265

本文结合PTA专项练习带领读者掌握数组,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。

目录 7-1 数组-排名查询7-2 数组-人数过半7-3 数组-数值插入7-4 数组-冒泡排序7-5 数组-删除元素7-6 数组-歌手得分7-7 数组-前K个成绩7-8 数组-绝对值排序7-9 数组-该死的数学课7-10 数组-麻麻的起司猫7-11 数组-小光头的反攻7-12 数组-无聊的游戏7-13 数组-Shc的数字7-14 数组-简单的斐波那契数列7-15 数组-简单的游戏7-16 数组-买买买7-17 数组-牌面累加7-18 数组-咸鱼翻身7-19 数组-冰欺凌球7-20 数组-粉红猪的斐波那契数列7-21 序列元素删除7-22 数组-田地之争7-24 数组-令人发指的清明SAMA7-23 数组-菇菇叛徒7-25 数组-麻麻的难题7-26 数组-残忍的麻麻7-28 数组-初至宿舍7-29 数组-宿舍的灯7-30 数组-矩阵交换7-31 数组-土豪shc7-32 数组-矩阵乘法7-33 数组-胖虎和大熊7-34 数组-转置矩阵7-35 数组-排队吹风7-36 数组-矩阵乘法II7-37 数组-病人排序7-38 数组-蜿蜒蛇形7-39 数组-抢回蓝爸爸7-40 数组-胡?福!7-41 数组-字符串修改7-43 数组-帮AC怪找子串7-44 数组-LEN7回文串7-45 字符串逆序7-46 字符串替换7-47 统计字符出现次数7-48 IP地址转换

7-1 数组-排名查询

已知N个人的成绩排名,按排名从小到大输出这N个人的编号。 输入格式:

第一行输入一个正整数N(N scanf("%d",&a[i]); }//输入23154 int count=0; for(int i=1;i if(a[j]==i) //j=2时a[j]=1 { if(count==n-1) //对最后一个数字进行处理 { printf("%d",j+1); } else printf("%d ",j+1); //输出编号3 count++; break; } } } } 7-2 数组-人数过半

输入N个数,求出现次数超过总数一半的数。数据保证存在这个数。 输入格式:

第一行输入一个正整数N(N scanf("%lld",&a[i]); } for(long long int i=0;i if(a[j]>a[j+1]) { long long int t=a[j+1]; a[j+1]=a[j]; a[j]=t; } } } //进行最大数的判断 long long int count=1; for(long long int i=0;i printf("%lld",a[i]); break; } } } 7-3 数组-数值插入

输入一个非降序列和一个数,将这个数插入到非降序列中并保持序列非降。 输入格式: 第一行输入一个正整数N(N scanf("%d",&a[i]); } int x; scanf("%d",&x); for(int i=0;i//逆序往后移 for(int j=n-1;j>=0;j--) { a[j+1]=a[j]; } //x赋值给a[0] a[0]=x; break; } //x在其中的情况 else if(x>=a[i]&&x a[j+1]=a[j]; } //把x赋值给a[i+1] a[i+1]=x; break; } //x最大的情况 else if(x>=a[n-1]) { a[n]=x; } } for(int i=0;i int n;scanf("%d",&n);int a[n]; for(int i=0;i for(int j=0;j int t=a[j+1]; a[j+1]=a[j]; a[j]=t; } } } for(int i=0;i int n;scanf("%d",&n);int a[n]; for(int i=0;i if(x==a[i]) { a[i]=1999999;//取特殊值 } } for(int i=0;i if(i==n-1||a[i+1]==1999999) printf("%d",a[i]); else printf("%d ",a[i]); } } }

方法二:使用双指针来实现。一个指针用于遍历原数组,另一个指针用于记录删除指定元素后的新数组的位置。

#include int main(){ int n;scanf("%d",&n);int a[n]; for(int i=0;i if(a[i]!=x) { a[k]=a[i];//将非指定元素移到前面 k++; } } for (int i=0;i int n;scanf("%d",&n);int a[n];double sum; for(int i=0;i for(int j=0;j int t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } for(int i=1;i int n;scanf("%d",&n);int a[n]; for(int i=0;i for(int j=0;j int t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } for(int i=0;i int n;scanf("%d",&n);int a[n],b[n]; for(int i=0;i a[i]*=-1; } } for(int i=0;i if(a[j] if(b[j]>b[j+1]) { int q=b[j+1]; b[j+1]=b[j]; b[j]=q; } } } } for(int i=0;i if(b[i] int n,m;scanf("%d%d",&n,&m); int a[n];a[0]=2; for(int i=1;i//对每组进行处理 sum=0; for(i=j;i//处理剩余个数 int all=0; for(int i=groupcount*m;i int n,m;scanf("%d%d",&n,&m);int a[n],b[m]; for(int i=0;i scanf("%d",&b[i]); } for(int i=0;i if(a[j] if(min>a[i]) min=a[i]; } printf("%d",min); } 7-11 数组-小光头的反攻

小姑凉自从找到了一直拥有蓝爸爸的方法后就再也不需要小光头了,小光头觉得很难过。于是小光头偷偷跟着小姑凉一起去上数学课,想知道小姑凉怎么变得这么厉害(跟数学课真的有关系么?= =)。他发现从小就只会玩火的小姑凉数学真的糟透了,于是他想出了一个办法,他和小姑凉打赌,如果小姑凉不能解出他给的题目,小姑凉就要把蓝爸爸让给他,还不能生气,要跟他一起愉快地玩耍。小姑凉涉世未深,于是天真地答应了。

小光头的题目是这样的:小光头家有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?

当然,从小就只玩火的小姑凉一定是解不出来的啦,你能帮帮她么? 输入格式:

第一行包含一个整数N,表示共有N组数据;

接下来有N行,每行包含一个整数M(1 int m;scanf("%d",&m); int a[50]; a[1]=1;//到达第一阶的走法为1 a[2]=1;//...为2 for(int i=3;i int n;scanf("%d",&n); int a[n],b[n]; for(int i=0;i scanf("%d",&b[i]); } int alice=0,bob=0; for(int i=0;i int n;scanf("%d",&n);int x,nowall=0,max=-9999;//nowall表示当前序列和 for(int i=0;i nowall=x;//如果x 大于 包含x的序列和,则说明nowall为负数 //此时把序列更新 } else nowall+=x; if(nowall>max) max=nowall; } printf("%d",max); } //拿2、-3、4、5举例 //一开始nowall为0,所以nowall加2,变为2,因为max为-9999,所以max变为2 //输入-3,同理,nowall变为-1,nowall不会大于max,所以max仍为2 //输入4,4+nowall大于nowall,所以nowall被更新为4,也就是说现在从4开始计算序列 //4大于max,所以max变为4 //输入5,所以nowall+5变成9,9大于max,所以序列和为9 7-14 数组-简单的斐波那契数列

斐波那契数列是一种非常有意思的数列,由0和1开始,之后的斐波那契系数就由之前的两数相加。用数学公式定义长度为n斐波那契数列F则可以看成如下形式:

F_0=0;

F_1=1;

F_i=F_{i-1}+F_{i-2}(2 if(a[0]==0) return 1;//仅有0 则是F'数列 else return 0; } int b1=0,b2=1,c; for(int i=2;i int n;scanf("%d",&n);int a[n]; for(int i=0;i int n;scanf("%d",&n);int x; int maxmy=0;//你当前摸到的最大的牌 int maxmycount=1;//你要丢牌的轮数 int allmy=0;//你的点数和 int allhe=0;//他的点数和 for(int i=1;i if(x>maxmy)//如果你摸到的牌比你之前的都大 { maxmy=x; maxmycount=i/2; } allmy+=x; } } if(allmy-maxmy scanf("%d",&a[i]); } int l,r; for(int i=0;i sum+=a[i]; } printf("%d\n",sum); } } 7-17 数组-牌面累加

粉红猪和呲溜喵在玩游戏,规则如下:每个人有N张牌,每张牌有一个数字,从第一张牌开始累加,累加和大的获胜。 输入格式:

第一行包含一个正整数N(0 < N scanf("%d",&a[i]); sum+=a[i]; } for(int i=0;i int n,m;scanf("%d%d",&n,&m);int a[n]; int count=0; for(int i=0;i int n;scanf("%d",&n);double a[n]; for(int i=0;i for(int j=0;j double t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } for(int i=0;i int n; scanf("%d",&n); long long int a=1,b=1; if(n==1) printf("%lld",a); else if(n==2) printf("%lld",b); else { long long int c; for(int i=3;i int value; int isabandoned;//是否需要删除 }; int main() { int n;scanf("%d",&n); struct number a[n]; for(int i=0;i scanf("%d",&b); for(int j=n-1;j>=0;j--) {//从后往前遍历 找到第一个匹配的数字并将其标记为需要删除 //如 1 2 3 1序列,当b=1时,从后往前遍历,最后的1被标记,然后退出循环 if(a[j].value==b) { a[j].isabandoned=1; break; } } } int hasprinted=0; for(int i=0;i if(hasprinted==0)//如果是第一个未被删除的数字,则直接输出 { printf("%d",a[i].value); hasprinted=1; } else {//如果是后面的未被删除的数字,则先输出一个空格再输出数字 printf(" %d",a[i].value); } //不能使用传统的“仅当i为n-1时输出%d 其余时候输出空格+%d”来实现,因为最后一个数可能会被删除 } } printf("\n"); } 7-22 数组-田地之争

转眼间双十一又来了,又到了戈壁上菇菇一族分配土地的日子(什么奇葩设定啊!)。为了公平起见,麻麻想出了一个聪明的办法:将土地分为N块,菇菇们一起到每块土地区域接受任务,最后完成任务最多的菇菇有优先选择权。因为可能在一个区域上重复接受任务,菇菇们记混了任务属于哪个区域,你能帮忙它们抢到选择权么? 输入格式:

第一行输入一个整数N(0}; int a,b; while(1) { scanf("%d%d",&a,&b); if(a==0&&b==0) break; task[a-1]+=b; } for(int i=0;i int n,m;scanf("%d%d",&n,&m);int a[n][m]; for(int i=0;i c[i]+=a[i][j]; } } int d[m]; for(int i=0;i//d[i]储存每一列的和 for(int j=0;j if(max1 maxss[count1]=i; count1++; } } int max2=d[0],count2=1;int maxxx[m];maxxx[0]=0; for(int i=0;i max2=d[i]; count2=1; maxxx[0]=i; } else if(max2==d[i]) { maxxx[count2]=i; count2++; } } if(max1>=max2)//优先输出行 printf("0 %d",maxss[0]+1); else printf("1 %d",maxxx[0]+1); } 7-23 数组-菇菇叛徒

残忍的清明SAMA为了报复社会决定残害菇菇一族,于是她派遣了一些被她黑化的菇菇到菇菇家族里去当卧底。但是菇菇一族还是有聪明的菇菇发现了,于是报告了麻麻,麻麻决定召集所有菇菇,找出卧底。 输入格式:

第一行包括两个正整数N,M(0 for(int j=0;j for(int j=0;j //表示叛徒所在的行列值 b[count][0]=i+1; b[count][1]=j+1; count++; } } } printf("%d\n",count); for(int i=0;i int n,m;scanf("%d%d",&n,&m);int a[n][m]; for(int i=0;i scanf("%d",&a[i][j]); } } int count=0,min=a[0][0]; int b[n*m][2];//用于记录行列值 for(int i=0;i if(min>a[i][j]) {//如果找到更小的,则重置矩阵b min=a[i][j]; b[0][0]=i+1; b[0][1]=j+1; count=1; } else if(min==a[i][j]) { b[count][0]=i+1; b[count][1]=j+1; count++; } } } printf("%d\n",count); for(int i=0;i int n;scanf("%d",&n); double a,b;scanf("%lf%lf",&a,&b);double c[n][2],e[n]; for(int i=0;i scanf("%lf",&c[i][j]); } } for(int i=0;i if(min>e[i]) { min=e[i]; f[0][0]=i+1; count=1; } else if(min==e[i]) { f[count][0]=i+1; count++; } } printf("%d\n",count); for(int i=0;i if(c=='R') { for(int i=1;i for(int j=1;j for(int i=1;i for(int j=1;j int n,m,k;scanf("%d%d%d",&n,&m,&k);int a[101][101]; for(int i=1;i a[i][j]=0;//初始化灯灭为0 } } for(int i=0;i for(int j=1;j int n,m;scanf("%d%d",&n,&m);int num,c[10][10]={0};int max=-1; if(m==0) { printf("0");return 0; } for(int i=0;i//此时x1、y1、x2、y2均已减一 int t[1000][1000]; for(int i=0;i t[i][j]=a[x1+i][y1+j]; } } //函数功能类似于: //t=a; //a=b; //b=t; for(int i=0;i a[x1+i][y1+j]=a[x2+i][y2+j]; } } for(int i=0;i a[x2+i][y2+j]=t[i][j]; } } } int main() { int n,m;scanf("%d%d",&n,&m); int a[1000][1000]; for(int i=0;i for(int j=0;j int n,q;scanf("%d%d",&n,&q); getchar(); int row[10001]={0};//用于记录每行是否被购买过,初始值为0 int col[10001]={0};//用于记录每列是否被购买过 for(int i=0;i for(int j=1;j sum+=(j+num); } } row[num]=1; } else { for(int j=1;j sum+=(j+num); } } col[num]=1; } //如果都被购买过,直接输出sum为0即可 //如果都没被购买过,累加即可 printf("%d",sum); if(i!=q-1) printf("\n"); } } 7-32 数组-矩阵乘法

对于给定的一个M* N大小的矩阵A和一个N* M大小的矩阵B,请你帮忙计算一下矩阵A乘以矩阵B的结果。 输入格式:

第一行输入两个正整数M和N(3 for(int j=0;j for(int j=0;j for(int j=0;j c[i][j]+=(a[i][k])*(b[k][j]); } } } for(int i=0;i printf("%d",c[i][j]); if(j!=m-1) printf(" "); } if(i!=m-1) printf("\n"); } } 7-33 数组-胖虎和大熊

数学老师把胖虎和大熊叫到办公室,因为胖虎和大熊数学考试又没有及格,老师很生气决定惩罚他们,如果胖虎和大熊能解决老师手头上的这个问题,就减轻对他们的惩罚。大熊知道自己做不出来,所以向你求助。

问题是这样的:有T个班级,每个班级有n个学生,问你每个班级有几名学生的数学分数低于平均分。 输入格式:

第一行包含一个正整数T(0 < T int n;scanf("%d",&n); int a[n],count=0;double sum=0,aver; for(int i=0;i if(a[i] for(int j=0;j for(int i=0;i int n;scanf("%d",&n);int a[n+1],b[n+1]; for(int i=1;i for(int j=1;j int t=a[j]; a[j]=a[j+1]; a[j+1]=t; int s=b[j]; b[j]=b[j+1]; b[j+1]=s; } } } for(int i=1;i int n,m;scanf("%d%d",&n,&m);int a[n][m]; for(int i=0;i scanf("%d",&a[i][j]); } } int p,q;scanf("%d%d",&p,&q);int b[p][q]; for(int i=0;i scanf("%d",&b[i][j]); } } int c[n][q]; if(m!=p) printf("sad"); else { for(int i=0;i c[i][j]=0; for(int k=0;k for(int j=0;j int n;scanf("%d",&n);int a[n],b[n]; for(int i=0;i for(int j=0;j int t=b[j]; b[j]=b[j+1]; b[j+1]=t;//当对程度进行冒泡排序时 int s=a[j];//编号也需要排序 a[j]=a[j+1]; a[j+1]=s; } } } for(int i=0;i int n;scanf("%d",&n);int a[n][n]; int t=1; int startrow=n-1,endcol=n-1; while(t a[startrow][i]=t++; } startrow--; for(int i=endcol;i>=0;i--) { a[startrow][i]=t++; } startrow--; } for(int i=0;i if(j!=n-1) printf("%d ",a[i][j]); else printf("%d",a[i][j]); } printf("\n"); } } 7-39 数组-抢回蓝爸爸

小姑凉经过扇子妈妈的训练提高了智商!于是小姑凉兴致勃勃地去找小光头,想抢回蓝爸爸。为了公平,小光头提出通过比赛来决定蓝爸爸归谁。

小光头很喜欢扫雷游戏,于是他们决定比一个跟扫雷游戏有关的比赛。

游戏规定,对于给出的地雷图,给出标定后的地雷图。(就跟扫雷游戏类似啦大家都会吧?!)谁最快得到标定好的地雷图,谁就是获胜方。小姑凉又萌萌哒向你求救了帮帮她吧~

你的任务是在已知地雷出现位置的情况下,得到各个方块中的数据。 输入格式:

输入有多组数据。

每组数据的第一行有两个数字,m,n(0 for(int dy=-1;dy count++; } } } return count; } int main() { int m,n; while(scanf("%d%d",&m,&n)==2) { if(m==-1||n==-1) break; char a[100][100]; for(int i=0;i if(a[i][j]!='*')//如果该位置不是*,输出周围地雷个数 { int geshu=count1(a,m,n,i,j); a[i][j]=geshu+'0';//将个数转换为字符类型存储在数组中 } }//如果该位置是*照常输出 } for(int i=0;i int n;scanf("%d",&n); getchar(); for(int i=0;i if(a[i]=='h') { a[i]='f'; } else if(a[i]=='H') { a[i]='F'; } } a[len]='\0'; printf("%s\n",a); if(i!=n-1) printf("\n"); } } 7-41 数组-字符串修改

编程课上,老师给Alice布置了一个任务,给定一个字符串,该字符串只包括拉丁字母大写字母和小写字母,让她写一段程序来实现以下几点操作:

1.删除所有的元音;

2.插入一个”.”在每个辅音字母前面;

3.替换所有大写的辅音字母为相对应的小写字母。

元音字母是‘a’、‘o’、‘e’、‘u’,‘i’或‘A’、‘O’、‘E’、‘U’、‘I’,其余的均为辅音字母。 输入格式:

输入一个字符串,长度不超过10000。 输出格式:

输出修改后的字符串。 输入样例1:

Tour

输出样例1:

.t.r

输入样例2:

codeforces

输出样例2:

.c.d.f.r.c.s

#include #include #include int is(char c) { if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u'||c=='A'||c=='E'||c=='I'||c=='O'||c=='U') return 1; else return 0; } int main() { char a[10001]; scanf("%s",a); int len=strlen(a); for(int i=0;i printf(".%c",tolower(a[i]));//则输出对于的小写字母 } } } 7-43 数组-帮AC怪找子串

AC monster对Accept情有独钟。

现在希望你能找出输入的字符串中所含“Accept”的个数。

例如:WEQAcceptopiacceptwAcceptqqq中含有2个“Accept”子串。 输入格式:

输入仅一行,包含一个长度不超过10000个字符的字符串。 输出格式:

输出一个整数,表示“Accept”子串的个数。 输入样例1:

aeqweqsssaccept

输出样例1:

0

输入样例2:

Acceptiiiioac

输出样例2:

1

#include #include int main() { char a[10001]; scanf("%s",a); int len=strlen(a); int count=0; for(int i=0;i if(a[i+j]!="Accept"[j])//"Accept"[j]表示字符串常量"Accept"中的第j个字符 //由j递增来检查i到i+6是否与accept相同 { found=0; break; } } if(found) count++; } printf("%d\n",count); } 7-44 数组-LEN7回文串

呲溜喵很喜欢7这个数字,请你找出输入字符串中,长度为7的所有回文串。 输入格式:

输入仅一行,包括一个长度不超过1000的字符串。 输出格式:

分多行输出原字符串中所有长度为7的回文子串,每行输出一个,行末均有回车(数据保证有解)。 输入样例:

abababacacadddac

输出样例:

abababa cadddac

#include #include int is(char *a,int start,int end) { while(start char a[1001]; scanf("%s",a); int len=strlen(a); for(int i=0;i for(int j=i;j a[i]=c; i++; } for(int j=i-1;j>=0;j--) { printf("%c",a[j]); } }

方法二:引入gets及strlen

#include #include int main() { char a[80]; gets(a); for(int i=strlen(a)-1;i>=0;i--) printf("%c",a[i]); } 7-46 字符串替换

本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:

原字母 对应字母 A Z B Y C X D W … … X C Y B Z A

输入格式:

输入在一行中给出一个不超过80个字符、并以回车结束的字符串。 输出格式:

输出在一行中给出替换完成后的字符串。 输入样例:

Only the 11 CAPItaL LeTtERS are replaced.

输出样例:

Lnly the 11 XZKRtaO OeGtVIH are replaced.

#include int main() { char c,a[80],b[80]; int i=0; while((c=getchar())!='\n') { a[i]=c; i++; } for(int j=0;j b[j]='A'+'Z'-a[j]; } else b[j]=a[j]; printf("%c",b[j]); } } 7-47 统计字符出现次数

本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。 输入格式:

输入第一行给出一个以回车结束的字符串(少于80个字符);第二行输入一个字符。 输出格式:

在一行中输出给定字符在给定字符串中出现的次数。 输入样例:

programming is More fun! m

输出样例:

2

方法一:数组实现

#include int main() { char a[80],c,d; int i=0,count=0; while((c=getchar())!='\n') { a[i]=c; i++; } d=getchar(); for(int j=i-1;j>=0;j--) { if(d==a[j]) count++; } printf("%d",count); }

方法二:引入gets及strlen

#include #include int main() { char a[80],c; int count=0; gets(a); c=getchar(); for(int i=0;i count++; } } printf("%d",count); } 7-48 IP地址转换

一个IP地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。 输入格式:

输入在一行中给出32位二进制字符串。 输出格式:

在一行中输出十进制格式的IP地址,其由4个十进制数组成(分别对应4个8位的二进制数),中间用“.”分隔开。 输入样例:

11001100100101000001010101110010

输出样例:

204.148.21.114

#include #include int main() { char a[33]; int t=7;//当前处理的二进制位在8位中的位置 int sum=0;//当前部分的十进制结果 gets(a); for(int i=0;i printf("%d",sum); t=7; sum=0; if(i!=31) printf("."); } else t--; } }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有