//数组
AcWing 737. 数组替换
输入一个长度为 10 的整数数组 X[10],将里面的非正整数全部替换为1,输出替换完成后的数组。
输入格式
输入包含 10个整数,每个整数占一行。
输出格式
输出新数组中的所有元素,每个元素占一行。
输出格式为 X[i] = x
,其中 i 为元素编号(从 0 开始),x 为元素的值。
输入样例:
10
-9
0
-4
-10
0
-2
-7
7
4
输出样例:
X[0] = 10
X[1] = 1
X[2] = 1
X[3] = 1
X[4] = 1
X[5] = 1
X[6] = 1
X[7] = 1
X[8] = 7
X[9] = 4
不用数组做法
#include<bits/stdc++.h>
using namespace std;
int main()
{
for(int i = 0; i < 10; i ++ ){
int x;
scanf("%d",&x);
printf("X[%d] = %d\n", i, x <= 0 ? 1 : x);
}
return 0;
}
用数组做法
#include<bits/stdc++.h>
using namespace std;
int a[11];
int main()
{
for(int i = 0;i < 10;i++) cin>>a[i];
for(int i = 0;i < 10;i++)
if(a[i] <= 0) a[i] = 1;//非负整数
for(int i = 0;i<10;i++) printf("X[%d] = %d\n", i, a[i]);
return 0;
}
//这里要注意数组下标从0开始,1的话不细心会出错
738. 数组填充
输入一个整数 V,输出一个长度为 10的数组N,数组中的第一个元素为 V,每个后续元素的值都为上一个元素的值的 2 倍。
例如,如果输入整数为 1,则数组为:1,2,4,8…
输入格式
输入一个整数 V。
输出格式
输出数组中的所有元素,每个元素占一行。
输出格式为 N[i] = x
,其中 i 为元素编号(从 00 开始),x 为元素的值。
输入样例:
1
输出样例:
N[0] = 1
N[1] = 2
N[2] = 4
N[3] = 8
N[4] = 16
N[5] = 32
N[6] = 64
N[7] = 128
N[8] = 256
N[9] = 512
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a;
cin>>a;
for(int i = 0;i < 10;i++)
{
printf("N[%d] = %d\n",i,a);
a = a*2;//注意这里一定要在输出之后再*2,要不然放在输出前会变成第一个值输出的是2
}
return 0;
}
739. 数组选择
输入一个长度为 100100 的数组 AA,请你按顺序输出其中不大于 1010 的所有元素。
输入格式
输入 100 个数,每个数占一行,表示数组的所有元素的值。
每个数可能是整数也可能是浮点数。
输出格式
按顺序输出数组中的所有不大于 10的元素,每个元素占一行。
输出格式为 A[i] = x
,其中 i 为元素编号,x 为元素的值。
注意,所有的 x 均保留一位小数。
输入样例:
0
-5
63
-8.5
...
输出样例:
A[0] = 0.0
A[1] = -5.0
A[3] = -8.5
...
#include<bits/stdc++.h>
using namespace std;
double a[150];
int main()
{
for(int i = 0;i < 100;i++) scanf("%lf",&a[i]);
for(int i = 0;i < 100;i++)
{
if(a[i] <= 10) printf("A[%d] = %.1lf\n",i,a[i]);
}
return 0;
}
743. 数组中的行
思路:一看就知道是遍历二维数组,符合要求即可操作
输入一个二维数组 M[12][12],根据输入的要求,求出二维数组中某一行的元素的平均值或元素的和。
输入格式
第一行输入整数L,表示所求的具体行数(行数从 0 开始计数)。
第二行包含一个大写字母,若为 S
,则表示需要求出第 L 行的元素的和,若为 M
,则表示需要求出第 L行的元素的平均值。
接下来 12 行,每行包含 1212 个用空格隔开的浮点数,表示这个二维数组,其中第 i+1 行的第 j+1 个数表示数组元素 M[i][j]。
输出格式
输出一个数,表示所求的平均数或元素的和的值,保留一位小数。
输入样例:
7
S
8.3 -9.4 -5.6 9.9 2.2 3.2 6.9 7.7 -2.9 -6.3 3.9 -1.4
-0.5 4.3 -0.3 2.3 0.7 -3.1 -6.3 5.7 -7.7 -3.7 9.7 3.8
5.8 -9.1 3.5 7.0 2.5 -2.3 6.9 2.7 5.8 -4.6 -7.8 4.3
-1.7 -8.9 -2.6 7.5 -9.6 6.4 -4.7 -8.0 0.6 6.7 -1.8 -0.4
-9.8 8.9 -3.8 -2.1 5.8 -9.4 1.3 6.3 -1.3 -6.3 -6.6 8.8
-6.3 -7.2 -6.3 -5.9 6.2 9.3 2.0 -4.3 2.7 3.6 -4.6 8.7
3.8 7.4 8.7 -2.8 6.0 -9.2 1.9 3.1 -7.2 -6.0 9.7 -8.4
-9.8 6.6 8.6 2.3 1.1 -2.9 6.6 -1.5 2.1 -5.1 6.4 -7.5
-0.6 -1.6 9.5 -6.6 3.0 3.4 -7.5 -7.9 3.1 2.0 1.7 -7.6
-9.0 9.4 6.6 -0.2 1.4 6.5 8.6 2.0 -1.3 0.2 4.0 -2.4
-7.3 -6.3 -8.6 -7.5 8.5 1.4 -3.3 7.1 0.8 3.3 3.0 0.1
3.3 9.0 1.7 5.2 -3.7 8.9 3.8 -7.4 -2.8 0.6 -2.4 7.1
输出样例:
6.9
#include<bits/stdc++.h>
using namespace std;
const int N = 13;
double M[N][N];
int main()
{
int l;
char n;
cin>>l>>n;
for(int i = 0;i<12;i++)
for(int j = 0;j<12;j++)
cin>>M[i][j];
double sum;
for(int i = 0;i < 12;i++)
sum += M[l][i];
if(n == 'S') printf("%.1lf",sum); //注意这里是大写的op的判断值(也就是S,不是s)
else printf("%.1lf",sum/12.0);
return 0;
}
745. 数组的右上半部分
输入一个二维数组 M[12][12],根据输入的要求,求出二维数组的右上半部分元素的平均值或元素的和。
右上半部分是指主对角线上方的部分,如下图所示,黄色部分为对角线,绿色部分为右上半部分:
输入格式
第一行输入一个大写字母,若为 S
,则表示需要求出右上半部分的元素的和,若为 M
,则表示需要求出右上半部分的元素的平均值。
接下来 12行,每行包含 12 个用空格隔开的浮点数,表示这个二维数组,其中第 i+1 行的第 j+1 个数表示数组元素 M[i][j]。
输出格式
输出一个数,表示所求的平均数或元素的和的值,保留一位小数。
输入样例:
M
-6.5 8.2 0.7 9.0 0.8 -4.3 0.9 -0.0 -7.9 7.1 -1.6 4.6
-9.4 -9.0 1.5 -9.0 -5.1 -0.5 -2.8 -9.1 8.0 -6.9 -5.5 -6.6
-6.8 0.3 3.8 6.1 -9.9 -9.3 8.5 8.6 5.0 6.9 -3.6 -3.0
-0.8 -1.6 -7.3 -6.7 4.4 -9.1 -9.0 1.6 0.3 -6.0 6.0 -0.8
-0.8 -6.0 -4.9 -3.9 6.4 6.2 -4.2 -0.9 7.9 1.6 -8.2 -9.2
7.8 -5.8 -5.8 -5.8 7.2 0.5 -7.9 1.2 -6.8 -9.1 0.3 -1.4
4.3 -7.2 3.5 -6.4 -9.1 -6.0 3.5 -5.1 -5.6 -6.9 -9.1 -2.1
-7.6 -7.1 0.7 -1.7 5.0 -9.0 1.4 -6.2 7.6 4.8 -7.5 4.0
-0.2 0.3 -4.2 8.4 0.7 -6.4 -2.7 3.5 -0.9 3.7 0.9 -2.7
7.1 0.1 8.4 -5.1 -7.9 -0.5 -5.3 -5.7 -4.6 9.6 -8.3 7.0
9.6 -9.8 3.3 -9.9 -6.8 6.7 3.1 1.2 -9.5 -4.3 -1.7 -9.7
1.8 5.0 8.3 -0.7 -0.9 3.2 2.5 0.5 7.3 8.3 0.3 0.9
输出样例:
-1.2
#include<bits/stdc++.h>
using namespace std;
const int N = 13;
double M[N][N];//注意这里是double,是int 的话就是0.0
int main()
{
char n;
cin>>n;
double sum = 0;
for(int i = 0;i < 12;i++)//i控制行
for(int j = 0;j < 12;j++)//j控制列
{
cin>>M[i][j];
if(i < j)
sum += M[i][j];
}
if(n == 'S') printf("%.1f",sum);
else printf("%.1f",sum/66.0);//(11+1)*11/2=66
return 0;
}
749. 数组的上方区域
输入一个二维数组 M[12][12],根据输入的要求,求出二维数组的上方区域元素的平均值或元素的和。
数组的两条对角线将数组分为了上下左右四个部分,如下图所示,黄色部分为对角线,绿色部分为上方区域:
输入格式
第一行输入一个大写字母,若为 S
,则表示需要求出上方区域的元素的和,若为 M
,则表示需要求出上方区域的元素的平均值。
接下来 12 行,每行包含 12 个用空格隔开的浮点数,表示这个二维数组,其中第 i+1 行的第 j+1 个数表示数组元素 M[i][j]。
输出格式
输出一个数,表示所求的平均数或和的值,保留一位小数。
输出结果与标准答案据对误差不超过 0.1 即视为正确。
输入样例:
S
-4.8 -8.0 -2.9 6.7 -7.0 2.6 6.5 1.7 1.9 5.6 -1.6 -6.3
-4.3 1.5 8.7 -0.3 5.4 -9.3 4.8 7.0 3.6 -8.3 -1.0 1.3
-9.9 9.7 -6.3 5.8 2.9 2.9 -7.7 4.9 -0.6 7.2 6.4 7.7
2.8 -5.8 -0.0 2.2 4.0 7.7 -3.0 -7.5 -3.5 9.7 -4.3 -8.6
-1.8 -0.1 5.4 0.6 9.9 -3.7 -1.1 0.8 -0.2 -0.0 9.9 4.5
3.0 -3.9 2.1 -9.7 5.5 9.4 -4.6 3.3 -9.6 5.1 -4.5 1.5
4.3 -5.4 -7.9 9.2 -7.7 -9.6 -1.5 -1.6 -7.2 2.0 -3.7 -0.7
8.0 2.8 -4.1 7.1 8.4 -5.6 3.9 -9.7 -1.1 3.0 -8.5 -3.3
1.7 5.1 0.1 9.2 4.5 9.7 7.2 8.6 8.7 1.1 6.7 0.3
-3.6 -7.1 -8.9 7.1 -5.9 1.6 -7.4 6.7 3.9 4.3 -2.4 -3.7
8.9 -6.2 5.0 -8.6 -1.3 -8.8 2.6 8.9 5.5 9.0 -2.2 -4.4
5.7 3.7 1.8 -2.1 -7.3 -7.9 4.7 6.0 3.3 -2.8 1.4 -6.9
输出样例:
21.7
思路:用草稿纸模拟一遍数值对于这题来说,我们只需要i模拟到第五行,然后分别列出左边和右边发现规律
#include<bits/stdc++.h>
using namespace std;
int main()
{
char op;
double sum = 0,M[12][12];
int count = 0;
cin>>op;
for(int i = 0;i < 12;i++)
for(int j = 0;j < 12;j++)
cin>>M[i][j];
for(int i = 0;i < 5;i++)
for(int j = i+1;j <= 10-i;j++)
{
count++;
sum += M[i][j];
}
if(op == 'S')printf("%.1f",sum);
else printf("%.1f",sum/count);
return 0;
}
751. 数组的左方区域
输入一个二维数组 M[12][12],根据输入的要求,求出二维数组的左方区域元素的平均值或元素的和。
数组的两条对角线将数组分为了上下左右四个部分,如下图所示,黄色部分为对角线,绿色部分为左方区域:
输入格式
第一行输入一个大写字母,若为 S
,则表示需要求出左方区域的元素的和,若为 M
,则表示需要求出左方区域的元素的平均值。
接下来 12 行,每行包含 12 个用空格隔开的浮点数,表示这个二维数组,其中第 i+1 行的第 j+1 个数表示数组元素 M[i][j]。
输出格式
输出一个数,表示所求的平均数或和的值,保留一位小数。
输入样例:
S
4.7 -3.3 -2.3 4.5 -7.0 8.7 -4.1 -3.0 -7.6 6.3 -6.6 -4.7
-7.2 9.3 -7.6 9.1 9.2 9.0 5.5 -7.5 -9.3 -1.6 -3.5 -4.2
0.5 -7.5 -8.3 -9.0 -6.4 3.8 0.1 -3.5 7.9 2.1 2.4 -6.2
7.0 5.7 -9.0 -5.8 1.6 2.6 -9.2 -6.2 4.6 8.2 -8.3 -1.4
3.8 -9.9 6.2 -2.5 -3.5 9.4 1.6 7.0 3.3 -0.5 6.7 6.0
1.6 -3.8 5.0 8.8 4.2 7.7 0.7 7.4 7.9 -5.9 4.4 3.3
3.7 6.2 6.7 -1.4 6.1 -6.0 8.5 9.1 5.7 -4.2 5.9 -3.5
5.0 0.3 2.2 -3.6 6.3 -10.0 9.5 -4.7 2.7 8.1 7.5 -8.4
-5.7 -0.3 -3.7 -3.3 7.7 9.3 -1.3 1.0 0.3 1.9 9.9 9.0
-7.4 1.3 -9.6 -3.6 2.2 3.4 -3.6 3.5 8.3 0.5 9.7 -6.8
1.0 -2.7 -1.5 5.4 -6.5 -3.7 5.6 8.0 -9.9 0.1 2.2 7.6
5.6 4.3 1.5 -0.8 5.8 -5.1 5.5 6.2 -5.8 8.8 -0.6 -2.3
输出样例:
13.3
这题看图说话吧
#include<bits/stdc++.h>
using namespace std;
int main()
{
char op;
cin>>op;
int count = 0;
double sum = 0,M[12][12];
for(int i = 0;i < 12;i++)
for(int j = 0;j < 12;j++)
cin>>M[i][j];
//上半部分
for(int i = 1;i <= 5;i++)
for(int j = 0;j <= i-1;j++)
{
count++;
sum += M[i][j];
}
//下半部分
for(int i = 6;i<=10;i++)
for(int j = 0;j<=10-i;j++)
{
count++;
sum += M[i][j];
}
if(op == 'S')printf("%.1lf\n",sum);
else printf("%.1lf\n",sum/count);
return 0;
}
753. 平方矩阵 I
输入整数 N,输出一个 N阶的回字形二维数组。
数组的最外层为 1,次外层为 2,以此类推。
输入格式
输入包含多行,每行包含一个整数 N。
当输入行为 N=0 时,表示输入结束,且该行无需作任何处理。
输出格式
对于每个输入整数 N,输出一个满足要求的 N 阶二维数组。
每个数组占 N行,每行包含 N 个用空格隔开的整数。
每个数组输出完毕后,输出一个空行。
输入样例:
1
2
3
4
5
0
输出样例:
1
1 1
1 1
1 1 1
1 2 1
1 1 1
1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
思路:以5阶为例,从1开始 i,j为两层循环的索引,这里取值为min(i,j)时,输出如下,可以看出数值沿主对角线从小到大递增。
1 1 1 1 1
1 2 2 2 2
1 2 3 3 3
1 2 3 4 4
1 2 3 4 5
取值为min(n-i+1, n-j+1)时,输出如下,可以看出数值沿主对角线从大到小递减。
5 4 3 2 1
4 4 3 2 1
3 3 3 2 1
2 2 2 2 1
1 1 1 1 1
对于本题目,输出的取值为min(min(i,j), min(n-i+1, n-j+1)),即重叠以上两个方阵,我们总取其中较小的值,输出如下。
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
#include <iostream>
using namespace std;
int main(){
int n;
while(cin >> n, n){
int m[n][n];
int t=0,i,j;
for(t=1; t<=(n+1)/2; t++)
{ //元素的值为t
for(i=t-1; i<n-t+1; i++)
{ //第i行第j列的元素为t
for(j=t-1; j<n-t+1; j++)
{
m[i][j] = t;
}
}
}
for(int i=0; i<n; i++){ //输出
for(int j=0; j<n; j++){
cout << m[i][j] << ' ';
}
cout << endl;
}
cout << endl;
}
return 0;
}
AcWing 742. 最小数和它的位置
输入一个整数 N 和一个长度为 N 的整数数组 X。
请你找到数组中最小的元素,并输出它的值和下标。
注意,如果有多个最小值,则返回下标最小的那个。
输入格式
第一行包含整数 N。
第二行包含 N 个用空格隔开的整数 X[i]。
输出格式
第一行输出 Minimum value: x
,其中 x 为数组元素最小值。
第二行输出 Position: y
,其中 y为最小值元素的下标(下标从0 开始计数)。
输入样例:
10
1 2 3 4 -5 6 7 8 9 10
输出样例:
Minimum value: -5
Position: 4
#include<bits/stdc++.h>
using namespace std;
const int N = 1001;
int s[N];
int main()
{
int n;
cin>>n;
for(int i = 0;i < n;i++)//最好从0开始
{
cin>>s[i];
}
int ans = s[0],cnt = 0;
for(int i = 1;i<=n;i++)
{
if(s[i]<ans)
{
ans = s[i];
cnt = i;
}
}
cout<<ans<<endl;
cout<<cnt<<endl;
return 0;
}