XJTU2020秋C++第六次作业

本文解析了包括斐波那契数列、评分系统处理、数组比较、方程组求解等在内的多个经典算法案例,提供了详细的代码实现及思路分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

目录

 

1.求解以下兔子问题:

2. n个评委给m个选手打分

3. 已知A和B为两个一维数组

用string函数

用char

 

4.求解以下三元一次方程组的根

1.关于高斯消元法,请查阅高等数学书。

2.直接迭代法

5. 矩阵用一维数组存储

6.  编程打印如下形式的杨辉三角形


1.求解以下兔子问题:

“假定一对大兔子每月能生一对小兔子,且每对新生的小兔子经过一个月可以长成一对大兔子,具备繁殖能力,如果不发生死亡,且每次均生下一雌一雄,问n月后共有多少对兔子?”

1.该问题的数学模型1为斐波那契数列的递归定义分段函数。

 

#include<iostream>
#include<cmath>
//对于递归,函数自己调用自己 
using namespace std;
int Fib(int x)
{
	if (x==0)
	{
		return 0;
	}
	else if(x==1)
	{
		return 1;
	}
	else if(x>=3)
	{
		return Fib(x-1)+Fib(x-2);
	}
 } 
 int main()
 {
 	int x;
 	cin>>x;
 	cout<<Fib(x);
 	return 0;
 }

 

2. 该问题的数学模型2为斐波那契数列的通项公式。

 

 

#include<iostream>
#include<cmath>
using namespace std;
double Fib(int n)
{
	double Fib;
	Fib=(1/sqrt(5))*(pow((1+sqrt(5))/2,n)-pow((1-sqrt(5))/2,n));
	
	return Fib;
}
int main()
{
	int n;
	cin>>n;
	cout<<Fib(n);
	return 0;
	
 } 

请分别使用以上这两种数学模型求解兔子问题, 每月有多少对兔子,以及n月后共有多少对兔子?

其中,n为正整数,由键盘输入。

 

2. n个评委给m个选手打分

去掉一个最高分,去掉一个最低分,总分就是每位选手的最后得分,请按照总分从大到到小排序显示在一行上,用逗号隔开。

其中,n和m为正整数,均由键盘输入。

#include<iostream>
using namespace std;
//思路:数组,排序,取中间。
//输入 用for循环 
// 
int main()
{
	//输入 
 	int count[10][10];
 	int n,m;
 	cin>>n;
 	cin>>m;
 	for (int i=0;i<m;i++)
 	{
 		for(int j=0;j<n;j++)
 		{
 			cin>>count[i][j];
		 }
	 }
	 //每行排序 
	 for(int i=0;i<m;i++)
	 {
	 	for(int j=0;j<n;j++)
	 	{
	 		for(int k=j;k<n;k++)
			 {
			 	if(count[i][k]<count[i][j])
			 	{
			 		int temp=count[i][k];
			 		count[i][k]=count[i][j];
			 		count[i][j]=temp;
				 }
			  } 
		 }
	 }
	 /*
	 for(int i=0;i<m;i++)
	 {
	 	for(int j=0;j<n;j++){
	 		cout<<count[i][j]<<'\t'; 
		 } 
		cout<<'\n';  
	 }*/
	 //求平均值:这里n>=3才能去掉最大最小值

	for(int i=0;i<m;i++){
	 		int jisuan=0;
	 		for(int j=0;j<n;j++){
	 			if(n<=2){
	 				jisuan+=count[i][j];
				 }
				 else if(n>=3)
				 {
				 	if(j>0&&j<n-1)//这里不知道为什么j!=0||j!=n-1就是不行 
				 	{
				 		jisuan+=count[i][j];
				 		//cout<<endl<<count[i][j]<<endl;
					 }
				 }
			 }
			 //输出 
			 if(n<=2){
			 	cout<<jisuan/n<<",";
			 }
			 else if(n>=3)
			 {
			 	cout<<jisuan/(n-2)<<",";
			 }
		 } 
	  return 0;
 } 

 

3. 已知A和B为两个一维数组

编程判断A和B是否相同,以及B是否包含在A中。

说明:所谓相同是指两个数组的元素个数一样,而且对应下标的数组元素均相同。

所谓包含是指一个数组的全部元素在另一个数组中连续存在。

