函数——递归6(c++)

文章详细解析了如何用编程验证角谷猜想,涉及整数运算、最大公约数、数的计数方法和回文数转换,是编程与数学结合的实践案例。
摘要由CSDN通过智能技术生成

角谷猜想

题目描述

日本一位中学生发现一个奇妙的 定理,请角谷教授证明,而教授 无能为力,于是产生了角谷猜想。 猜想的内容:任给一个自然数, 若为偶数则除以2,若为奇数则乘 3加1,得到一个新的自然数后按 上面的法则继续演算。若干次后 得到的结果必为1。

请编写代码验 证该猜想:求经过多少次运算可 得到自然数1。

如:输入22,则计算过程为。

22/2=11

11×3+1=34

34/2=17

17×3+1=52

52/2=26

26/2=13

13×3+1=40

40/2=20

20/2=10

10/2=5

5×3+1=16

16/2=8

8/2=4

4/2=2

2/2=1

经过15次运算得到自然数1。

输入

一行,一个正整数n。 (1<=n<=20000)

 输出

一行,一个整数,表示得到1 所用的运算次数。

样例

输入复制

22

输出复制

 15

#include <bits/stdc++.h>
using namespace std;
int aaa(int);
int main()
{
	int a;
	cin>>a;
	cout<<aaa(a);
	return 0;
}
int aaa(int n)
{
	if(n==1) return 0;
	if(n%2==0) return 1+aaa(n/2);
	if(n%2==1) return 1+aaa(n*3+1);
}

求两个数M和N的最大公约数

题目描述

求两个正整整数 M 和 N 的最大公约数(M,N都在长整型范围内) 

输入

输入一行,包括两个正整数。

输出

输出只有一行,包括1个正整数。

样例

输入复制

45 60

输出复制

15

#include <bits/stdc++.h>
using namespace std;
int aaa(int,int);
int main()
{
	int a,b;
	cin>>a>>b;
	cout<<aaa(a,b);
	return 0;
}
int aaa(int a,int b)
{
	if(a%b==0) return b;
	int sum = a%b;
	return aaa(b,sum);
}

数的计数

题目描述

输入一个自然数n(n<=100)在该自然数的左侧加上一个自然数,但加上的数不能超过n的一半;加上数后继续按此规则处理,直到不能再添加自然数为止;请问按照这样的方法添加数,能够产生多少个新数?

 例如:n=6,则左侧添加数的方案有 16 26 126 36 136 共能够产生5个新数。

输入

一个整数n

输出

按照规则能够产生的新数的个数

样例

输入复制

6

输出复制

5

#include <bits/stdc++.h>
using namespace std;
int aaa(double,int);
int main()
{
	double a;
	cin>>a;
	cout<<aaa(a,0);
	return 0;
}
int aaa(double a,int cnt)
{
	if(a==2) return 1;
	if(a==1) return 0;
	if(a==3) return 1;
	for(int i = 1;i<=a/2;i++)
	{
		cnt++;
		cnt = cnt+aaa(i,0);
	}
	return cnt;
}

放苹果

题目描述

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K 表示)

5,1,1和1,5,1 是同一种分法。

输入

第一行是测试数据的数目t(0 <=t<=20)以下每行均 包含二个整数M和N,以空格分开。1<=m,n<=10。

输出

对输入的每组数据M和N,用一行输出相应的K。

样例输入

1

7 3

样例输出

8

#include <bits/stdc++.h>
using namespace std;
int aaa(int,int);
int main()
{
	int i;
	cin>>i;
	int m[50],n[50];
	for(int j = 0;j<i;j++)
	{
		cin>>m[j]>>n[j];
	}
	for(int j = 0;j<i;j++)
	{
		cout<<aaa(m[j],n[j])<<endl;
	}
	return 0;
}
int aaa(int m,int n)
{
	if(m==1||n==1||m==0||n==0) return 1;
	if(m<0) return 0;
	if(m<n) return m;
	return aaa(m-n,n)+aaa(m,n-1);
}

#include <bits/stdc++.h>
using namespace std;
int aaa(int);
int main()
{
	int n;
	cin>>n;
	cout<<aaa(n);
	return 0;
}
int aaa(int n)
{
	if(n/10==0) return n;
	int sum = 0;
	int t = n;
	while(t!=0)
	{
		sum = sum+t%10;
		t = t/10;
	}
	return aaa(sum);
}

#include <bits/stdc++.h>
using namespace std;
int aaa(int,int);
int main()
{
	int m,n;
	cin>>m>>n;
	cout<<aaa(m,n);
	return 0;
}
int aaa(int m,int n)
{
	if(m==0) return n+1;
	if(m>0&&n==0) return aaa(m-1,1);
	if(m>0&&n>0) return aaa(m-1,aaa(m,n-1));
}

回文数

题目描述

回文数的定义为:如果把一个数的各个数位上的数字颠倒过来得到的新数与原数相等,则此数是回文数, 例:7,22,131,2112,31013,…都是回文数。

对任意给出的一个整数n,经过一系列的处理,最后都能成为 回文数。处理的方法是,该数加上它的颠倒数。

例如:n=176

第一次处理后      176+671=847

第二次处理后      847+748=1595

第三次处理后      1595+5951=7546

第四次处理后      7546+6457=14003

第五次处理后      14003+30041=44044

此时成为回文数,共进行5次处理。

问题:给出n 后,求出使该数按照以上规则进行一系列处理后成为回文数的最少操作次数。

#include <bits/stdc++.h>
using namespace std;
int aaa(int,int);
int main()
{
	int n;
	cin>>n;
	cout<<aaa(n,0);
	return 0;
}
int aaa(int n,int cnt)
{
	int sum = 0;
	int sum2 = 0;
	int t = n;
	while(t!=0)
	{
		sum = sum*10+t%10;
		t = t/10;
	}
	if(sum==n) return cnt;
	sum2 = sum+n;
	t = sum2;
	sum = 0;
	while(t!=0)
	{
		sum = sum*10+t%10;
		t = t/10;
	}
	cnt++;
	if(sum==sum2) return cnt;
	return cnt+aaa(sum2,0);
}

求两个数M和N的最小公倍数

题目描述

求两个正整整数 M 和 N 的最小公倍数(M,N都在长整型范围内)

输入

输入一行,包括两个正整数。

输出

输出只有一行,包括1个正整数。

样例

输入复制

45 60

输出复制

180

#include <bits/stdc++.h>
using namespace std;
int a,b;
int aaa(int,int);
int main()
{
	cin>>a>>b;
	cout<<aaa(a,b);
	return 0;
}
int aaa(int n,int m)
{
	if(n%m==0) return a*b/m;
	int sum2 = n%m;
	return aaa(m,sum2);
}

#include <bits/stdc++.h>
using namespace std;
int aaa(int,int);
int main()
{
	int n,x;
	cin>>n>>x;
	cout<<aaa(n,x);
	return 0;
}
int aaa(int n,int x)
{
	if(n==0) return 1;
	if(n==1) return 2*x;
	if(n>1) return 2*x*aaa(n-1,x)-2*(n-1)*aaa(n-2,x);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值