基础语法数组的练习
作者:xinyi
第一题 数组替换
题目链接:https://www.acwing.com/problem/content/739/
核心思路:定义长度为 10 的数组,输入 10 个整数,若输入值≤0 则替换为 1,最后按指定格式输出数组元素。
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int x[10];
int n;
for (int i=0;i<=9;i++){
cin >>n;
if(n<=0) x[i]=1;
else x[i]=n;
printf("X[%d] = %d\n",i,x[i]);
}
return 0;
}
第二题 数组填充
题目链接:https://www.acwing.com/problem/content/740/
核心思路:输入初始值v,数组第 1 个元素为v,后续元素为前一个元素的 2 倍,循环填充 10 个元素后按格式输出。
#include <cstdio>
#include <iostream>
using namespace std;
int main(){
int v;
int a[10];
cin >>v;
for(int i = 1;i<10;i++){
a[0]=v;
a[i]=a[i-1]*2;
}
for(int i=0;i<10;i++){
printf("N[%d] = %d\n",i,a[i]);
}
return 0 ;
}
第三题 数组选择
题目链接:https://www.acwing.com/problem/content/741/
核心思路:定义长度为 100 的双精度数组,输入 100 个数值后,筛选出≤10 的元素并按指定格式输出(保留 1 位小数)。
#include <cstdio>
#include <iostream>
using namespace std;
int main(){
double a[100];
double n;
for (int i=0;i<100;i++){
cin>>n;
a[i]=n;
}
for(int i=0;i<100;i++){
if(a[i]<=10)printf("A[%d] = %.1lf\n",i,a[i]);
}
return 0;
}
第四题 数组中的行
题目链接:https://www.acwing.com/problem/content/745/
核心思路:定义 12×12 的双精度二维数组,输入指定行号l和操作符S(求和)/M(求平均),计算该行所有元素的和或平均值并输出。
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int l;
char input;
double m[12][12];
int n;
cin>>l>>input;
for(int i= 0 ;i<12;i++){
for(int j=0;j<12;j++){
cin>>m[i][j];
//m[i][j]=n
}
}
double sum=0;
for(int i=0;i<12;i++){
sum+=m[l][i];
}
if(input=='S')cout<<sum<<endl;
else printf("%.1lf",sum/12);
return 0;
}
第五题 数组的右上半部分
题目链接:https://www.acwing.com/problem/content/747/
核心思路:定义 12×12 的双精度二维数组,计算并输出右上半部分(列号 > 行号)元素的和(S)或平均值(M),平均值保留 1 位小数。
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
char n;
cin>>n;
double a[12][12];
for(int i = 0;i<12;i++)
for(int j=0;j<12;j++)
cin>>a[i][j];
double s=0;
double sum=0;
for(int i=0;i<12;i++){
for (int j=i+1;j<12;j++){
s++;
sum+=a[i][j];
}
}
if(n=='S')cout <<sum;
else printf("%.1lf",sum/s);
return 0;
}
第六题 数组的左上半部分
题目链接:https://www.acwing.com/problem/content/749/
核心思路:定义 12×12 的双精度二维数组,计算并输出左上半部分(行号 + 列号≤10)元素的和(S)或平均值(M),平均值保留 1 位小数。
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
char n;
cin>>n;
double a[12][12];
for(int i = 0;i<12;i++)
for(int j=0;j<12;j++)
cin>>a[i][j];
double s=0;
double sum=0;
for(int i=0;i<12;i++){
for (int j=0;j<12;j++){
if(i+j<=10){
s++;
sum+=a[i][j];}
}
}
if(n=='S')cout <<sum;
else printf("%.1lf",sum/s);
return 0;
}
第七题 数组的上方区域
题目链接:https://www.acwing.com/problem/content/751/
核心思路:定义 12×12 的双精度二维数组,计算并输出上方区域(行号 0~5,列号 > 行号且行号 + 列号 < 11)元素的和(S)或平均值(M),平均值保留 1 位小数。
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
char n;
cin>>n;
double a[12][12];
for(int i = 0;i<12;i++)
for(int j=0;j<12;j++)
cin>>a[i][j];
double s=0;
double sum=0;
for(int i=0;i<5;i++){
for (int j=i+1;j+i<11;j++){
s++;
sum+=a[i][j];
}
}
if(n=='S')cout <<sum;
else printf("%.1lf",sum/s);
return 0;
}
第八题 数组的左方区域
题目链接:https://www.acwing.com/problem/content/753/
核心思路:定义 12×12 的双精度二维数组,分两部分计算左方区域元素(行号 1~5 时列号≤行号 - 1;行号 6~10 时列号≤10 - 行号)的和(S)或平均值(M),平均值保留 1 位小数。
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
char n;
cin>>n;
double a[12][12];
for(int i = 0;i<12;i++)
for(int j=0;j<12;j++)
cin>>a[i][j];
double s=0;
double sum=0;
for(int i=1;i<=5;i++){
for (int j=0;j<=i-1;j++){
s+=1;
sum+=a[i][j];
}
}
for(int i=6;i<=10;i++){
for (int j=0;j<=10-i;j++){
s+=1;
sum+=a[i][j];
}
}
if(n=='S')cout <<sum;
else printf("%.1lf",sum/s);
return 0;
}
第九题 平方矩阵
题目链接:https://www.acwing.com/problem/content/755/
说明:题目要求生成边长为n的平方矩阵,每个元素值为该元素到矩阵边界的最小距离(如边界元素为 1,向内逐层递增),代码中通过min(min(i + 1, j + 1), min(n - i, n - j))计算该距离,循环输入n直到n=0结束。
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int n;
while (cin >> n, n){
for (int i = 0; i < n; i ++){
for(int j = 0; j < n; j ++){
cout << min(min(i + 1, j + 1), min(n - i, n - j)) << " ";
}
cout << endl ;
}
cout << endl;
}
return 0;
}
第十题 数组变换
题目链接:https://www.acwing.com/problem/content/742/
核心思路:输入 20 个整数存入数组a,将a逆序存储到数组b中(如a[19]存到b[0],a[18]存到b[1]),最后按指定格式输出b的元素。
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int a[20],b[20];
for(int i =0;i<20;i++)cin >>a[i];
for(int i=19,j=0;i>=0;i--,j++) b[j]=a[i];//这里的j也可以换成19-i,最终结果一致均可AC
for(int i=0;i<20;i++) printf("N[%d] = %d\n",i,b[i]);
return 0;
}
第十一题 斐波那契数列
题目链接:https://www.acwing.com/problem/content/743/
关键注意事项:斐波那契数列第 60 项数值较大,int类型会溢出,需使用long long类型存储数组元素。
辅助截图:
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
long long a[60];
a[0]=0,a[1]=1;
for(int i=2;i<60;i++)a[i]=a[i-1]+a[i-2];
int n;
cin >>n;
while(n--){
int x;
cin >>x;
printf("Fib(%d) = %lld\n",x,a[x]);}
return 0;
}
第十二题 最小数和它的位置
题目链接:https://www.acwing.com/problem/content/744/
核心思路:输入n个整数存入数组,遍历数组找到最小值及其索引(位置),最后按指定格式输出最小值和位置。
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int n;
int a[1001];
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
int p=0;
for (int i=1;i<n;i++){
if(a[i]<a[p]) p=i;
}
printf("Minimum value: %d\n",a[p]);
printf("Position: %d",p);
return 0;
}