找回密码
 欢迎注册
楼主: wayne

[提问] 关于printf的问题

[复制链接]
发表于 2010-4-1 11:45:09 | 显示全部楼层
主要你这里LCM里面是
while(a!=b){if(a<b) a+=m;else b+=n;}
其中m,n不变,也就是说如果m=n-1,复杂度是O(m+n)
而通常的方法复杂度是O(log(m+n))
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-4-1 12:02:19 | 显示全部楼层
现在的CPU在加减乘除在机器长度范围内都相差无几了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-4-1 12:04:37 | 显示全部楼层
除法还是远慢于乘法的,
当然若是除一个常数,则会有些特殊方法转化为移位、乘法指令来加速。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-4-1 12:41:28 | 显示全部楼层
应该是编译器对%llu的解释出了问题。
不定个数参数的函数都有这类问题,编译器也没办法进行类型检查。
风云剑 发表于 2010-4-1 11:14

呵呵,有道理啊~~
我换成了%I64u ,%I32u 就正常了。。。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-4-1 12:42:49 | 显示全部楼层
gcc里面可以使用%I64u?我还以为这个是windows独创的。倒是%llu这个格式gcc应该支持的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-4-1 12:51:57 | 显示全部楼层
本帖最后由 wayne 于 2010-4-1 13:15 编辑

为了能平台无关,可以加一个头文件:

ISO C99 includes the inttypes.h
header file that includes a number of macros for use in platform-independent printf coding. Example macros include:
CharactersDescription
"PRId32"Typically equivalent to I32d (Win32/Win64) or d
"PRId64"Typically equivalent to I64d (Win32/Win64),
lld (32-bit platforms) or ld (64-bit platforms)
"PRIi32"Typically equivalent to I32i (Win32/Win64) or i
"PRIi64"Typically equivalent to I64i (Win32/Win64), lli (32-bit platforms) or li
(64-bit platforms)
"PRIu32"Typically equivalent to I32u (Win32/Win64) or u
"PRIu64"Typically equivalent to I64u (Win32/Win64), llu (32-bit platforms) or
lu (64-bit platforms)



长整型打印,平台无关的代码可以这么写:
  1. #include<stdio.h>
  2. #include<limits.h>
  3. #include<inttypes.h>
  4. int main(){
  5. printf("%"PRIu64"\n%"PRIu32"\n",ULLONG_MAX,ULONG_MAX);
  6. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-4-1 13:05:11 | 显示全部楼层
gcc里面可以使用%I64u?我还以为这个是windows独创的。倒是%llu这个格式gcc应该支持的
mathe 发表于 2010-4-1 12:42

MinGW下 能用,Linux下的gcc不能用(linux下用 mingw32除外, )
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-4-1 13:27:19 | 显示全部楼层
vs2008里面竟然没有C99里面的头文件 inttypes.h !!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-4-1 15:39:26 | 显示全部楼层
主要你这里LCM里面是
while(a!=b){if(a
mathe 发表于 2010-4-1 11:45

mathe真坏,
拿最坏的情况来讨论算法。。。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-4-3 21:42:51 | 显示全部楼层
本帖最后由 只是呼吸 于 2010-4-3 22:09 编辑

楼主的那个程序在我用的vc++6.0上要将第3、4行的“long  long ”去掉一个long才能通过。通过后可以得到程序所提供的正确结论,没有楼主说的那种情况。

另外我用的这个vc++6.0用int定义c语言的整型数与用long定义c语言的整型数结果是一样的,都是$2^31$。若用“long long”来定义整数,都要报错,但看书上是可以这样定义的,一直郁闷ing。我是初学(自学),没有老师可问,若那个大大知道,告诉一声,先谢过哈。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-18 10:21 , Processed in 0.061771 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表