C程序 竞速擂台(杭天龙的抛砖引玉)(2012.4.29更新)

本文章主要用于技术交流,以后应该会不断补充

测速工具:笔记本Acer aspire4535G,Windows7旗舰版,Code::Blocks

1.          今天(2012年4月29日 18:27:58)就先来一题:

题目来源:苏嵌作业“Training 1:整数算法训练”的第一题:

1. 题目:通过编程实现,统计1~n有多少个9
    提示:n通过参数传入

测试方法:为保持除核心函数外其他一致,在主函数中调用不同的代码,并将所需测试以外的代码进行注释。

由于手动输入会影响时间计算,此处的n在变量初始化确定下来,为使时间明显,取值一亿即100000000;

由于在Baidu上搜索“通过编程实现,统计1~n有多少个9”时,201204111通过编程实现,统计1~n有多少个9_邹亚_新浪博客 首当其冲排在第一位,其他类似的代码找起来好麻烦,就直接拿来实验了,除第二个函数中添加了% 10这几个字符、改善排版、将第二个函数名加了一个字符外,无其他修改之处。

用了邹亚的3个函数:

  1. int judge( int num );
  2. int count_nine(int input);
  3. int count_nine2(int n);//函数名原为count_nine

我的函数为:

  1. int count_nine_math2(int num);//是故意修改版+去注释版,看不懂不要怪我(前几天刚看了IOCCC的代码感觉挺有意思的)

源代码如下:

  1. #include <stdio.h>  
  2. #include <math.h>  
  3.   
  4. int judge( int num )  
  5. {  
  6.     int sum = 0;  
  7.     while(num != 0)  
  8.     {  
  9.         num = num / 10;  
  10.         sum++;  
  11.     }  
  12.     return sum;  
  13. }  
  14.   
  15. int count_nine(int input)  
  16. {  
  17.     int count=0;  
  18.     int amount=0;  
  19.     int k;  
  20.     int i = 1 ;  
  21.     for(i = 1 ; i <= input; i++)  
  22.     {  
  23.         int j = i;  
  24.         while(j >= 9)  
  25.         {  
  26.             k = judge(j);  
  27.             int a;  
  28.             if(k == 1 )  
  29.             {  
  30.                 a = 10;  
  31.             }  
  32.             else  
  33.             {  
  34.                 a = pow( 10 , k-1 );  
  35.             }  
  36.             int result;  
  37.             result = j / a ;  
  38.             if(result == 9 )  
  39.             {  
  40.                 count++;  
  41.             }  
  42.             j = j % a ;  
  43.             if (j == 9 )  
  44.             {  
  45.                 count++;  
  46.                 break;  
  47.             }  
  48.         }  
  49.     }  
  50.     return count;  
  51. }  
  52. int count_nine2(int n)  
  53. {  
  54.   
  55.     int i;  
  56.     int tmp;  
  57.     int count=0;  
  58.     for(i=0; i<=n; i++)  
  59.     {  
  60.         tmp=i;  
  61.         while(tmp !=0 )  
  62.         {  
  63.             if(tmp%10==9)  
  64.             {  
  65.                 count++;  
  66.             }  
  67.             tmp=tmp/10;  
  68.         }  
  69.     }  
  70.     return count;  
  71. }  
  72. int count_nine_math2(int num)  
  73. {  
  74.     int sum = 0;  
  75.     int pos = 0;  
  76.     int temp = num;  
  77.     int ten = 1;  
  78.     int pre_9 = 0;  
  79.     while(temp)  
  80.     {  
  81.         (temp % 10) == 9 && pre_9++;  
  82.         sum += (temp % 10) * pos++ * ten / 10;  
  83.         ten *= 10;  
  84.         temp /= 10;  
  85.     }  
  86.     while(pre_9)  
  87.     {  
  88.         ten /= 10;  
  89.         (num / ten % 10) == 9 && (sum += num % ten + 1) && pre_9--;  
  90.     }  
  91.     return sum;  
  92. }  
  93. int main()  
  94. {  
  95.     int num;  
  96.     printf("please input n:");  
  97. //    scanf("%d",&num);  
  98.     num=100000000;  
  99.     printf("%d nine from 1 to%d\n",count_nine(num),num);  
  100. //    printf("%d nine from 1 to%d\n",count_nine2(num),num);  
  101. //    printf("%d nine from 1 to%d\n",count_nine_math2(num),num);  
  102.     return 0;  
  103. }  
测试结果:
  1. int count_nine(int input);

  2. int count_nine2(int n);//函数名原为count_nine

  3. int count_nine_math2(int num);

输出结果的排版有些不太好啊,网速这么差不想改了,看程序应该能明白上面各个数字的含义吧。

178.290 / 24.462 = 7.235208181154127100073046018992

24.462 / 0.026 = 940.84615384615384615384615384615

相信我那个程序还有不少可以改进的地方。

在本文落笔后才发现好像还有排列组合的办法,(我那个是基于分组的方法,这两者之间有不少类似之处),算式应该还能再简化不少。

各位才华横溢,学富五车,才高八斗,天降奇才的同学们肯定也能给出更加好的算法,快点拿出来大家交流交流吧。

(如果有其它想交流的题目也可以在下面贴出来。)


本文除引用代码外纯属原创,如需转载请标明本文地址http://blog.csdn.net/htianlong/article/details/7522676

并征求以下博主的同意: 201204111通过编程实现,统计1~n有多少个9_邹亚_新浪博客
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值