角谷猜想
題目描述
日本一位中學生發現一個奇妙的 定理,請角谷教授證明,而教授 無能為力,于是產生了角谷猜想。 猜想的內容:任給一個自然數, 若為偶數則除以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);
}