zoukankan      html  css  js  c++  java
  • UVA

    /*
    代码似有点细节问题,但解析挺细致的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;
    }


  • 相关阅读:
    Ubuntu下手动安装vscode
    VMware Tools安装后设置自动挂载解决共享文件夹无法显示的问题
    VMware Tools安装方法及共享文件夹设置方法
    JavaScript原始类型转换和进制转换
    Javascript的数据类型(原始类型和引用类型)
    设计模式(六)观察者模式
    设计模式(五)之适配器模式
    设计模式(四)注册模式 解决:解决全局共享和交换对象
    设计模式(三)单例模式
    设计模式(二)之策略模式
  • 原文地址:https://www.cnblogs.com/mofushaohua/p/7789527.html
Copyright © 2011-2022 走看看