第4讲数组new
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3 123 234 345 10
Sample Output
33 32 31 34 33 32 35 34 33
void rotate(int x[][10],int N) { int i,j; int y[10][10]; for(i=0;i<N;i++) for(j=0;j<N;j++) y[i][j]=x[N-1-j][i]; for(i=0;i<N;i++) for(j=0;j<N;j++) x[i][j]=y[i][j]; }
将两个排序好的一维数组,合并到一个一维 数组中,合并后的数组仍然保持原来的序。
选票统计
一年一度的南京市“十佳青少年”选举开始了,根据海选结果, 候选人达到了1000人,每个市民都可以参加投票选举,并且每 个人可以选若干人。市民只需将自己要选举的候选人编号一次 写在选票上即可。选举结束后,选委会进行选票统计。由于选 票众多,且每张选票上被选举的人数不等,编写一个程序完成 选票统计:将所有选票上的编号依次输入计算机,以 -1表示统 计结束,这时计算机要给所有的选票编号 及统计其得票数。 输入格式:一行(一组以空格隔开的编号,以-1为结束。如: 3 1 2 3 2 1 2 3 1 2 2 1 3 3 1 2 3 3 -1(相临的两个数中前 面表示序号,后面表示票数) 输出格式:按编号序号分若干行输出编号和得票数(不输出票数 为0的候选人情况) 1 5 2 6 3 7
}
} return 0;
青年歌手大奖赛
问题描述:青年歌手大奖赛中,评委会给参赛选手打分。选手得分规 则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出 某选手的得分。 输入要求:输入数据有多组,每组占一行,每行的第一个数是 n(2<n<100),表示评委的人数,然后是n个评委的打分。 输出要求:对于每组输入数据,输出选手的得分,结果保留2位小数, 每组输出占一行。 输入样例: 3 99 98 97 4 100 99 98 97 输出样例: 98.00 98.50
开灯问题
题目描述:有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按 下所有编号为2的倍数的开关(这些灯被关掉),第3个人按下所有编 号为3的倍数的开关(其中关掉的灯将被打开,打开的将被关掉),依 次类推。一共有k个人,问最后有哪些灯开着? 输入要求:占一行,输入n表示灯的数目和k表示人数 ,输出开着的灯 编号 (0<k<= n <=1000) 输出要求:输出开着灯的编号,每个编号占一行。 样例输入: 7 3 样例输出: 1 5 6 7
第4讲 数组及其应用
数组的定义
定义:一组类型相同的数据对象构成的集合
特点:存储在一个区域内,引用时用同一名 字(序号不同) 数组名: 数据集合的名称 数组元素:该集合的各数据元素。具有相同 的数据类型,用集合的名称(数组名)和(元素的 位置)索引(也叫下标)确定
数组元素的类型 存储在数组元素中的值的数据类型(数组类型) 数组的大小 数组中能够存放多少个数组元素(数组长度)
一维数组的总字节数可按下式计算:
总字节数=sizeof(数组元素的数据类型) * 数组长度
其中sizeof是计算数据类型在存储空间中占用字 节数的运算符。 数组 double x[5]所占用的存储字节数为: sizeof( double ) * 5
数组的初始化
定义数组时直接初始化:各元素的值用逗号 分隔,填充到数组元素所在的存储空间中。 例如: int b[4] = { 1, 2, 3, 4 };
}
输出杨辉三角 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1
/*通过计算二项式的系数输出杨辉三角*/ #include<iostream> using namespace std; int main() { long i,j,n,k,m; cin>>n; for(i=1;i<=n;i++) { k=1; for(j=1;j<i;j++) { cout<<k<<" "; k=k*(i-j)/j; //计算 } cout<<1<<endl; } return 0;
#include <iostream> using namespace std; int main() { int a[1001]={0},i,j,n,k; while(cin >> n >> k) { for(i=1;i<=k;i++) { for(j=1;j<=n;j++) { if(j%i == 0) { if(a[j] == 0) a[j] = 1; else a[j] = 0; } } } for(i=1;i<=n;i++) if(a[i]) cout << i <<endl;
b[0] b[1] b[2] b[3] 1 2 3 4
将一个一维数组循环左移k个数
校门外的树
题目描述:某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔 都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在 L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。由于马路 上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。 已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。 现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将 这些树都移走后,马路上还有多少棵树。(L<=100000)
int a[3][3] = { { 1, 2 }, { 3, 4 }, { 5, 6 }};
int b[3][3] = {1, 2, 3, 4, 5, 6};
根据初始化值求行数
int a[][3] = {{1, 2}, {3, 4}, {5, 6}}; int b[][3] = {1, 2, 3, 4, 5, 6};
将一个NxN的矩阵按顺时针旋转90度存放
Matrix Rotation
Problem Description:Give you a n*n matrix, if you rotate it 90 degrees, we call it 1-Matrix, if you rotate it 180 degrees, we call it 2-Matrix, etc … This is said if you rotate the Matrix 90*k degrees, then we call it k-Matrix. Now, your task is to calculate all the sum of i-Matrix (0<= i<= k). Input:There multiple test cases. Each test case begins with one integer n(1 <= n <= 10), following n lines, each line contains n integers, describe the original matrix, then a single line contains a k (1 <= k <= 10^8)described above. Process to end of file. Output:For each case, output the sum of all the i-Matrix (0<= i<= k) in n lines. Each line there are n integers separated by one space. Note that there is no extra space at the end of each line. Sample Input
#include<iostream> using namespace std; int main() { int a[1001]={0},i,x; cin>>x; while(x!=-1) { a[x]++; cin>>x; } for(i=1;i<=1000;i++) if(a[i]Biblioteka Baidu0) cout<<i<<" "<<a[i]<<endl; return 0; }
#include<iostream> using namespace std; void rotate(int x[][10],int ); int main() { int a[10][10],b[10][10],c[10][10],i,j,k,n,m,l; while(cin>>n) { for(i=0;i<n;i++) for(j=0;j<n;j++) { cin>>a[i][j]; b[i][j]=a[i][j]; c[i][j]=0; } cin>>k; l=k;k=k/4; for( m=1;m<=4;m++) { rotate(a,n); for(i=0;i<n;i++) for(j=0;j<n;j++) c[i][j]+=a[i][j]; }
a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
int a[3][2]
二维数组初始化
按行初始化
float e[3][3] = { { 1.0, 0.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 0.0, 1.0 }};
部分初始化
二维数组
定义方式:
数据类型 数组名[整型常量表达式][整型常量表达 式 ];
例 int a[3][2]; float b[2][5]; int a[3,4];
( )
数组元素的存放顺序 原因: 内存是一维的 二维数组:按行序优先 多维数组:最右下标变化最快
a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
#include <iostream> using namespace std; int main() { int a[10000]={0},i,j,L,m,x,y; while(cin >> L >> m) { while(m--) { cin >> x >>y; for(i=x;i<=y;i++) a[i] = 1; //代表移走了 } j = 0; for(i=0;i<=L;i++) if(a[i] != 1) //没被移走的 j++; cout << j <<endl; } return 0; }
for(i=0;i<n;i++) for(j=0;j<n;j++) c[i][j]=k*c[i][j]; for(m=1;m<=l%4;m++) { rotate(a,n); for(i=0;i<n;i++) for(j=0;j<n;j++) c[i][j]+=a[i][j]; } for(i=0;i<n;i++) { for(j=0;j<n-1;j++) cout<<c[i][j]+b[i][j]<<' '; cout<<c[i][n-1]+b[i][n-1]<<endl; } } return 0;
输入要求:输入两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代 表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来 的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起 始点和终止点的坐标。 输出要求:占一行,马路上剩余的树的数目 输入样例: 500 3 150 300 100 200 470 471 输出样例: 298
#include<stdio.h> int main() { int n,s,a[100],i,k,b; double w; while(scanf("%d",&n)!=EOF) { k=0; w=0; s=0; for(i=0;i<n;i++) { scanf("%d",&a[i]); k++; b=a[0]; w=w+a[i]; } for(i=0;i<k;i++) { if(a[i]>s) s=a[i]; } for(i=1;i<k;i++) { if(b>a[i]) b=a[i]; } w=(w-s-b)/(k-2); printf("%.2lf\n",w); } return 0; }
Sample Output
33 32 31 34 33 32 35 34 33
void rotate(int x[][10],int N) { int i,j; int y[10][10]; for(i=0;i<N;i++) for(j=0;j<N;j++) y[i][j]=x[N-1-j][i]; for(i=0;i<N;i++) for(j=0;j<N;j++) x[i][j]=y[i][j]; }
将两个排序好的一维数组,合并到一个一维 数组中,合并后的数组仍然保持原来的序。
选票统计
一年一度的南京市“十佳青少年”选举开始了,根据海选结果, 候选人达到了1000人,每个市民都可以参加投票选举,并且每 个人可以选若干人。市民只需将自己要选举的候选人编号一次 写在选票上即可。选举结束后,选委会进行选票统计。由于选 票众多,且每张选票上被选举的人数不等,编写一个程序完成 选票统计:将所有选票上的编号依次输入计算机,以 -1表示统 计结束,这时计算机要给所有的选票编号 及统计其得票数。 输入格式:一行(一组以空格隔开的编号,以-1为结束。如: 3 1 2 3 2 1 2 3 1 2 2 1 3 3 1 2 3 3 -1(相临的两个数中前 面表示序号,后面表示票数) 输出格式:按编号序号分若干行输出编号和得票数(不输出票数 为0的候选人情况) 1 5 2 6 3 7
}
} return 0;
青年歌手大奖赛
问题描述:青年歌手大奖赛中,评委会给参赛选手打分。选手得分规 则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出 某选手的得分。 输入要求:输入数据有多组,每组占一行,每行的第一个数是 n(2<n<100),表示评委的人数,然后是n个评委的打分。 输出要求:对于每组输入数据,输出选手的得分,结果保留2位小数, 每组输出占一行。 输入样例: 3 99 98 97 4 100 99 98 97 输出样例: 98.00 98.50
开灯问题
题目描述:有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按 下所有编号为2的倍数的开关(这些灯被关掉),第3个人按下所有编 号为3的倍数的开关(其中关掉的灯将被打开,打开的将被关掉),依 次类推。一共有k个人,问最后有哪些灯开着? 输入要求:占一行,输入n表示灯的数目和k表示人数 ,输出开着的灯 编号 (0<k<= n <=1000) 输出要求:输出开着灯的编号,每个编号占一行。 样例输入: 7 3 样例输出: 1 5 6 7
第4讲 数组及其应用
数组的定义
定义:一组类型相同的数据对象构成的集合
特点:存储在一个区域内,引用时用同一名 字(序号不同) 数组名: 数据集合的名称 数组元素:该集合的各数据元素。具有相同 的数据类型,用集合的名称(数组名)和(元素的 位置)索引(也叫下标)确定
数组元素的类型 存储在数组元素中的值的数据类型(数组类型) 数组的大小 数组中能够存放多少个数组元素(数组长度)
一维数组的总字节数可按下式计算:
总字节数=sizeof(数组元素的数据类型) * 数组长度
其中sizeof是计算数据类型在存储空间中占用字 节数的运算符。 数组 double x[5]所占用的存储字节数为: sizeof( double ) * 5
数组的初始化
定义数组时直接初始化:各元素的值用逗号 分隔,填充到数组元素所在的存储空间中。 例如: int b[4] = { 1, 2, 3, 4 };
}
输出杨辉三角 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1
/*通过计算二项式的系数输出杨辉三角*/ #include<iostream> using namespace std; int main() { long i,j,n,k,m; cin>>n; for(i=1;i<=n;i++) { k=1; for(j=1;j<i;j++) { cout<<k<<" "; k=k*(i-j)/j; //计算 } cout<<1<<endl; } return 0;
#include <iostream> using namespace std; int main() { int a[1001]={0},i,j,n,k; while(cin >> n >> k) { for(i=1;i<=k;i++) { for(j=1;j<=n;j++) { if(j%i == 0) { if(a[j] == 0) a[j] = 1; else a[j] = 0; } } } for(i=1;i<=n;i++) if(a[i]) cout << i <<endl;
b[0] b[1] b[2] b[3] 1 2 3 4
将一个一维数组循环左移k个数
校门外的树
题目描述:某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔 都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在 L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。由于马路 上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。 已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。 现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将 这些树都移走后,马路上还有多少棵树。(L<=100000)
int a[3][3] = { { 1, 2 }, { 3, 4 }, { 5, 6 }};
int b[3][3] = {1, 2, 3, 4, 5, 6};
根据初始化值求行数
int a[][3] = {{1, 2}, {3, 4}, {5, 6}}; int b[][3] = {1, 2, 3, 4, 5, 6};
将一个NxN的矩阵按顺时针旋转90度存放
Matrix Rotation
Problem Description:Give you a n*n matrix, if you rotate it 90 degrees, we call it 1-Matrix, if you rotate it 180 degrees, we call it 2-Matrix, etc … This is said if you rotate the Matrix 90*k degrees, then we call it k-Matrix. Now, your task is to calculate all the sum of i-Matrix (0<= i<= k). Input:There multiple test cases. Each test case begins with one integer n(1 <= n <= 10), following n lines, each line contains n integers, describe the original matrix, then a single line contains a k (1 <= k <= 10^8)described above. Process to end of file. Output:For each case, output the sum of all the i-Matrix (0<= i<= k) in n lines. Each line there are n integers separated by one space. Note that there is no extra space at the end of each line. Sample Input
#include<iostream> using namespace std; int main() { int a[1001]={0},i,x; cin>>x; while(x!=-1) { a[x]++; cin>>x; } for(i=1;i<=1000;i++) if(a[i]Biblioteka Baidu0) cout<<i<<" "<<a[i]<<endl; return 0; }
#include<iostream> using namespace std; void rotate(int x[][10],int ); int main() { int a[10][10],b[10][10],c[10][10],i,j,k,n,m,l; while(cin>>n) { for(i=0;i<n;i++) for(j=0;j<n;j++) { cin>>a[i][j]; b[i][j]=a[i][j]; c[i][j]=0; } cin>>k; l=k;k=k/4; for( m=1;m<=4;m++) { rotate(a,n); for(i=0;i<n;i++) for(j=0;j<n;j++) c[i][j]+=a[i][j]; }
a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
int a[3][2]
二维数组初始化
按行初始化
float e[3][3] = { { 1.0, 0.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 0.0, 1.0 }};
部分初始化
二维数组
定义方式:
数据类型 数组名[整型常量表达式][整型常量表达 式 ];
例 int a[3][2]; float b[2][5]; int a[3,4];
( )
数组元素的存放顺序 原因: 内存是一维的 二维数组:按行序优先 多维数组:最右下标变化最快
a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
#include <iostream> using namespace std; int main() { int a[10000]={0},i,j,L,m,x,y; while(cin >> L >> m) { while(m--) { cin >> x >>y; for(i=x;i<=y;i++) a[i] = 1; //代表移走了 } j = 0; for(i=0;i<=L;i++) if(a[i] != 1) //没被移走的 j++; cout << j <<endl; } return 0; }
for(i=0;i<n;i++) for(j=0;j<n;j++) c[i][j]=k*c[i][j]; for(m=1;m<=l%4;m++) { rotate(a,n); for(i=0;i<n;i++) for(j=0;j<n;j++) c[i][j]+=a[i][j]; } for(i=0;i<n;i++) { for(j=0;j<n-1;j++) cout<<c[i][j]+b[i][j]<<' '; cout<<c[i][n-1]+b[i][n-1]<<endl; } } return 0;
输入要求:输入两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代 表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来 的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起 始点和终止点的坐标。 输出要求:占一行,马路上剩余的树的数目 输入样例: 500 3 150 300 100 200 470 471 输出样例: 298
#include<stdio.h> int main() { int n,s,a[100],i,k,b; double w; while(scanf("%d",&n)!=EOF) { k=0; w=0; s=0; for(i=0;i<n;i++) { scanf("%d",&a[i]); k++; b=a[0]; w=w+a[i]; } for(i=0;i<k;i++) { if(a[i]>s) s=a[i]; } for(i=1;i<k;i++) { if(b>a[i]) b=a[i]; } w=(w-s-b)/(k-2); printf("%.2lf\n",w); } return 0; }