1.求n的阶乘,Fibonacci函数,二分法查找(两种方法实现:递归与非递归)
2.用递归实现汉诺塔,获取元素的排列组合,整数划分问题
3.用链表实现一元多项式的加减乘
************************************************************************************************************************************
1.求n的阶乘(递归)
#include<iostream>
using namespace std;
int Factorial(int n);
void main()
{
int m;
cout<<"Input the num>";
cin>>m;
cout<<"求阶乘结果为:"<<Factorial(m)<<endl;
}
int Factorial(int n)
{
int res;
if(n==0||n==1)
res= 1;
else
{
res=n*Factorial(n-1);
}
return res;
}
1.阶乘的实现(非递归)
int Factorial(int n)
{
int res=1;
if(n==0||n==1)
return 1;
else
{
for(int i=1;i<=n;i++)
{
res*=i;
}
return res;
}
}
2.Fibonacci函数(递归)
功能介绍:第一项和第二项的元素为1,其他n项元素是第n-1项与第n-2项的和。
int Fib(int n)
{
if(n==1||n==2)
{
return 1;
}
else
{
return Fib(n-1)+Fib(n-2);
}
}
2.Fibonacci函数(非递归)
int Fib(int n)
{
int fib1=1;
int fib2=1;
int fib;
if(n==1||n==2)
return 1;
else
{
for(int i=3;i<=n;i++)
{
fib=fib1+fib2;
fib2=fib1;
fib1=fib;
}
return fib;
}
}
3.二分法查找(递归)
int Find(int ar[],int low,int high,int key)
{
int mid;
while(low<=high)
{
mid=(low+high)/2;
if(key>ar[mid])
{
return Find(ar,mid+1,high,key);
}
if(key==ar[mid])
{
return mid;
}
else
{
return Find(ar,low,mid-1,key);
}
}
}
3.二分法查找(非递归)
int Find(int ar[],int n,int key)
{
int low=0;
int high=n-1;
int mid;
while(low<=high)
{
mid=(low+high)/2;
if(ar[mid]>key)
{
high=mid-1;
}
if(ar[mid]==key)
{
return mid;
}
else
{
low=mid+1;
}
}
}
4.汉诺塔的递归实现
void Hanio(char from,char depend,char to,int n)
{
if(n==1)
cout<<from<<"---->"<<to<<endl;
else
{
Hanio(from,to,depend,n-1);
cout<<from<<"--->"<<to<<endl;
Hanio(depend,from,to,n-1);
}
}
5.获取元素的排列组合
void Perm(int ar[],int k,int m);
void main()
{
int ar[]={1,2,3};
int n=sizeof(ar)/sizeof(ar[0]);
Perm(ar,0,n-1);
}
void Swap(int &a,int &b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
void Perm(int ar[],int k,int m)
{
if(k==m)
{
for(int i=0;i<=m;i++)
{
cout<<ar[i];
}
cout<<endl;
}
else
{
for(int i=k;i<=m;i++)
{
Swap(ar[k],ar[i]);
Perm(ar,k+1,m);
Swap(ar[k],ar[i]);//用引用返回,其本身的值就会变化。
}
}
}
//引用传递与值传递
/*
#include<iostream>
using namespace std;
void SwapY(int &a,int &b);
void Swap(int a,int b);
void main()
{
int a=2;
int b=3;
//SwapY(a,b);
//cout<<"交换了"<<a<<"和"<<b<<endl;//交换了3和2 用引用传递会改变a,b的值。
Swap(a,b);
cout<<"交换了"<<a<<"和"<<b<<endl;//交换了2和3;
}
void SwapY(int &a,int &b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
void Swap(int a,int b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}*/
6.整数划分问题
整数划分:6
5+1;
4+2;4+1+1;
3+3,3+2+1;3+1+1+1+1;
2+2+2;2+2+1+1,2+1+1+1+1;
1+1+1+1+1+1;
算法:用p(n,m)来表示划分的个数,n表示这个整数,m来表示最大加数
n<0,m<0,p(n,m)=0;
n=1,m=1,p(n,m)=1;
m>n;p(n,n);
m=n; 1+p(n,n-1);//等于n的划分和小于等于n-1次划分。
<1m<n;p(n,m-1)+p(n-m,m);
#include<iostream>
using namespace std;
int p(int n,int m);
void main()
{
int res;
res=p(6,6);
cout<<res<<endl;
}
int p(int n,int m)
{
if(n<0||m<0)
{
return 0;
}
if(n==1||m==1)
{
return 1;
}
if(m>n)
{
return p(n,n);
}
if(m==n)
{
return 1+p(n,n-1);
}
return p(n,m-1)+p(n-m,m);
}
7.一元多项式的加减乘
#include<iostream>
#include<assert.h>
using namespace std;
#define ElemType int
typedef struct PolynNode
{
float coef;//系数
int expn;//指数
struct PolynNode *next;
}PolynNode;
typedef PolynNode* Polyn;
void Init_Polyn(Polyn &pn);//初始化多项式
void CreatePolyn(Polyn &pn,int m);//创建多项式
void ShowPolyn(Polyn &pn);//显示多项式
void ShowExpn(PolynNode *s);//显示指数
void ShowCoef(PolynNode *s);//显示系数
void ShowFirstCoef(PolynNode *s);//单独显示第一项系数
void ShowFirstExpn(PolynNode *s);//单独显示第一项指数
Polyn PolynAdd(Polyn pa,Polyn pb);//多项式的加
Polyn PolynSub(Polyn pa,Polyn pb);//多项式的减
Polyn PolynMul(Polyn pa,Polyn pb);//多项式的乘
PolynNode* _BuyNode();//购买节点
void _insert(Polyn &pn,PolynNode *s);//按值插入
int PolynLength(Polyn &pn);//求多项式的项数
void System_Pause();
void ClearScreen();
void DestroyPolyn(Polyn &pn);//摧毁多项式
void main()
{
Polyn pa;
Polyn pb;
Polyn pc;
int n,m;
Init_Polyn(pa);
Init_Polyn(pb);
Init_Polyn(pc);
int n1,n2,n3;
int select=1;
while(select)
{
cout<<"****************************************************"<<endl;
cout<<"*【1】创建多项式pa *【2】创建多项式pb *"<<endl;
cout<<"*【3】摧毁多项式pa *【4】摧毁多项式pb *"<<endl;
cout<<"*【5】显示多项式pa *【6】显示多项式pb *"<<endl;
cout<<"*【7】多项式相加 *【8】多项式相减 *"<<endl;
cout<<"*【9】多项式的相乘 *【10】求多项式的项数*"<<endl;
cout<<"*【0】退出系统 *"<<endl;
cout<<"****************************************************"<<endl;
cout<<"请选择:>";
cin>>select;
switch(select)
{
case 1:
cout<<"请输入多项式pa的项数:";
cin>>n;
CreatePolyn(pa,n);
break;
case 2:
cout<<"请输入多项式pb的项数:";
cin>>m;
CreatePolyn(pb,m);
break;
case 3:
DestroyPolyn(pa);
break;
case 4:
DestroyPolyn(pb);
break;
case 5:
ShowPolyn(pa);
break;
case 6:
ShowPolyn(pb);
break;
case 7:
pc=PolynAdd(pa,pb);
cout<<"pa+pb=";
ShowPolyn(pc);
break;
case 8:
pc=PolynSub(pa,pb);
cout<<"pa-pb=";
ShowPolyn(pc);
break;
case 9:
pc=PolynMul(pa,pb);
cout<<"pa*pb=";
ShowPolyn(pc);
break;
case 10:
n1=PolynLength(pa);
cout<<"多项式pa有"<<n1<<"项"<<endl;
n2=PolynLength(pb);
cout<<"多项式pb有"<<n2<<"项"<<endl;
n3=PolynLength(pc);
cout<<"多项式pc有"<<n3<<"项"<<endl;
break;
}
System_Pause();
ClearScreen();
}
}
void Init_Polyn(Polyn &pn)
{
pn=NULL;
}
void System_Pause()
{
system("pause");
}
void ClearScreen()
{
system("cls");
}
PolynNode* _BuyNode()
{
PolynNode* s=(PolynNode*)malloc(sizeof(PolynNode));
assert(s!=NULL);
s->next=NULL;
return s;
}
void CreatePolyn(Polyn &pn,int m)
{
for(int i=1;i<=m;++i)
{
cout<<"请输入第"<<i<<"项的系数和指数:";
PolynNode *s=_BuyNode();
cin>>s->coef>>s->expn;
_insert(pn,s);
}
}
void _insert(Polyn &pn,PolynNode *s)
{
if(s->coef==0)
{
free(s);
s=NULL;
}
else
{
if(pn==NULL)//多项式为空
{
pn=s;
return;
}
PolynNode* p=pn;
PolynNode* q=NULL;
while(p!=NULL&&p->expn>s->expn)
{
q=p;
p=p->next;
}
if(p!=NULL&&p->expn<s->expn)
{
if(q==NULL)
{
s->next=p;
pn=s;
}
else
{
s->next=p;
q->next=s;
}
}
if(p!=NULL&&p->expn==s->expn)
{
p->coef+=s->coef;
free(s);
s=NULL;
return;
}
if(p==NULL)
{
q->next=s;
}
}
}
void DestroyPolyn(Polyn &pn)
{
PolynNode *p=pn;
PolynNode *p1;
while(p!=NULL)
{
p1=p;
p=p->next;
free(p1);
}
}
void ShowExpn(PolynNode *s)//显示x和指数
{
if(s->coef==0||s->expn==0)//系数为0或者指数为0 不显示
return;
else if(s->expn==1)
{
cout<<"x";
}
else
{
cout<<"x^"<<s->expn;
}
}
void ShowCoef(PolynNode *s)//显示系数
{
if(s->coef<0)
{
if(s->coef==-1)
{
if(s->expn!=0)
cout<<"-";
else
cout<<"-1";
}
else
{
cout<<s->coef;
}
}
else if(s->coef==0)
return;
else
{
if(s->coef==1)
{
if(s->expn==0)
{
cout<<"+1";
}
else
{
cout<<"+";
}
}
else
{
cout<<"+"<<s->coef;
}
}
}
void ShowFirstCoef(PolynNode *s)//第一项单独显示系数
{
if(s->coef==0&&s->expn==0)
{
cout<<"0";
}
if(s->coef<0)
{
if(s->coef==-1)
{
if(s->expn==0)
cout<<"-1";
else
cout<<"-";
}
else
{
cout<<s->coef;
}
}
else if(s->coef>0)
{
if(s->coef==1)
{
if(s->expn==0)
{
cout<<"1";
}
else
{
return;
}
}
else
{
cout<<s->coef;
}
}
}
void ShowFirstExpn(PolynNode *s)//第一项单独显示指数
{
if(s->coef==0||s->expn==0)
return;
else if(s->expn==1)
cout<<"x";
else
{
cout<<"x^"<<s->expn;
}
}
void ShowPolyn(Polyn &pn)//显示多项式
{
if(pn==NULL)
{
cout<<"多项式为空"<<endl;
return;
}
PolynNode* p=pn->next;
ShowFirstCoef(pn);
ShowFirstExpn(pn);
while(p!=NULL)
{
ShowCoef(p);
ShowExpn(p);
p=p->next;
}
}
int Compare(Polyn pa,Polyn pb)//比较两个表达式的大小
{
if(pa==NULL&&pb!=NULL)
return -1;
if(pa!=NULL&&pb==NULL)
return 1;
if(pa==NULL&&pb==NULL)
return 0;
else
{
if(pa->expn>pb->expn)
return 1;
if(pa->expn==pb->expn)
return 0;
else
return -1;
}
}
Polyn PolynAdd(Polyn pa,Polyn pb)
{
int res;
Polyn pn=NULL;
if(pa==NULL&&pb!=NULL)
{
return pb;
}
if(pa!=NULL&&pb==NULL)
{
return pa;
}
else if(pa==NULL&&pb==NULL)
{
return NULL;
}
while(pa!=NULL||pb!=NULL)
{
PolynNode *s=_BuyNode();
res=Compare(pa,pb);
switch(res)
{
case -1:
s->coef=pb->coef;
s->expn=pb->expn;
pb=pb->next;
break;
case 0:
s->coef=pa->coef+pb->coef;
s->expn=pa->expn;
pa=pa->next;
pb=pb->next;
break;
case 1:
s->coef=pa->coef;
s->expn=pa->expn;
pa=pa->next;
break;
}
_insert(pn,s);
}
return pn;
}
Polyn PolynSub(Polyn pa,Polyn pb)//多项式的减法实现
{
PolynNode *p=pb;
Polyn pn=NULL;
while(p!=NULL)
{
p->coef*=-1;
p=p->next;
}
pn=PolynAdd(pa,pb);
while(p!=NULL)
{
p->coef*=-1;
p=p->next;
}
return pn;
}
Polyn PolynMul(Polyn pa,Polyn pb)//多项式的乘法
{
Polyn pn=NULL;
PolynNode *p;
PolynNode *s;
while(pa!=NULL)
{
p=pb;
while(p!=NULL)
{
s=_BuyNode();
s->coef=pa->coef*p->coef;
s->expn=pa->expn+p->expn;
p=p->next;
_insert(pn,s);
}
pa=pa->next;
}
return pn;
}
int PolynLength(Polyn &pn)
{
PolynNode *p=pn;
int n=0;
if(p==NULL)
{
return 0;
}
while(p!=NULL)
{
n+=1;
p=p->next;
}
return n;
}