角谷猜想
题目描述
日本一位中学生发现一个奇妙的 定理,请角谷教授证明,而教授 无能为力,于是产生了角谷猜想。 猜想的内容:任给一个自然数, 若为偶数则除以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);
}