PTA实验七数组程序设计
纯个人看法,不是最佳
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;
}