做数学简直无爱,用sprintf将数字转化成字符串计算其长度。
另外求化简2个数,直接求其最大公约数,除就行了。
打表过就行了。
14032844 | 10288 | Coupons | Accepted | C++ | 0.016 | 2014-08-13 10:59:00 |
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<stack> #include<queue> #include<map> #include<set> #include<list> #include<cmath> #include<string> #include<sstream> #include<ctime> using namespace std; #define _PI acos(-1.0) #define INF (1 << 10) #define esp 1e-6 typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> pill; /*=========================================== ===========================================*/ #define MAXD 40 LL X[MAXD],Y[MAXD],Z[MAXD]; LL gcd(LL a, LL b){ return b == 0 ? a : gcd(b , a % b); } void _init(){ X[1] = 1 ; Y[1] = 1; for(LL i = 2 ; i <= 33 ; i ++){ Y[i] = Y[i - 1] * i; X[i] = X[i - 1] * i + Y[i - 1]; LL mod = gcd(X[i],Y[i]); X[i] /= mod; Y[i] /= mod; } for(int i = 1 ; i <= 33 ; i ++){ X[i] = X[i] * i; Z[i] = X[i] / Y[i]; X[i] = X[i] % Y[i]; LL mod = gcd(X[i],Y[i]); X[i] /= mod; Y[i] /= mod; } return ; } int main(){ int T,n; _init(); while(scanf("%d",&n) != EOF){ if(Z[n] > 0){ char num1[MAXD],L1; sprintf(num1,"%lld",Z[n]); L1 = strlen(num1); if(X[n] > 0){ sprintf(num1,"%lld",Y[n]); int L2 = strlen(num1); for(int i = 0 ; i <= L1 ; i++) printf(" "); printf("%lld\n",X[n]); printf("%lld ",Z[n]); for(int i = 0 ; i < L2 ; i ++) printf("-"); printf("\n"); for(int i = 0 ; i <= L1 ; i++) printf(" "); printf("%lld\n",Y[n]); } else{ printf("%lld\n",Z[n]); } } else{ char num1[MAXD],L1; sprintf(num1,"%lld",Z[n]); L1 = strlen(num1); if(X[n] > 0){ sprintf(num1,"%lld",Y[n]); int L2 = strlen(num1); for(int i = 0 ; i <= L1 ; i++) printf(" "); printf("%lld\n",X[n]); printf("%lld ",Z[n]); for(int i = 0 ; i < L2 ; i ++) printf("-"); printf("\n"); for(int i = 0 ; i <= L1 ; i++) printf(" "); printf("%lld\n",Y[n]); } } } return 0; }