目录
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;
}
}