题目有点难懂,直接看样例又不太直观。不管了。其实题意很简单,实际上就是一道数学题+编码
题意:求一个数x的f(x)=x*(1/1+1/2+···+1/x),并按照有分数是输出其带分数的形式。注意格式输出。
1.一开始做了溢出了,仔细看看才知道__int64貌似也不兼容22!的大小,一开始用数组记录22!的阶乘的方法不行。
2.方法很多,这里采用的是模拟手工暴力运算,先将x乘进到括号里的分数,然后相加。相加的时候将分母扩大到最小公倍数,分子相应增大,以此类推
1 #include <stdio.h> 2 #include <algorithm> 3 using namespace std; 4 #include <iostream> 5 6 __int64 gcd(__int64 x1,__int64 x2){ 7 return x2 ? gcd(x2,x1%x2) : x1; 8 } 9 __int64 lcm(__int64 x1,__int64 x2){ 10 return x1 / gcd(x1,x2) * x2; 11 } 12 int getl(__int64 x){ 13 int cnt = 0; 14 while(x>0){ 15 cnt++;x/=10; 16 } 17 return cnt; 18 } 19 void cal(int x) 20 { 21 int cnt = 0; 22 __int64 fz=x,fm=1,tx; 23 for(int i=2;i<=x;i++) 24 { 25 tx = lcm(fm,i); 26 fz *= (tx/fm); 27 fz += (tx/i*x); 28 fm = tx; 29 if(fz > fm) cnt+=(fz/fm) , fz %= fm; 30 tx = gcd(fz,fm); 31 fz /= tx; 32 fm /= tx; 33 } 34 fz %= fm; 35 //cout<<cnt<<' ' <<fz<<' '<<fm<<' '; 36 if(fz == 0) cout<<cnt<<endl; 37 else 38 { 39 int l1 = getl(cnt),l2 = getl(fm); 40 for(int i=0;i<=l1;i++) cout<<' '; 41 cout<<fz<<' '; 42 cout<<cnt<<' '; 43 for(int i=0;i<l2;i++) cout<<'-'; 44 cout<<' '; 45 for(int i=0;i<=l1;i++) cout<<' '; 46 cout<<fm<<' '; 47 } 48 } 49 50 int main() 51 { 52 int n; 53 while(cin>>n) 54 { 55 if(n==1) cout<<"1 "; 56 else cal(n); 57 } 58 return 0; 59 }