本文章主要用于技术交流,以后应该会不断补充
测速工具:笔记本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个函数:
- int judge( int num );
- int count_nine(int input);
- int count_nine2(int n);//函数名原为count_nine
我的函数为:
- int count_nine_math2(int num);//是故意修改版+去注释版,看不懂不要怪我(前几天刚看了IOCCC的代码感觉挺有意思的)
源代码如下:
- #include <stdio.h>
- #include <math.h>
- int judge( int num )
- {
- int sum = 0;
- while(num != 0)
- {
- num = num / 10;
- sum++;
- }
- return sum;
- }
- int count_nine(int input)
- {
- int count=0;
- int amount=0;
- int k;
- int i = 1 ;
- for(i = 1 ; i <= input; i++)
- {
- int j = i;
- while(j >= 9)
- {
- k = judge(j);
- int a;
- if(k == 1 )
- {
- a = 10;
- }
- else
- {
- a = pow( 10 , k-1 );
- }
- int result;
- result = j / a ;
- if(result == 9 )
- {
- count++;
- }
- j = j % a ;
- if (j == 9 )
- {
- count++;
- break;
- }
- }
- }
- return count;
- }
- int count_nine2(int n)
- {
- int i;
- int tmp;
- int count=0;
- for(i=0; i<=n; i++)
- {
- tmp=i;
- while(tmp !=0 )
- {
- if(tmp%10==9)
- {
- count++;
- }
- tmp=tmp/10;
- }
- }
- return count;
- }
- int count_nine_math2(int num)
- {
- int sum = 0;
- int pos = 0;
- int temp = num;
- int ten = 1;
- int pre_9 = 0;
- while(temp)
- {
- (temp % 10) == 9 && pre_9++;
- sum += (temp % 10) * pos++ * ten / 10;
- ten *= 10;
- temp /= 10;
- }
- while(pre_9)
- {
- ten /= 10;
- (num / ten % 10) == 9 && (sum += num % ten + 1) && pre_9--;
- }
- return sum;
- }
- int main()
- {
- int num;
- printf("please input n:");
- // scanf("%d",&num);
- num=100000000;
- printf("%d nine from 1 to%d\n",count_nine(num),num);
- // printf("%d nine from 1 to%d\n",count_nine2(num),num);
- // printf("%d nine from 1 to%d\n",count_nine_math2(num),num);
- return 0;
- }
- int count_nine(int input);
- int count_nine2(int n);//函数名原为count_nine
- 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_邹亚_新浪博客