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项。
裁判测试程序样例:
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开始数)。
裁判测试程序样例:
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
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
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
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
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
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行中给出一个正整数n(1≤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.
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
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
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
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
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
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;
}