0
点赞
收藏
分享

微信扫一扫

7.简单数组


6-1 7.3.2 斐波那契数列

本题要求实现求Fabonacci数列项的函数。

Fabonacci数列的定义如下:f(n)=f(n-2)+f(n-1) (n≥2),其中:f(0)=1,f(1)=1

函数接口定义:

void fibo(int a[],int n );

其中数组 ​​a​​​最终存储计算出的斐波那契数列的值。参数​​n​​是计算前n项。

裁判测试程序样例:

#include <iostream>
using namespace std;
void fibo(int a[],int n );
int main()
{
int a[20],n,i;
cout<<"请输入n(<=20):";
cin>>n;
fibo(a,n);
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
/* 你的代码将被嵌在这里 */

输入样例:

请输入n(<20):5

输出样例:

1 1 2 3 5
void fibo(int a[],int n )
{
a[0]=1;
a[1]=1;
int s;
for(s=2;s<n;s++)
{
a[s]=a[s-1]+a[s-2];
}

}

6-2 7.3.4 删除数组元素

编写函数,删除数组中指定位置处的元素。删除数组中的某个元素时,其后的所有元素需要顺序向前移动。

函数接口定义:

void delNum(int a[],int n,int x);

其中 ​​a​​​是待删除元素的数组,​​n​​​是删除前数组元素的个数,​​x​​为待删除元素的位置(从0开始数)。

裁判测试程序样例:

#include<iostream>
using namespace std;
void delNum(int a[],int n,int x);
int main()
{
const int N=10;
int a[N]={10,111,102,213,124,415,176,170,179,19},x;
cout<<"请输入待删除元素的位置(0~9):";
cin>>x;
delNum(a,N,x);
for(int i=0;i<N-1;i++)
cout<<a[i]<<" ";
return 0;
}
/* 你的代码将被嵌在这里 */

输入样例:

5

输出样例:

10 111 102 213 124 176 170 179 19
void delNum(int a[],int n,int x)
{
for(int i=x;i<=8;i++)//注意是从x开始的
{
a[i]= a[i+1];
}
}
下面的程序错误!
void delNum(int a[],int n,int x)
{
for(n=0;a[n]!='\0';n++);
a[n]='\0';
int i;
for(i=0;i<n;i++)
{
if(a[i]==a[x]) {a[i]=a[i+1];}
}
}

7-1 7.3.3 数组逆序

编写程序,将数组中的元素逆序。程序应包括以下几个部分:通过键盘输入数据、逆序处理、输出逆序后的结果。

输入格式:

两行:第一行为数组元素的个数n (0<n<100),第二行为n个数字。

输出格式:

逆序后的n个元素,每个数据占4列。

输入样例:

5
1 2 3 4 5

输出样例:

5   4   3   2   1
#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
int N,i;
cin>>N;
int a[N];
for(i=0;i<N;i++)
{
cin>>a[i];
}
int j,t;
for(i=0,j=N-1;i<j;i++,j--)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
for(i=0;i<N;i++)
{
cout<<setw(4)<<a[i];
}


}

7-1 求最大数和它的下标, 并与a[0]对换位置


有一数组内存放10个整数,要求找出最大数和它的下标, 然后把它和数组中第0个元素对换位置。

输入格式:

在一行中输入10个整数,数据之间只能用1个空格间隔。

输出格式:

在一行中直接输出变化后的数组,每个数输出占4列列宽。在下一行中按照“max=最大值,位置=最大值下标”的顺序输出最大数和它的下标。

输入样例:

1 2 3 4 5 6 7 8 9 10

输出样例:

10   2   3   4   5   6   7   8   9   1
max=10,weizhi=9
#include <iostream>
#include<iomanip>
using namespace std;
int main()
{
int i,j,k,max;
int arr[10];
for(i=0;i<10;i++){
cin>>arr[i];
}


max=arr[0];
for(i=0;i<10;i++)
{
if(arr[i]>max)
{
max=arr[i];
j=i;
}
}


k=arr[0];
arr[0]=arr[j];
arr[j]=k;
for(i=0;i<10;i++)
{
cout<<setw(4)<<arr[i];
}
cout<<endl<<"max="<<max<<","<<"weizhi="<<j<<endl;


}

7-2 二分查找法

分数 20

全屏浏览题目

切换布局

作者 王跃萍

单位 东北石油大学

用二分法在一个有序数列{1,2,3,4,5,6,7,8,9,10}中查找key值,若找到key则输出其在数组中对应的下标,否则输出not found。

输入格式:

直接输入一个要查找的正整数key。没有其它任何附加字符。

输出格式:

找到则在一行中按照“weizhi:下标”的格式输出其在数组中对应的下标,否则输出not found。