用string函数

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string A,B;
	cout<<"请输入A:";
	getline(cin,A);
	cout<<"请输入B:";
	getline(cin,B);
	if(A.compare(B)!=0)
	{
		if(A.size()>B.size())
		{
			if(A.find(B)>=0)
			{
				cout<<"A包含B"; 
			}
			else {
				cout<<"不包含";
			}
		}
		else if(A.size()<B.size())
		{
			if(B.find(A)>=0)
			{
				cout<<"B包含A"; 
			}
			else {
				cout<<"不包含";
			}	
		}
		else
		{
			cout<<"不包含";
		}
	}
	else{
		cout<<"A与B相同";
	}
}

用char

#include<iostream>
#include<cstring>
using namespace std;
int zichuan(char s[],char t[])
{
	int ns=strlen(s);
	int nt=strlen(t);
	int flag=0;
	for(int i=0;i<nt;i++)
	{
		int k=i; 
		for(int j=0;j<ns&&k<nt;j++,k++)
		{
			if(t[k]==s[j])
			{
				flag=1;
			}
			else
			{
				flag=0;
				break;
			}
		}
		if(flag)
		{
			return flag;
		}
	}
	
	return flag;
}

int main()
{
	char x1[10];
	char x2[10];
	cin>>x1;
	cin>>x2;
	int n1=strlen(x1);
	int n2=strlen(x2);
	if(strcmp(x1,x2)==0)
	{
		cout<<"两字符串相同"<<endl;
		return 0;
	}
	if(n1>n2)
	{
		if(zichuan(x2,x1))
		{
			cout<<"x2是x1的子串"<<endl;
		}
		else
		{
			cout<<"x2与x1无关"<<endl;
		}
	}
	else
	{
		if(zichuan(x1,x2))
		{
			cout<<"x1是x2的子串"<<endl;
		}
		else
		{
			cout<<"x2与x1无关"<<endl;
		}		
	}
	return 0;
}

 

4.求解以下三元一次方程组的根

重点讲述,会另开一个博客,这题真就把孩子整懵了,呜呜u

请分别使用高斯消元法和直接迭代法求解。

1.关于高斯消元法,请查阅高等数学书。

思路:

1、首先进行排序,使得i行i列的值在这列最大,然后进行运算

2、在排序的同时进行计算,使得i行i列同一列中在i列以下均为0,循环结束后得到上三角矩阵

3、对于上三角矩阵进行处理,使得每一行只有两个数,同时输出,得到解

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
//1、首先进行排序,使得i行i列的值在这列最大,然后进行运算
//2、在排序的同时进行计算,使得i行i列同一列中在i列以下均为0,循环结束后得到上三角矩阵
//3、对于上三角矩阵进行处理,使得每一行只有两个数,同时输出,得到解
const int N=100;
double  shuzu[N][N];
int n;
//输入 
cin>>n;
for(int i=0;i<n;i++)
{
	for(int j=0;j<n+1;j++)
	{
		cin>>shuzu[i][j];
	}
}
//1,2
for(int i=0;i<n;i++)
{
	for(int j=i;j<n;j++)//换行 
	{
		if(shuzu[i][i]<shuzu[j][i]) 
		{
			for(int k=0;k<n+1;k++)
			{
				double temp=shuzu[i][k];
				shuzu[i][k]=shuzu[j][k];
				shuzu[j][k]=temp;
			} 
		}
	} 
	//上三角
	for(int k=i+1;k<n;k++)
	{
		for(int l=i;l<n+1;l++)
		{
			shuzu[k][l]=shuzu[k][l]-shuzu[i][l]/shuzu[i][i]*shuzu[k][i];
		}	
	} 
	
}
//3
//从上到下进行处理 
//对于此处,可以构想要用到几个for循环 ,我在这里总是会出错
for(int i=n-1;i>0;i--)//行 
{
	for(int j=0;j<n&&j!=i;j++) 
	{
		for(int k=i;k<n+1;k++)//列 
		{
			shuzu[j][k]=shuzu[j][k]-shuzu[i][k]/shuzu[i][i]*shuzu[j][i];
		}
	}
 } 
 for(int i=0;i<n;i++)
 {
 	cout<<'x'<<i+1<<':'<<shuzu[i][n]/shuzu[i][i]<<endl;
 }
return 0;

}

2.直接迭代法

