搜索
查看: 1892|回复: 11
打印 上一主题 下一主题

求助:关于挑战 23 : Hanks的儿子的趣味题

[复制链接]
跳转到指定楼层
楼主
发表于 2013-10-21 11:32:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
挑战 23 : Hanks的儿子的趣味题
Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫Hankson。现在,刚刚放学回家的Hankson正在思考一个有趣的问题。
今天在课堂上,老师讲解了如何求两个正整数c1和c2的最大公约数和最小公倍数。现在Hankson认为自己已经熟练地掌握了这些知识,他开始思考一个 “求公约数”和“求公倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b1,设某未知正整数x满足:
1、 x和a0的最大公约数是a1;
2、 x和b0的最小公倍数是b1。
Hankson的“逆问题”就是求出满足条件的正整数x。但稍加思索之后,他发现这样的x并不唯一,甚至可能不存在。因此他转而开始考虑如何求解满足条件的x的个数。
例如:a0=41,a1=1,b0=96,b1=288,那么x可以是9、18、36、72、144、288,共有6 个。

请问:当a0=8085,a1=105,b0=1532,b1=11099340的是时候,x有多少种可能?
下面是我编的程序,运行结果得3个,答案提示说不对,到底是哪错了呢?

#include "stdio.h"

int gcd(int a,int b)
{
        int temp;
        if(a<b)/*交换两个数,使大数放在a上*/
        {
        temp=a;
        a=b;
        b=temp;
        }
        while(b!=0)/*利用辗除法,直到b为0为止*/
        {
                temp=a%b;
                a=b;
                b=temp;
        }
        return a;
}

void main()
{        long x,b1=11099340;
    int a0=8085,a1=105,b0=1532,n=0;
    for (x=a1;x<=b1;x+=a1){
            if ((gcd(a0,x)==a1) && (b0*x/gcd(b0,x)==b1)){
                    n++;       
                    printf("%d\t",x);
            }
    }
    printf("\n共%d个",n);
}

最佳答案

查看完整内容

当前主流编译器都有long long int可以用(C99标准化) 如果还要大就要自己实现或者用第三方库 如果是简单的加法可以用字符串模拟随便模拟一下 如果比较复杂(比如要算gcd)可以用gmp库 http://gmplib.org/
沙发
发表于 2013-10-21 11:32:40 | 只看该作者
lunzhenmin 发表于 2013-10-21 11:59
谢谢,可能还真是,我把long改成unsigned long 之后再运行居然得到4个了,估计在做b0*x运算的时候溢出了, ...

当前主流编译器都有long long int可以用(C99标准化)
如果还要大就要自己实现或者用第三方库
如果是简单的加法可以用字符串模拟随便模拟一下
如果比较复杂(比如要算gcd)可以用gmp库
http://gmplib.org/
板凳
发表于 2013-10-21 11:48:10 | 只看该作者
注意溢出

给个参考,现在大多数编译器的 int和long int容量是2^31-1
地板
 楼主| 发表于 2013-10-21 11:59:58 | 只看该作者
rosynirvana 发表于 2013-10-21 11:48
注意溢出

给个参考,现在大多数编译器的 int和long int容量是2^31-1

谢谢,可能还真是,我把long改成unsigned long 之后再运行居然得到4个了,估计在做b0*x运算的时候溢出了,请教一下要表示特别大的数需要用什么数据类型呢
5#
 楼主| 发表于 2013-10-21 13:11:19 | 只看该作者
rosynirvana 发表于 2013-10-21 12:40
当前主流编译器都有long long int可以用(C99标准化)
如果还要大就要自己实现或者用第三方库
如果是简 ...

嗯,谢谢了,我原来有用过long long的,但是我的那个编译器不支持,我再换个试试
6#
发表于 2013-10-22 08:15:01 | 只看该作者
lunzhenmin 发表于 2013-10-21 11:59
谢谢,可能还真是,我把long改成unsigned long 之后再运行居然得到4个了,估计在做b0*x运算的时候溢出了, ...

如果你用vc,那么可以用_int64。
要不就自己定义数组和链表存储,或者使用bitset做运算
7#
 楼主| 发表于 2013-10-22 09:28:27 | 只看该作者
Teddy 发表于 2013-10-22 08:15
如果你用vc,那么可以用_int64。
要不就自己定义数组和链表存储,或者使用bitset做运算

谢谢,我直接用网上的在线编译器用unsigned long long试了,运行可以得到正确结果,嘻嘻!
8#
发表于 2013-10-23 08:41:13 | 只看该作者
我在做这个题的时候,各变量也是定义为int,和你不同的地方仅仅是条件表达式写法不同。
你的是:b0*x/gcd(b0,x)
我的是:b0/gcd(b0,x)*x
正好避开了溢出
9#
 楼主| 发表于 2013-10-23 12:01:29 | 只看该作者
Smallbee 发表于 2013-10-23 08:41
我在做这个题的时候,各变量也是定义为int,和你不同的地方仅仅是条件表达式写法不同。
你的是:b0*x/gcd( ...

嗯,这个办法不错,学习了
10#
 楼主| 发表于 2013-10-23 12:05:53 | 只看该作者
Smallbee 发表于 2013-10-23 08:41
我在做这个题的时候,各变量也是定义为int,和你不同的地方仅仅是条件表达式写法不同。
你的是:b0*x/gcd( ...

看到你的id觉得很熟,刚看了下挑战里的排名,我刚好就在你下面,缘分啊,(*^__^*) 嘻嘻……
11#
发表于 2013-10-23 15:30:10 | 只看该作者
lunzhenmin 发表于 2013-10-23 12:05
看到你的id觉得很熟,刚看了下挑战里的排名,我刚好就在你下面,缘分啊,(*^__^*) 嘻嘻……

真的?
患难兄弟啊
12#
发表于 2013-10-25 10:31:12 | 只看该作者
路过发帖,无聊ing······
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表