输入样例:

4

输出样例:

weizhi:3

输入样例:

15

输出样例:

not found
#include<iostream>
using namespace std;


int main()
{
int b[]={1,2,3,4,5,6,7,8,9,10};
int left=0,right=9,a,key,i;
cin>>key;
while(left<right)
{
a=(left+right)/2;
if(b[a]==key)
{
cout<<"weizhi:"<<a;
break;
}
else if(key>b[a])
left=a+1;
else
right=a-1;
}
if(key>10||key<1)
cout<<"not found"<<endl;
}

7-3 简化的插入排序

分数 20

全屏浏览题目

切换布局

作者 C课程组

单位 浙江大学

本题要求编写程序,将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。

输入格式:

输入在第一行先给出非负整数N(<10);第二行给出N个从小到大排好顺序的整数;第三行给出一个整数X。

输出格式:

在一行内输出将X插入后仍然从小到大有序的整数序列,每个数字后面有一个空格。

输入样例:

5
1 2 4 5 7
3

输出样例:

1 2 3 4 5 7
#include<iostream>
using namespace std;
int main(void)
{
int n,m,i,f=0,h;
cin>>n;
int a[11];
for(i=1;i<=n;i++){
cin>>a[i];
}cin>>m;
for(i=1;i<=n;i++){
if(m<a[i]){
for(h=n;h>=i;h--){
a[h+1]=a[h];
}a[i]=m;f=1;break;}
}
if(f==1){
for(i=1;i<=n+1;i++)
cout<<a[i]<<" ";}
else{a[n+1]=m;
for(i=1;i<=n+1;i++)
cout<<a[i]<<" ";}
return 0;
}

7-4 8.3 排序

分数 20

全屏浏览题目

切换布局

作者 liucp

单位 中国地质大学(北京)

将从键盘输入的n个整数进行由小到大排序(不限排序方法)

输入格式:

输入在第1行中给出n(1≤n≤100),在第2行中给出n个待排序的整数,数字间以空格分隔。

输出格式:

输出排序后的结果,用空格分隔(最后一个数据后也有一个空格)。

输入样例:

5
5 4 2 1 3

输出样例:

1 2 3 4 5
#include <iostream>
using namespace std;

int main()
{
int N;cin>>N;
int a[N];

for(int i=0;i<=N-1;i++)
{
cin>>a[i];
}

for(int j=0;j<=N-2;j++)
for(int i=0;i<=N-2-j;i++)
{
if(a[i]>a[i+1])
{
int t;
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
}

for(int i=0;i<N;i++)
{
cout<<a[i]<<" ";
}
return 0;
}

7-5 输出所有大于平均值的数

本题要求编写程序,将输入的n个整数存入数组a中,然后计算这些数的平均值,再输出所有大于平均值的数。

输入格式:

输入在第1行中给出一个正整数n1≤n≤10),第2行输入n个整数,其间以空格分隔。题目保证数据不超过长整型整数的范围。

输出格式:

输出在第1行给出平均值,保留2位小数。在第2行输出所有大于平均值的数,每个数的后面有一个空格;如果没有满足条件的数,则输出空行。

如果输入的n不在有效范围内,则在一行中输出"Invalid."。

输入样例1:

10
55 23 8 11 22 89 0 -1 78 186

输出样例1:

47.10
55 89 78 186

输入样例2:

0

输出样例2:

Invalid.
#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
int N;cin>>N;int a[N],i;
if(N<1||N>10)
cout<<"Invalid.";
else
{
for(i=0;i<N;i++)
{
cin>>a[i];
}
double sum=0;double average;
for(i=0;i<N;i++)
{
sum+=a[i];
}
average=sum/N;
cout<<fixed<<setprecision(2)<<average<<endl;
for(i=0;i<N;i++)
{
if(a[i]>average)
cout<<a[i]<<" ";
}
int max=a[0];
for(i=0;i<N;i++)
{
if(a[i]>max)
max=a[i];
}
if(max<=average)
cout<<endl;

}

}

7-1 9.3.1 对角线和

分数 20

全屏浏览题目

切换布局

作者 liucp

单位 中国地质大学(北京)

编程求正方形矩阵(n行n列)的左上到右下的一条对角线元素的和。

输入格式:

输入在第1行中给出n(1≤n≤100),在第2~n+1行中每行中给出n个整数,数字间以空格分隔。

输出格式:

左上到右下的对角线的和。

输入样例:

3
10 12 13
14 15 16
17 18 19

输出样例:

44
#include<iostream>
using namespace std;

