1. 程式人生 > >每日一題(01.07)

每日一題(01.07)

Description:

請你程式設計求出 i = 0 k (

1 ) i C k i
2 i + 1 \sum_{i=0}^{k}\frac{(-1)^iC_k^i}{2i+1} 的值。

Input:

多行輸入,每行一個正整數k。輸入0結束程式。

Output:

表示式的值,格式見Sample。

Sample Input:

1
3
7
0

Sample Output:

2/3
16/35
2048/6435

Reference Code

#include <iostream>
#include <vector>
using namespace std;
vector<int> fac_storage={1};
int factorial(int n){
	int len=fac_storage.size();
	if (len<=n){
		fac_storage.push_back(fac_storage.back()*len);
		return factorial(n);
	}
	else
		return fac_storage[n];
}
int combination(int n,int m){
	return factorial(n)/factorial(m)/factorial(n-m);
}
struct fraction{
	int molecule;
	int denominator;
};
struct fraction add(struct fraction a,struct fraction b){
	struct fraction ans;
	ans.molecule=a.denominator*b.molecule+a.molecule*b.denominator;
	ans.denominator=a.denominator*b.denominator;
	for (int i=2;i<=ans.denominator || i<=ans.molecule;i++){
		while (ans.denominator%i==0 && ans.molecule%i==0){
			ans.denominator/=i;
			ans.molecule/=i;
		}
	}
	return ans;
}
int sign(int n){
	if (n%2==0) return 1;
	else return -1;
}
struct fraction solve(int k){
	struct fraction ans;
	ans.denominator=1;
	ans.molecule=0;
	for (int i=0;i<=k;i++){
		struct fraction buf;
		buf.molecule=sign(i)*combination(k,i);
		buf.denominator=2*i+1;
		ans=add(ans,buf);
	}
	return ans;
}
int main(){
	int k;
	while (cin>>k && k){
		struct fraction buf=solve(k);
		cout<<buf.molecule<<"/"<<buf.denominator<<endl;
	}
	return 0;
}