求n的阶乘(递归&&非递归),Fibonacci函数,二分法查找,汉诺塔实现,排列组合,整数划分,一元多项式的加减乘

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;


}



 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值