HDU 1099 Lottery

题目有点难懂,直接看样例又不太直观。不管了。其实题意很简单,实际上就是一道数学题+编码

题意:求一个数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 }
View Code
原文地址:https://www.cnblogs.com/cton/p/3438673.html