[C++] 实验三 函数+小析递归


实验3-1(A)

【题目描述】
编写具有如下原型的函数:bool f(long x);其功能为:若整数 x 仅由偶数字(0、2、4、6、8)组成时(如 x=26480),函数返回 true,否则返回 false(如当 x=22034 时)。并编制主函数对它进行调用。
【输入形式】
只能是一个整数数字,中间不能有空格等其他字符;
【输出形式】
只输出true或者false,后面不要换行。
【样例输入】
26480
【样例输出】
true

#include<iostream>
#include<cmath>
using namespace std;
bool f(long x)
{
	while (x>0)
	{
		if ((x%10)%2!=0) return false;
		x=x/10;
	}
	return true;
}
 
int main()
{
	long N;
	cin>>N;
	if (f(N)) cout<<"true";
		else cout<<"false";
} 

实验3-2(B)

【题目描述】
编写具有如下原型的函数:void find(int i, int n); 实现从 i 开始找起,连续找出 n 个素数并显示在屏幕上。如:实参为10 和 8 后,输出的 8 个素数应为:11,13,17,19,23,29,31,37。
【输入形式】
输入两个整数,前一个是查找的起始数字,后一个是指定查找几个素数;
【输出形式】
输出指定数量的素数,每个素数后面加一个空格作为分隔符,最后一个数字后面可以有一个空格,但不需要换行。
【样例输入】
13 4
【样例输出】
13 17 19 23

#include<iostream>
#include<cmath>
using namespace std;
bool fun(int i)
{
	for (int j=2;j<=int(sqrt(i));j++)
	{
		if (i%j==0) return false;
	}	
	return true;
}

void find(int i,int n)
{
	while (n>0)
	{
		if (fun(i)) 
		{
			n--;
			cout<<i<<" ";
		}	
		i++;
	}
}

int main()
{
	int i,n;
	cin>>i>>n;
	find(i,n);
}

实验3-3(C)

【题目描述】
输入正整数start和end,找出从start到end这一区间段内哪一个数n的因子和最大,并将该n及其因子和maxSum作为结果输出。例如,当start=10,end=15时,所求的n应该为12,而maxSum应该为16。
要求:设计函数计算n的因子和,其中因子和为包括1但不包括n本身的所有因子之和。
【输入形式】
两个整数,用来指定查找的起始数字和结束数字;
【输出形式】
两个整数,中间用一个空格隔开,前一个是因子和最大的数字,后一个是因子和,最后一个数字后面不要有空格和换行。
【样例输入】
10 15
【样例输出】
12 16

#include<iostream>
#include<cmath>
using namespace std;
long maxSum = -1,maxI = 0;
void find(int start,int end)
{
	long sum_a=0;
	for (int i=start;i<=end;i++)
	{
		sum_a=0;
		for (int j=1;j<i;j++)
			if (i%j==0) sum_a+=j;
		if (sum_a>maxSum)
		{
			maxSum=sum_a;
			maxI=i;
		}
	}
}

int main()
{
	int start,end;
	cin>>start>>end;
	find(start,end);
	cout<<maxI<<" "<<maxSum;	
}

实验3-4(D)

【题目描述】
编写具有如下原型的函数symm:bool symm(long n); 用来判断正整数n是否为“回文数”(正读与反读为大小相同的数),若是返回true,否则返false。并编写主函数,通过调用symm,求出n以内所有满足下述特征的m:m和7m以及3mm都是“回文数”,如1,11,88,…(因为m=1,7m=7,3mm=3;m=11,7m=77,3mm=363;m=88,7m=616,3mm=23232;…)。
【输入形式】
搜索范围
【输出形式】
输出整数,每个整数后面有一个空格用于分隔,最后一个整数后可以有一个空格,但不要换行;
【样例输入】
1000
【样例输出】
1 11 88 ……(这里省略了其他数据,不是输出省略号)

