PTA实验七 数组程序设计答案

文章详细介绍了C++中的数组操作,包括逆序、最大值、个位数字统计、数组元素差异查找、排序算法(如插入排序、选择排序)、矩阵计算、局部极大值查找、鞍点检测、螺旋矩阵生成、连连看游戏逻辑、字符串处理(逆序、查找、凯撒密码)以及字符串转十进制等技术。
摘要由CSDN通过智能技术生成

纯个人看法,不是最佳

7-1 将数组中的数逆序存放

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int a[n];
    for(int i=0;i<n;i++)cin>>a[i];
    reverse(a,a+n); //利用reverse函数秒了(在algorithm库里)
    for(int i=0;i<n;i++){
        if(i==0)cout<<a[i];
        else cout<<' '<<a[i];
    }
}

7-2 求最大值及其下标

#include <iostream>
using namespace std;
int main(){
    int n,a[10];
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    int max=a[0],index=0;
    for(int i=0;i<n;i++){
        if(a[i]>max){max=a[i];index=i;}
    }
    cout<<max<<' '<<index;
}

7-3 求一批整数中出现最多的个位数字

#include <iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    //定义一个0-9的数组
    int b[10]={0}; //每个数字的数量初始化都是0
    //数字范围就是0-9,所以我们可以利用字符串的形式做
    while(n--){
        string a;
        cin>>a;
        //遍历字符串的每个字符
        for(auto c:a){
            int d=c-'0'; //字符2转换ASCII即为2
            b[d]++; //放入对应的下标,且数量+1
        }
    }
    int max=b[0];
    for(int i=1;i<10;i++)if(b[i]>=max)max=b[i];
    cout<<max<<':';
    for(int i=0;i<10;i++){
        if(b[i]>0){
            if(b[i]==max)cout<<' '<<i;
        }
    }
}

7-4 找出不是两个数组共有的元素

#include <iostream>
using namespace std;
int main(){
    int n,n1,a[21],b[21],c[200],num=0,temp=0,i,j;
    cin>>n;
    for(i=0;i<n;i++)cin>>a[i];
    cin>>n1;
    for(i=0;i<n1;i++)cin>>b[i];
    for(i=0;i<n;i++){
        for(j=0;j<n1;j++){
            if(a[i]==b[j])break;
        }
        if(j==n1)c[num++]=a[i];
    }
    for(i=0;i<n1;i++){
        for(j=0;j<n;j++){
            if(b[i]==a[j])break;
        }
        if(j==n)c[num++]=b[i];
    }
    for(i=0;i<num;i++){
        for(j=0;j<i;j++){
            if(c[i]==c[j])break;
        }
        if(j==i){
            if(temp)cout<<' ';
            cout<<c[i];
            temp++;
        }
    }
}
//不是很优化,就是定义a,b数组,将各自不同的数字均放入数组c中
//c数组每取一个数,就跟自己的前几个数判断是否重复
//且第一个数一定会打印,如果c[i+1]==c[i]则跳过进行下一次判断
//即跳转到c[i+2]

7-5 简化的插入排序

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,a[10];
    cin>>n;
    //由于就添加一个整数,直接加入数组中排序就可以
    for(int i=0;i<n+1;i++)cin>>a[i];
    sort(a,a+n+1); //快速排序函数(在algorithm库)
    for(int i=0;i<n+1;i++)cout<<a[i]<<' ';
}

7-6 选择法排序

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,a[10],maxindex;
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=0;i<n-1;i++){
        maxindex=i;
        for(int j=i+1;j<n;j++){
            if(a[j]>a[maxindex])maxindex=j;
        }
        swap(a[maxindex],a[i]);
    }
    for(int i=0;i<n;i++){
        if(i==0)cout<<a[i];
        else cout<<' '<<a[i];
    }
}

7-7 组个最小数

#include <iostream>
using namespace std;
int main(){
    int a[10],n;
    //数字范围0-9,直接利用下标就可以了
    for(int i=0;i<10;i++)cin>>a[i];
    //i从1开始,先跳过0,判断1-9间数量不为0的第一个数
    for(int i=1;i<10;i++){
        if(a[i]>0){
            cout<<i; //打印一次
            a[i]--; //数量减一
            break; //退出
        }
    }
    //从0开始打印,直到每个数字数量打完
    for(int i=0;i<10;i++){
        while(a[i]!=0){
            cout<<i;
            a[i]--;
        }
    }
}

