自定义函数及其调用的几个作业题(含一点递归)

目录

一、编写函数判别一个数是否是质数,在主程序中实现输入输出。

二、编写函数求两个整数的最大公约数和最小公倍数。

三、在主程序中提示输入整数n,编写函数用递归的方法求1+2+3+...+n的值。

四、用递归的方法编写函数求Fibonacci级数,公式为Fn=Fn-1 +Fn-2 (n>2),F1=F2=1.

五、用递归的方法编写函数求n阶勒让德多项式的值


一、编写函数判别一个数是否是质数,在主程序中实现输入输出。

#include<iostream>
#include<cmath>
using namespace std;
int k;  //全局变量k用来控制输出结果

void zhishu(int a)
{
	int b,c;
	b=sqrt(a);
	for(c=2;c<=b;c++){
		if(a%c==0){
			k=0;
			break;
		}
		k=1;
	}
}

int main()
{
	int a;
	cin>>a;
	zhishu(a);
	if(k==0){
		cout<<a<<"不是质数"<<endl;
	}
	else if(k==1){
		cout<<a<<"是质数"<<endl;
	}
	return 0;
}

个人感觉应该是有不用设置全局变量的方法,但我没想到......

质数指除了1和它本身没有其他因数的数,假设要判断X是不是质数,那就判断2~根号X之间是否有数字能被X整除即可

二、编写函数求两个整数的最大公约数和最小公倍数。

#include<iostream>
#include<cmath>
using namespace std;
int ma,mi;//分别代表最大公约数和最小公倍数

void maxy(int a,int b)//自定义函数求最大公约数
{
	int c;
	if(a<=b){
		for(c=1;c<=a;c++){
			if((a%c==0)&&(b%c==0)){
				ma = c;
			}
		}
	}
	else if(b<a){
		for(c=1;c<=b;c++){
			if((a%c==0)&&(b%c==0)){
				ma = c;
			}
		}
	}
}

void minb(int a,int b)//自定义函数求最小公倍数
{
	maxy(a,b);
	mi = a*b/ma;
}

int main()
{
	int a,b;
	cin>>a>>b;
	maxy(a,b);
	minb(a,b);
	cout<<ma<<endl;
	cout<<mi<<endl;
	return 0;
}

理解这两个函数还是比较简单的。

最大公约数再大也不会大于两个原始数据中较小的那一个(简称较小数),所以只要把1~较小数之间都能被两个原始数据整除的数找出来,留下最大的一个即可。

而最小公倍数的计算方法就更加简单粗暴了,举个例子,5和10以及15和18。

不难看出最小公倍数其实就是两个原始数据分别除以他们的最大公约数后再乘以最大公约数,用a,b代表原始数据,max代表最大公约数,那么这个式子是这样的:

(a/max)*(b/max)*max

所以化简之后就是代码里那个式子啦。

三、在主程序中提示输入整数n,编写函数用递归的方法求1+2+3+...+n的值。

#include<iostream>
#include<cmath>
using namespace std;


int summ(int n){
	if(n==1)
	   return 1;
	else
	   return n+summ(n-1);
}

int main()
{
	int n;
	cout<<"请输入一个整数:"<<endl;
	cin>>n;
	cout<<"该数的累加和为:"<<summ(n)<<endl;
	return 0;
}

 这次自定义的是返回值是整型的函数,相比于前两个返回值为空(也不知道这么说对不对)的函数,这个就需要考虑要return什么啦。

PS:累加和那个名字是我瞎起的,只是感觉这么叫挺合适的。

四、用递归的方法编写函数求Fibonacci级数,公式为Fn=Fn-1 +Fn-2 (n>2),F1=F2=1.

#include<iostream>
#include<cmath>
using namespace std;


int fib(int n){
	int f1,f2;
	f1=f2=1;
	if(n==1)
	   return f1;
	if(n==2)
	   return f2;
	else if(n>2)
	   return fib(n-1)+fib(n-2);
}

int main()
{
	int n;
	cout<<"请输入一个整数:"<<endl;
	cin>>n;
	cout<<"斐波那契数列的该项为:"<<fib(n)<<endl;
	return 0;
}

有上一道题做铺垫,这个斐波那契问题就好理解多了。

五、用递归的方法编写函数求n阶勒让德多项式的值

 

#include<iostream>
#include<cmath>
using namespace std;


double le(int n,double x){
	if(n==0)
	   return 1;
	if(n==1)
	   return x;
	else if(n>1)
	   return (((2*n-1)*x*le(n-1,x)-(n-1)*le(n-2,x))/n);
}

int main()
{
	int n;
	double x;
	cout<<"请输入想计算的项数以及未知数x的值:"<<endl;
	cin>>n>>x;
	cout<<"勒让德多项式的值为:"<<le(n,x)<<endl;
	return 0;
}

这道题其实我心里没太有底,因为虽然程序能正常运行,但我这个懒癌晚期患者从来没动手算过结果对不对,so...

熟悉了下编辑页面,暂时存这些吧,以后再也不用担心电脑里的作业文件没地方放啦!!!

统统删掉!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值