A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 徐振升 于 2012-3-26 19:30 编辑

比如我想得到40/50的分数最简因该是4/5(5分之4)

目前我的解决办是先计算出40和50的最大公约数,
然后用这2个数分别除以算出的最大公约数。

有没有更好的解决办法?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

5 个回复

倒序浏览
你能先说出你的计算最大公约数的方法吗?
还有我也不知道什么方法最快,呵呵.但是我用的最简单的方法,用个循环把这两个数都除以2.除到任何一个数不能将2整除的时候就是结果了.

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
方辉 发表于 2012-3-27 11:26
你能先说出你的计算最大公约数的方法吗?
还有我也不知道什么方法最快,呵呵.但是我用的最简单的方法,用 ...

你的方法不行!~因为这2个数的最小公约数是2 所以你可以无限除2得到!
假如9/12(3/4)  他们2个的最小公约数是3  你除以2怎么得到?

计算最大公约数可以用12-9=3 然后9-3=6 然后6-3=3 然后3-3=0  所以3是最大公约数
然后9/3:12/3=3/4

评分

参与人数 1技术分 +2 收起 理由
郑文 + 2

查看全部评分

回复 使用道具 举报
  1. int a = 9, b = 12;
  2.             bool isT = false;
  3.             if (a < b)
  4.             {
  5.                 int t = a;
  6.                 a = b;
  7.                 b = t;
  8.                 isT = true;
  9.             }
  10.             int v = a % b;
  11.             string r = isT ? (b / v) + @"/" + (a / v) : (a / v) + @"/" + (b / v);
复制代码
a和b就是你要算的两个数
r是返回值

这个也是计算公约数 没法再快了吧!就2个if判断 你还要多快呢?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 方辉 于 2012-3-29 08:35 编辑
徐振升 发表于 2012-3-28 13:18
你的方法不行!~因为这2个数的最小公约数是2 所以你可以无限除2得到!
假如9/12(3/4)  他们2个的最小公 ...


你想过没,除以2最终的结果,  9整除2不能整除  12整除2=6 6整除2=3 3不能整除2    事实上,我已完全忘了数学上的就最大公约数的公式了.我想你能提供出来,让我思想开扩一直吧.呵. 
这个方法如果,15 5  这组又是不行,因为15 5 这两个数的最大公约数就是5自身.
那如果这样行不行呢.
int a=0;//用来存求公约数的第一个数
int b=0;//用来存求公约数的第二个数
int c=0;
   if(a>b)//如果A>b
             {
               if(a%b==0)//那么看他们的最大公约数是否为两数中的较小数.
       {c=b;}//如果较大数%较小数为0那最大公约数为较小数
          else
    {for(int d=b;d>1;d--)}//循环从最小数开始递减.具体代码就不写了.  

                 }
    
  该代码只是逻辑,未在VS中写,呵呵,看看思路行不行. 
  但是思考了一下,两个数求最大公约数,首先,看最大公约数是否为两数的某个数. 其次看这两个数是否能整除2(偶数)  或是整除3(奇数)  得到的值,在被你需要求最大公约数的数除一下.应该就是了. 其实就是求出最小公约数,就能求出最大公约数,不知道我说的对不对.     
回复 使用道具 举报
        static void Main(string[] args)
        {
            while(true)
            {
            Console.WriteLine("请输入两个数并用“/”隔开");
            string num = Console.ReadLine();
            string[] nums = num.Split('/');
            int a = Convert.ToInt32(nums[0]);
            int b = Convert.ToInt32(nums[1]);
            int[] c = getnewnum(a,b);
            string newnum=c[0]+"/"+c[1];
            Console.WriteLine("{0}的最简分数为{1},最大公约数为{2}", num, newnum,c[2]);
           // Console.ReadLine();
            }

        }
        public static int[] getnewnum(int a,int b)
        {
            int yue=1;//定义最大公约数
            int min = a < b ? a : b;//得到最小数
            for (int i = min; i > 0; i--)//从最小数开始作为除数
            {
                if (a % i == 0 && b % i == 0)//如果两个数能同时被整除则此时的除数为最大公约数
                {
                    yue = i;
                    break;//得到最大公约数后就跳出循环
                }
            }
            int[] newnum = { a / yue, b / yue ,yue};//定义数组存储最简分数
            return newnum;
         }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马