#include<iostream>
#include<cmath>
using namespace std;
bool symm(long n)
{
	int y,x=0;
	y=n;
	while (y>0)
	{
		x=x*10+y%10;
		y=y/10;
	}
	if (x==n) return true;
		else return false;
}

int main()
{
	long n; 
	cin>>n;
	for (int i=1;i<=n;i++)
	{
		if (symm(i)&&symm(7*i)&&symm(3*i*i)) cout<<i<<" ";
	}
}

实验3-5(E)

【题目描述】
键盘输入正整数 n,求出n与其反序数x之和并输出。例如,输入2038,n+x = 2038 +8302 =10340,输出应为10340。要求:编写函数实现数据转换成反序数值。
【输入形式】
输入一个整数;
【输出形式】
输出一个整数;
【样例输入】
2038
【样例输出】
10340

#include<iostream>
#include<cmath>
using namespace std;
void symm(long n)
{
	int y,x=0;
	y=n;
	while (y>0)
	{
		x=x*10+y%10;
		y=y/10;
	}
	cout<<x+n;
}

int main()
{
	long n; 
	cin>>n;
	symm(n);
}

猴子吃桃(递归方法)(F)

【题目描述】
猴子吃桃问题。猴子第1天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个;第2天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。输入1~10中的任意一个数,查询该天猴子剩下多少桃子?要求用递归函数实现问题求解。
【输入形式】
1到10中任意一个数字。
【输出形式】
猴子在该天所剩的桃子数(不需要回车换行)。
【样例输入】
10
【样例输出】
1

  • 可以理解先为通过计数器n确定操作的次数,随后通过n,进行n次压栈,再以此在返回时自行进行n次操作,完成目标
#include<iostream>
#include<cmath>
using namespace std;
int chitao(int n)
{
	if (n==1) return 1;
	return (chitao(n-1)+1)*2;
}

int main()
{
	int n;
	cin>>n;
	cout<<chitao(10-n+1)<<endl;
}

小析递归

递归的思想是在自我调用中将复杂的大问题逐渐拆解为简易的小问题,从而解决问题。

面对递归问题,首先应当明确两个问题,即终止条件递推公式

  • 终止条件:这里可以选择将天数作为终止条件即到达10天,亦或是以处理次数的递减,二者几乎相同。
  • 递推公式:An=(An-1+1)*2

通常递归内部结构分为四个层次:递归终止、向前递、调用自身、归回来

下面以我之前看过的一个很有意思的递归程序为例:

void recursion(int i) {
    if (i < 10) {
        cout<<"给你"<<i<<"个鸡腿!"<<endl;	//向前递
        recursion(++i);	//调用自身
        cout<<"从你那要回来"<<i - 1<<"个鸡腿!"<<endl;	//归回来
    } else {
        cout<<"骗你的!";	
    }
}

递归之前的内容是正向的,如同时光流转,这里可理解为执行调用++i并输出鸡腿个数。
递归之后的内容是逆向的,如同时光倒流,这里可理解为被给出的鸡腿被收回,再输出鸡腿个数
建议通过Tenet直观感受一下
在尝试理解递归时,也建议将程序分为以上四部分理解,可以先忽视归回来的内容部分,理解完正向之后再理解逆向


输出大于等于n的最小的完全平方数(G)

【题目描述】
若一个数能表示成某个自然数的平方的形式,则称这个数为完全平方数,如4=22,9=33等。编写子函数,输出大于等于n的最小的完全平方数,并在主函数中调用之。
【输入形式】
一个正整数
【输出形式】
大于等于输入数的最小的完全平方数(无需回车)
【样例输入】
10
【样例输出】
16

#include<iostream>
#include<cmath>
using namespace std;
int find(int n)
{
	while (n>0)
	{
		if (n==(int(sqrt(n))*int(sqrt(n)))) return n;
		n++; 
	}
}
int main()
{
	int n;
	cin>>n;
	cout<<find(n);	
}
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值