wayne 发表于 2010-4-1 10:16:30

关于printf的问题

我的基础很差,为了缩短我在emath论坛的贫富差距,我最近一直在尝试实现大数运算需要解决的问题里面列举的几个问题

最开始,我是从大数乘法入手的,比较顺利,现在我开始实现最小公倍数,最大公约数,可遇到了很大的阻碍,调试了N长的时间,我都快要疯了 。

最后,砍掉了大量的代码,发现问题集中在最基本的printf上,:L ,
难道printf不能同时调用两个两个以上的函数吗
这是咋回事?
#include<stdio.h>
#include<stdlib.h>
unsigned long long LCM(unsigned long m,unsigned long n){
unsigned long long a=m,b=n;
while(a!=b){if(a<b) a+=m;else b+=n;}
return a;
}

unsigned long GCD(unsigned long m,unsigned long n){
while(m!=n){if(m<n) n-=m;else m-=n;}
return m;
}

int main(){unsigned long a,b,m,n;
scanf("%lu%lu",&a,&b);
printf("%llu\n%lu\n",LCM(a,b),GCD(a,b));
printf("====%lu====",GCD(a,b));
return 0;
}

mathe 发表于 2010-4-1 10:20:48

你遇上什么问题的?理论上应该没有问题。
不过你这个LCM的实现好像有点慢

wayne 发表于 2010-4-1 10:24:57

第16行的printf里面的GCD 打印结果为0,很奇怪。。。

wayne 发表于 2010-4-1 10:26:42

我的那个LCM没有用乘法,只用加法,我想速度应该不弱吧
另外,除了先求GCD,LCM还有没有什么其他的快速算法?

gxqcn 发表于 2010-4-1 10:38:57

我在VC2008调试你的代码是正常的。

wayne 发表于 2010-4-1 10:47:38

哦,我用的是
gcc version 4.4.1 (TDM-2 mingw32)

打印结果异常。。
第一个GCD始终为0,第二个GCD正常

wayne 发表于 2010-4-1 10:54:58

的确,VC没有问题。

看来是GCC的问题

wayne 发表于 2010-4-1 11:01:50

你遇上什么问题的?理论上应该没有问题。
不过你这个LCM的实现好像有点慢
mathe 发表于 2010-4-1 10:20 http://bbs.emath.ac.cn/images/common/back.gif

通常的时候,与乘法相比较,加法所花的时间总是被我们忽略了,
像这里,该怎么进行算法效率的比较呢

风云剑 发表于 2010-4-1 11:14:28

应该是编译器对%llu的解释出了问题。
不定个数参数的函数都有这类问题,编译器也没办法进行类型检查。

gxqcn 发表于 2010-4-1 11:23:11



通常的时候,与乘法相比较,加法所花的时间总是被我们忽略了,
像这里,该怎么进行算法效率的比较呢
wayne 发表于 2010-4-1 11:01 http://bbs.emath.ac.cn/images/common/back.gif

那得看它们的比例关系,
现在乘法指令已经得到高度优化了,有时1个指令周期即可完成,
也许你多做一次if判断还不及多做一次乘法划算。
页: [1] 2 3
查看完整版本: 关于printf的问题