指:首先由三个式子分别得到X1=…,X2=…和X3=…,然后不断代入求新的值X1’、 X2’、 和X3’,从而使得解的精度达到0.000001为止,即|X1-X1’|+|X2-X2’|+|X3-X3’|<0.00000。

#include<iostream>
//迭代法 
#include<cmath>
using namespace std;
int main()
{
	const int N=100;
	float A[N][N],a[N]={0},b[N]={0},b_=0,x0[N];
	int i,j,k,l,m;
	//输入方程元数
	const int n=3;	
	//输入系数矩阵 
 	for(i=0;i<n;i++)
 	{
 		for(j=0;j<n;j++)
 		{
 			cin>>A[i][j];
		 }
	 }
	 for(i=0;i<n;i++)
	 {
	 	for(j=0;j<n;j++)
	 	{
	 		a[i]+=A[j][i];
		 }
	 }
	//输入常数矩阵
	for(i=0;i<n;i++) 
	{
		cin>>b[i];
		b_+=b[i];
	}
	//输入解的初值 
	 for(i=0;i<n;i++)
	 {
	 	cin>>x0[i];
	  } 
	  //利用雅可比迭代法求解线性方程组
	  float x1=x0[0],x2=x0[1],x3=x0[2],e=1e-6,eps=1;
	  while(eps>e)
	  {
	  	x0[0]=(1/a[0])*(-(a[1]*x2+a[2]*x3)+b_);
	  	x0[1]=(1/a[1])*(-(a[0]*x1+a[2]*x3)+b_);
	  	x0[2]=(1/a[2])*(-(a[1]*x2+a[0]*x1)+b_);
	  	x1=x0[0];x2=x0[1];x3=x0[2];
	  	eps=abs(x0[0]-x1)+abs(x0[1]-x2)+abs(x0[2]-x3);
	  	cout<<eps<<endl;
		}
	  cout<<"X1"<<'='<<x1<<endl;
	  cout<<"X2"<<'='<<x2<<endl;
	  cout<<"X3"<<'='<<x3<<endl;
	 
}

其中,二维数组确定为3*3的,但各行系数有均由键盘输入。

结果相差有点大,我哭了,我是废物

5. 矩阵用一维数组存储

编程判断矩阵是否分别对称矩阵、对角矩阵和上三角矩阵。数组元素和各个元素的值均由键盘输入。

#include<iostream>
using namespace std;

int main()
{
	//输入用一维数组储存
	int n;
	int A[100];
	cout<<"请输入数组阶数";
	cin>>n;
	for(int i=0;i<n*n;i++)
	{
		cin>>A[i];
	 } 
	// 对称矩阵、对角矩阵和上三角矩阵
	int flag1=1,flag2=1,flag3=1;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(A[i*n+j]!=A[j*n+i]){
			flag1=0;break;}
			if(A[i*n+j]!=0&&i!=j){
				flag2=0;break;
			}
			if(i>j&&A[i*n+j]!=0){
				flag3=0;break;
			}
		}
	}
	if(flag1==1)cout<<"是对称矩阵"<<'\t';
	if(flag2==1)cout<<"是对角矩阵"<<'\t';
	if(flag3==3)cout<< "是上三角矩阵"<<'\t';
	if(flag1==0&&flag2==0&&flag3==0) cout<<"均不是";
	return 0;
}

6.  编程打印如下形式的杨辉三角形

    

提示:使用二维数组,下一行的系数等于上一行两个系数之和。行数n由键盘输入,然后再打印n行的杨辉三角形。

#include<iostream>
#include<cmath>
#include<iomanip>//格式化输出niupi 
using namespace std;
//使用二维数组,下一行的系数等于上一行两个系数之和。
//行数n由键盘输入,然后再打印n行的杨辉三角形。
int main()
{
	int A[20][20];
	int n;
	cin>>n;
	//循环 
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++)
		{
			if(j==0||j==i)
			{
				A[i][j]=1;
			}
			else{
				A[i][j]=A[i-1][j]+A[i-1][j-1];//看上一行,得出规律 
			}
		}
	}
	//输出
	for(int i=0;i<n;i++)
	{

		for(int j=0;j<n-i;j++)
		{
			cout<<"  ";
		}
		for(int k=0;k<i+1;k++)
		{
			cout.width(4);
			cout<<A[i][k];
		}
		cout<<endl;
	 } 
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值