/* 代码似有点细节问题,但解析挺细致的blog http://www.cnblogs.com/xcw0754/p/4754015.html http://blog.163.com/xifan_jiang/blog/static/251140042201671887586/ 我模仿借鉴了的2个blog,其中有些可写可不写的,或者可以合并的代码,在我自己重写的时候,我都做了一定的简化 http://blog.csdn.net/a197p/article/details/45577499 http://blog.csdn.net/u011345136/article/details/39058429 这题主要的问题出在,并没有理解清楚题意,后来看了几种题解的思路解析,觉得其实这道题我还是有些似懂非懂...按照blog作者的说法,已经取得k次以后,取得下一个新的号码的概率为 p = (n-k)/n,而对应的平均次数就是 1/p = n/(n-k),那么总共的次数就是 1/p的那个式子求和,其中k从0到(n-1) 想说有一种很诡异的感觉,分明觉得他的思路挺有道理,可是又隐隐觉得哪里好像不对劲,现在想不太明白,到底是哪里怪怪的,那就先搁置吧 以及,我自己改写的代码,删去了我觉得不必要的地方,例如,就本题而言,即便是中间过程,分数也不可能出现负数,所以,如果符号在分母的处理,就被我删掉了...此外,如果构造中已经用了reduction()简化,而重载加减乘除时,又是返回一个新构造的值,那么重载函数中,就没有调用reduction()的必要了...等等简化 */ /* 另外一说的是,有些事情果真只是看起来简单,真要做的时候,许多问题就会涌现出来 比如我自己敲的时候,一开始一直答案有错,后来发现,重载加号时,我忘了加 fraction(),导致,后面的,就被当成了括号表达式,返回一个long long型的数,总之就是,连构造函数都忘了调用,怪不得出错T^T 一定要细心再细心啊!!! */
#include <iostream> #include <algorithm> using namespace std; typedef long long ll; const int N = 40; struct fraction { ll num, den; fraction() { num = 0; den = 1; } fraction(ll n, ll d) { num = n; den = d; this->reduction(); } fraction(ll n) { num = n; den = 1; } void operator = (ll n) { *this = fraction(n); } void operator = (const fraction a) { num = a.num; den = a.den; // cout << "used" << endl; } fraction operator +(const fraction a) { fraction tp = fraction(num * a.den + a.num * den, den * a.den); // cout << "test:"; tp.print(); return tp; } fraction operator -(const fraction a) { fraction tp = fraction(num * a.den - a.num * den, den * a.den); return tp; } fraction operator *(const fraction a) { return fraction(num * a.num, den * a.den); } fraction operator /(const fraction a) { return fraction(num * a.den, den * a.num); } // fraction operator += (const fraction a) // { // return fraction(*this) + fraction(a); // } void reduction() { ll gcd = __gcd(num, den); num /= gcd; den /= gcd; } void print() { ll a = num, b = den, c = num / den;//c为整数部分 if (!a) { cout << 0 << endl; return; } a %= b;// 化为真分数后的分子 if (!a) { cout << c << endl; return; } ll t = c; int lenc = 0, lenb = 0; while (t) { lenc++; t /= 10; } t = b; while (t) { lenb++; t /= 10; } if (c) { for (int i = 0; i <= lenc; i++) cout << " "; cout << a << endl; cout << c << " "; for (int i = 0; i < lenb; i++) cout << "-"; cout << endl; for (int i = 0; i <= lenc; i++) cout << " "; cout << b << endl; } else { cout << a << endl; for (int i = 0; i < lenb; i++) cout << "-"; cout << endl; cout << b << endl; } } }; int main() { cin.sync_with_stdio(false); cin.tie(0); int n; while (cin >> n) { fraction fra = 0; for (int i = 1; i <= n; i++) { // cout << n << " " << i << endl; // cout << "this is fra: " << endl; fra.print(); // cout << "add this: " << endl; fraction(n, i).print(); fra = fra + fraction(n, i); } fra.print(); } return 0; }