7-8 求矩阵各行元素之和

#include <iostream>
using namespace std;
int main(){
    int m,n,a,sum=0;
    cin>>m>>n;
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            cin>>a;
            sum+=a;
        }
        cout<<sum<<endl;
        sum=0;
    }
}

7-9 求矩阵的局部极大值

#include <iostream>
using namespace std;
int a[1000][1000];
int main() {
    int m, n;
    cin >> m >> n;
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++)cin >> a[i][j];
    }
    int t = 0;
    for (int i = 2; i < m; i++) {
        for (int j = 2; j < n; j++) {
            int up = a[i - 1][j], down = a[i + 1][j], left = a[i][j - 1], right = a[i][j + 1];
            if (a[i][j] > up && a[i][j] > down && a[i][j] > left && a[i][j] > right) {
                cout << a[i][j] << ' ' << i << ' ' << j << endl;
                t = 1;
            }
        }
    }
    if (t == 0)cout << "None" << ' ' << m << ' ' << n;
    return 0;
}
//思路:i与j从2开始,且分别小于m与n,意思为不为边界数值
//定义上下左右的数值,进行比大小判断即可,t为bool类型

7-10 找鞍点

#include <iostream>
using namespace std;
int main() {
    int n;
    cin>>n;
    int a[6][6];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) cin>>a[i][j];
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
        //定义两个bool类型的变量:f1,f2
        //在定义一个t盒子为第一行依次的4个数(只需要判断第一行的数即可)
            int f1 = 0, f2 = 0;
            int t = a[i][j];
            //判断行中是否最大
            for (int k = 0; k < n; k++) {
                if (t < a[i][k]) {
                    f1 = 1;
                    break;
                }
            }
			//判断列中是否最小
            for (int k = 0; k < n; k++) {
                if (t > a[k][j]) {
                    f2 = 1;
                    break;
                }
            }
            //有一个满足打印退出(题目说明至多有一个)
            if (f1 == 0 && f2 == 0) {
                cout<<i<<' '<<j;
                return 0;
            }
        }
    }
    //否则就打印NONE
    cout<<"NONE";
    return 0;
}

7-11 螺旋方阵

螺旋矩阵
根据图片来看,螺旋矩阵数值排列依次方向的顺序为右–下–左–上。
向右走,x的改变量不变,所以为0,而y的改变量+1,所以为1。
向下走,x的改变量+1,所以为1,而y的改变量不变,所以为0。

#include <iostream>
using namespace std;
int c[10][10];
int main(){
    int n;
    cin>>n;
    //对应的改变量
    int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
    for(int x=0,y=0,d=0,k=1;k<=n*n;k++){
    	//每次先输入一个k
        c[x][y]=k;
        //加上偏移量
        int a=x+dx[d],b=y+dy[d];
        //数组越界即改变方向
        if(a<0||a>=n||b<0||b>=n||c[a][b]){
            d=(d+1)%4;
            //重新加上偏移量
            a=x+dx[d],b=y+dy[d];
        }
        x=a,y=b;
    }
    //最后输出
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++)printf("%3d",c[i][j]);
        cout<<endl;
    }
}

7-12 简易连连看

