1. 累加求和
給定n(1<=n<=100),用遞歸的方法計算1+2+3+4+5+......+(n-1)+n.
輸入:一個大於等於1的整數。
輸出:輸出一個整數。
【樣例輸入】
5
【樣例輸出】
15
#include <iostream> using namespace std; int fac(int n){ if(n == 1) return 1; return (fac(n-1) + n); } int main(){ int n; cin >> n; cout << fac(n) << endl; return 0; }
2. 蘋果划分問題
給定帶有編號的n個蘋果(a1,a2,...,an)放入k個(0<k<=n<30)無標號的盒子中,使得沒有一個盒子為空,請問一共有多少中划分的方法。
輸入:一行,兩個數空格隔開,第一個是蘋果數量,第二個事盒子數量。
輸出:一行包含一個數,表示一共有的划分數量。
【輸入樣例】
10 6
【輸出樣例】
22827
#include <iostream> using namespace std; int s(int n,int k){ //配合大數使用。防止數據爆掉 if(n < k || k == 0) return 0; if(k == 1 || k == n) return 1; //n = 3 k = 2 //n = 2 k =1 方法只有1種 // 2 2 方法是1 *2 2 1 + 2 = 3 return s(n-1,k-1)+k*s(n-1,k); } int main(){ //n是蘋果數量 k是盒子數量 n=3 k=2 int n,k; cin >> n >> k; cout << s(n,k); return 0; }
1. Pell數列
Pell數列A1,A2,A3,...的定義是這樣的,A1=1,A2=2, ... ,An=2*An-1+An-2(n>2)
給出一個正整數k,要求Pell數列的第k項模上32767是多少。
輸入:第一行時測試數據的組數n,后面跟着n行輸入。每組測試數據占1行,包括一個正整數k(1<=k<=1000000).
輸出:n行,每行輸出對應一個輸入。輸出應是一個非負整數。
【樣例輸入】
2
1
8
【樣例輸出】
1
408
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<iostream> using namespace std; long long b[1000010]; long long r[1000010]; long long zjf(int n){ if(n<3) //設置邊界 return n; if(b[n]==0) //記憶化遞歸調用 b[n]=(2*zjf(n-1)+zjf(n-2))%100000; //取mod,不讓long long數組爆掉,但是為了避免統計錯誤,就取100000的mod return (b[n]%32767); } int main() { int n,x; cin>>n; for(int i=1;i<=n;i++){ cin>>x; //cout<<zjf(x)<<endl; r[i] = zjf(x); } for(int j=1;j<=n;j++){ cout << r[j] << endl; } }
2. 拆分自然數
任何一個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。拆分成的數字相同但順序不同被看做是相同的方案,如3+1和1+3被看做是同一種方案。
輸入:輸入待拆分的自然數n。
輸出:如樣例輸出若干個拆分方案(具體見樣例)。
【樣例輸入】
7
【樣例輸出】
1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4
#include<bits/stdc++.h> using namespace std; int a[10000]; int print(int n) { for(int i=1; i<=n; i++) { if(i!=1) printf("+"); printf("%d",a[i]); } printf("\n"); } int DFS(int n,int ans) //ans表示遞歸的深度,每一個深度對應 多個表達式, { for(int i=1; i<=n/2; i++) //后者大於等於前者 { if(i>=a[ans-1]) //保證后一個值一定大於等於前一個值 { a[ans]=i; a[ans+1]=n-i; print(ans+1); DFS(n-i,ans+1); } } } int main() { int n; while(~scanf("%d",&n)) { a[0]=0; DFS(n,1); } }
3. 分數求和
輸入n個分數並對他們求和,並用最簡單形式表示。所謂的最簡單形式是指:分母分子的最大公約數是1;若最終結果的分母為1,則直接用整數表示。
如:5/6, 10/3均是最簡形式,而3/6需要化簡為1/2, 3/1需要化簡為3。
分子分母均不為0,也不為負數。
輸入:第一行是一個整數n,表示分數個數,1<=n<=10;接下來的n行,每行一個分數,用”p/q”的形式表示,不含空格,p,q均不超過10。
輸出:只有一行,即最終結果的最簡形式。若為分數,用”p/q”表示。
【樣例輸入】
2
1/2
1/3
【樣例輸出】
5/6
#include<iostream> #include<cstdlib> #include<algorithm> #include<iomanip> #include<math.h> #include<cstdio> using namespace std; int gcd(int a,int b)//最大公約數 { if(b==0) return a; return gcd(b,a%b); } int lcd(int a,int b)//最小公倍數 { int c; if(a<=0||b<=0) return -1; c=gcd(a,b); return a*b/c; } int main() { int n,d,num1=0,num2=1,num3=0,num4=1; cin>>n; char c; while(n--) { scanf("%d%c%d",&num1,&c,&num2); d=lcd(num2,num4); num3=num3*d/num4+num1*d/num2; num4 =d; d=gcd(num3,num4); if(d>1) { num3/=d; num4/=d; } } num4>1?printf("%d/%d",num3,num4):printf("%d",num3); }