1. 程式人生 > >UVA 10288 Coupons---概率 && 分數類模板

UVA 10288 Coupons---概率 && 分數類模板

最簡 lan size rac struct -- != ret operator

題目鏈接:

https://cn.vjudge.net/problem/UVA-10288

題目大意:

一種刮刮卡一共有n種圖案,每張可刮出一個圖案,收集n種就有獎,問平均情況下買多少張才能中獎?用最簡的分數形式表示答案。n<=33。

解題思路:

假設現在已刮到k個圖案了,刮到新圖案的概率是(n-k)/n,即若要再收集一個新圖案平均要刮s=n/(n-k)次。所以只需要窮舉k=1 to n,累加s的和就行了。註意式子可以將分子n提取出來。

先附上分數類模板

 1 struct Fraction//分數類
 2 {
 3     ll num, den;//num為分子,den為分母
 4     Fraction(ll num = 0
, ll den = 1) 5 { 6 if(den < 0) 7 { 8 num = -num; 9 den = -den; 10 } 11 assert(den != 0);//den=0程序終止 12 ll g = __gcd(abs(num), den); 13 this->num = num / g; 14 this->den = den / g; 15 } 16 Fraction operator
+ (const Fraction& o)const 17 { 18 return Fraction(num * o.den + den * o.num, den * o.den); 19 } 20 Fraction operator - (const Fraction& o)const 21 { 22 return Fraction(num * o.den - den * o.num, den * o.den); 23 } 24 Fraction operator * (const Fraction& o)const
25 { 26 return Fraction(num * o.num, den * o.den); 27 } 28 Fraction operator / (const Fraction& o)const 29 { 30 return Fraction(num * o.den, den * o.num); 31 } 32 bool operator < (const Fraction& o)const 33 { 34 return num * o.den < den * o.num; 35 } 36 bool operator == (const Fraction& o)const 37 { 38 return num * o.den == den * o.num; 39 } 40 };

註意輸出格式(很傷)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 struct Fraction//分數類
 5 {
 6     ll num, den;//num為分子,den為分母
 7     Fraction(ll num = 0, ll den =  1)
 8     {
 9         if(den < 0)
10         {
11             num = -num;
12             den = -den;
13         }
14         assert(den != 0);//den=0程序終止
15         ll g = __gcd(abs(num), den);
16         this->num = num / g;
17         this->den = den / g;
18     }
19     Fraction operator + (const Fraction& o)const
20     {
21         return Fraction(num * o.den + den * o.num, den * o.den);
22     }
23     Fraction operator - (const Fraction& o)const
24     {
25         return Fraction(num * o.den - den * o.num, den * o.den);
26     }
27     Fraction operator * (const Fraction& o)const
28     {
29         return Fraction(num * o.num, den * o.den);
30     }
31     Fraction operator / (const Fraction& o)const
32     {
33         return Fraction(num * o.den, den * o.num);
34     }
35     bool operator < (const Fraction& o)const
36     {
37         return num * o.den < den * o.num;
38     }
39     bool operator == (const Fraction& o)const
40     {
41         return num * o.den == den * o.num;
42     }
43 };
44 int main()
45 {
46     ll n, k, ans, cases = 0;
47     while(cin >> n)
48     {
49         Fraction ans;
50         for(int i = 1; i <= n; i++)
51         {
52             ans = ans + Fraction(n, i);
53         }
54         ll t = ans.num / ans.den;
55         ans.num -= t * ans.den;
56         if(ans.num == 0)
57         {
58             cout<<t<<endl;
59         }
60         else
61         {
62             string s;
63             stringstream ss, ss1;
64             ss << t;
65             ss >> s;
66             int kongge = s.size();
67             for(int i = 0; i <= kongge; i++)cout<<" ";
68             cout<<ans.num<<"\n";
69 
70             ss1 << ans.den;
71             ss1 >> s;
72             int duanxian = s.size();
73             cout<<t<<" ";
74             for(int i = 0; i < duanxian; i++)cout<<"-";
75             cout<<"\n";
76             for(int i = 0; i <= kongge; i++)cout<<" ";
77             cout<<ans.den<<"\n";
78         }
79     }
80     return 0;
81 }

UVA 10288 Coupons---概率 && 分數類模板