#include <iostream>
using namespace std;
//定义的数组,没啥好说的
char a[10][10];
//这个是判断矩阵是否全为*号
bool ispri(char a[][10],int n){
    for(int i=1;i<=2*n;i++){
        for(int j=1;j<=2*n;j++){
            if(a[i][j]!='*')return false;
        }
    }
    return true;
}
//这个是用来输出的
void pri(char a[][10],int n){
    for(int i=1;i<=2*n;i++){
        for(int j=1;j<=2*n;j++){
            if(j==1)cout<<a[i][j];
            else cout<<' '<<a[i][j];
        }
        cout<<endl;
    }
}
int main(){
    int n,x1,y1,x2,y2,k,s=0;
    cin>>n;
    for(int i=1;i<=2*n;i++){
        for(int j=1;j<=2*n;j++)cin>>a[i][j];
    }
    cin>>k;
    while(k--){
        cin>>x1>>y1>>x2>>y2;
        //判断条件,依题意得
        if(a[x1][y1]==a[x2][y2]&&a[x1][y1]!='*'){
            a[x1][y1]='*';
            a[x2][y2]='*';
            //如果都为*号就打印Con...,然后退出
            if(ispri(a,n)==true){cout<<"Congratulations!";return 0;}
            //否则就输出
            else pri(a,n);
        }
        //判断条件不成立,输出Uh-oh,计数为3时退出
        else {
            s++;
            cout<<"Uh-oh"<<endl;
            if(s==3){cout<<"Game Over";return 0;}
        }
    }
    return 0;
}

7-13 字符串逆序

最简单的一题没有之一

#include <iostream>
using namespace std;
int main(){
    string a;
    //利用getline函数将字符串读入
    getline(cin,a);
    //倒着输出,a.size()是字符串的长度
    for(int i=a.size()-1;i>=0;i--)cout<<a[i];
}

7-14 查找指定字符

#include <iostream>
using namespace std;
int main(){
    char c;
    string a;
    //getchar输入一个字符,用cin也可以
    c=getchar();
    getchar(); //去换行用的,重要的一步
    getline(cin,a); //输入一个字符串
    //因为要打印下标,所以我们用数组的形式
    //找最大的,所以从后往前找
    for(int i=a.size()-1;i>=0;i--){
        if(a[i]==c){cout<<"index = "<<i;return 0;}
    }
    cout<<"Not Found";
    return 0;
}

7-15 凯撒密码

#include <iostream>
using namespace std;
int main(){
    string a;
    int t;
    getline(cin,a);
    cin>>t;
    //因为偏移量有可能大于26或者小于-26,所以要%26
    t=t%26;
    //遍历每个字符
    for(auto &c:a){
    	//大于0字母向后走
        if(t>0){
            if(c>='a'&&c<='z')c=(c-'a'+t)%26+'a';
            else if(c>='A'&&c<='Z')c=(c-'A'+t)%26+'A';
        }
        //向前走
        else{
        	//因为是负的所以还要加上26
            if(c>='a'&&c<='z')c=(c-'a'+t+26)%26+'a';
            else if(c>='A'&&c<='Z')c=(c-'A'+t+26)%26+'A';
        }
        //有改变的改变后输出,没有的直接输出
        cout<<c;
    }
}

7-16 字符串转换成十进制整数

不是很优化,不过可以看看我的思路哈哈哈

#include <iostream>
using namespace std;
int main(){
	//定义两个字符串a与b
    string a,b;
    int index,index1,sum=0;
    //输入字符串a,a是原字符串
    getline(cin,a);
    //遍历a,把16进制的字符放入b字符串中
    for(auto c:a){
        if(c>='a'&&c<='f')b+=c;
        else if(c>='0'&&c<='9')b+=c;
        else if(c>='A'&&c<='F')b+=c;
    }
    //找负号,找到第一个符号,记住他的下标然后退出
    for(int i=0;i<a.size();i++){
        if(a[i]=='-'){index=i;break;}
    }
    //找16进制,找到第一个16进制符,记住他的下标,然后退出
    for(int i=0;i<a.size();i++){
        if(a[i]>='a'&&a[i]<='f'){index1=i;break;}
        else if(a[i]>='0'&&a[i]<='9'){index1=i;break;}
        else if(a[i]>='A'&&a[i]<='F'){index1=i;break;}
    }
    //16进制转10进制的过程
    for(int i=0;i<b.size();i++){
        if(b[i]>='a'&&b[i]<='f')sum=sum*16+b[i]-'a'+10;
        else if(b[i]>='0'&&b[i]<='9')sum=sum*16+b[i]-'0';
        else if(b[i]>='A'&&b[i]<='F')sum=sum*16+b[i]-'A'+10;
    }
    //如果第一个负号的下标在第一个16进制符的前面,则就是负数,反之为正数
    if(index<index1)cout<<sum*-1;
    else cout<<sum;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值