int main()
{
int n;cin>>n;
int a[n][n],i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cin>>a[i][j];

}
int sum=0;
for(i=0,j=0;i<n,j<n;i++,j++)
{
sum+=a[i][j];
}
cout<<sum;
}

7-2 9.3.2 行列转置

分数 20

全屏浏览题目

切换布局

作者 liucp

单位 中国地质大学(北京)

编程实现将一个二维数组行和列元素互换,存到另一个二维数组中。

输入格式:

输入在第1行中给出m,n(1≤m≤20,(1≤n≤20),在第2~m+1行中每行中给出n个整数,数字间以空格分隔。

输出格式:

行列转置后的二维数组,每个数据占5列(题目保证每个数据不超过5列 )。

输入样例:

3 5
2 7 9 8 1
5 4 3 9 2
7 2 1 4 6

输出样例:

2    5    7
7 4 2
9 3 1
8 9 4
1 2 6
#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
int m,n;cin>>m>>n;
int i,j,a1[m][n],a2[n][m];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>a1[i][j];
for(j=0;j<n;j++)
{
for(i=0;i<m;i++)
a2[j][i]=a1[i][j];
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
cout<<setw(5)<<a2[i][j];
cout<<endl;
}

}

7-3 9.3.3 二维数组最大值

编程求出一个m行n列矩阵中最大值,以及其所在的行号和列号(从0开始),输入的元素各不相同。

输入格式:

输入在第1行中给出m,n(1≤m≤20,(1≤n≤20),在第2~m+1行中每行中给出n个整数,数字间以空格分隔。

输出格式:

第一行最大值

第二行最大值的行号

第三行最大值的列号

输入样例:

3 5
2 7 9 8 1
5 4 3 19 12
17 22 11 4 6

输出样例:

22
2
1
#include<iostream>
using namespace std;

int main()
{
int m,n,i,j;cin>>m>>n;int a[m][n];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>a[i][j];
int max=a[0][0],x=0,y=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(a[i][j]>max)
{max=a[i][j];x=i;y=j;}

}
cout<<max<<endl<<x<<endl<<y;
}

7-4 9.3.4 杨辉三角

分数 20

全屏浏览题目

切换布局

作者 liucp

单位 中国地质大学(北京)

编写程序,从键盘输入杨辉三角的行数n(n<=15),输出杨辉三角。

输入格式:

输入行数n(1≤n≤15)。

输出格式:

n行杨辉三角,每个数据占5列。

输入样例:

5

输出样例:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
int n,m,i,j;cin>>n;int a[n][n];
for(i=0,j=0;i<n,j<n;i++,j++)
a[i][j]=1;
for(i=1;i<n;i++)
a[i][0]=1;
for(i=2;i<n;i++)
{
for(j=1;j<i;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
cout<<setw(5)<<a[i][j];
cout<<endl;
}

}

7-5 9.3.5 幻方

分数 20

全屏浏览题目

切换布局

作者 liucp

单位 中国地质大学(北京)

在《射雕英雄传》中郭黄二人被裘千仞追到黑龙潭,躲进瑛姑的小屋。瑛姑出了一道题:数字1~9填到三行三列的表格中,要求每行、每列、及两条对角线上的和都相等。这道题难倒了瑛姑十几年,被黄蓉一下子就答出来了。

编码实现n阶(n为正奇数)幻方。

本题检测算法(n为奇数时):

1)将1放在第一行中间一列;

2)从2开始直到n×n止各数依次按下列规则存放:按45°方向行走,如向右上;每一个数存放的行比前一个数的行数减1,列数加1。

3)如果行列范围超出矩阵范围,则回绕,例如1在第1行,则2应放在最后一行,列数同样加1。

4)如果按上面规则确定的位置上已有数,则把下一个数放在上一个数的下面。

输入格式:

输入阶数n(n为小于等于15的正奇数)。

输出格式:

n阶幻方,每个数据占5列

输入样例:

3

输出样例:

8    1    6
3 5 7
4 9 2
#include<stdio.h>
int A[15][15];
void creat(int n)
{

int row1,col1;
for(int i=0;i<=n-1;i++)
{
for(int j=0;j<=n-1;j++)
A[i][j]=0;
}
int t=1;
int row,col;
row=0;col=n/2;

while(t<=n*n)
{
A[row][col]=t;
t++;
row1=row;
col1=col;
row=row-1;
if(row<0)
row=n-1;
col=col+1;
if(col>n-1)
col=0;
if(A[row][col]!=0)
{
row=row1+1;
col=col1;
}
}
}
void print(int n)
{
int i,j;
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
printf("%5d",A[i][j]);
printf("\n");
}
}
int main()
{
int n;
scanf("%d",&n);
creat(n);
print(n);

return 0;
}


举报

相关推荐

0 条评论