以下是UVA 100题的解析与答案
(所谓解析,就是能让别人不看代码也能想出代码的样子。所谓答案,就是即使不执行程序,也能看出正确的结果)
100 - The 3n + 1 problem
解析:这题对于初学者来说是比较难的,对于有一定经验的Acmer来说更难。
前者因为这题需要考虑两个关键点:i,j的大小顺序和变量合理初始化。
后者因为这题需要考虑是否会超时,很难实现题目要求的范围。
(本人电脑上运行不起,绝对超时,在UVA上只用了0.4秒~~~~)
1 #include <iostream> //UVAOJ没有iostream.h文件 2 #include <string> 3 using namespace std; 4 int main() //标准格式 5 { 6 //真正好的编程风格,是能让看到的人相信这个程序是完美至极的。 7 int i,j; 8 while(cin>>i>>j){ //等同于while(scanf("%d %d",&i,&j)!=EOF) 9 int n,m,max=0; 10 i<j?(n=i,m=j):(n=j,m=i); 11 m/2>n?(n=m/2):0; //简单剪枝 12 int x,y; 13 for(x=n;x<=m;x++){ 14 y=x; 15 int tmp=1; 16 while(y!=1){ 17 if(y%2) //省略了一次运算 18 y=y*3+1; 19 else 20 y=y>>1; //高效运算 21 tmp++; 22 } 23 if(tmp>max) 24 max=tmp; 25 } 26 cout<<i<<' '<<j<<' '<<max<<endl; 27 } 28 return 0; 29 }
注意,本文没有结束!
C++是C语言的超集,虽然我只学了2个小时的C++,学会了几个单词,对象和类的概念,还有怎么在VC6.0上运行程序。
好像某些职校在大一就安排C++课程,好像很少有人能够用C++AC这题吧。
这是ACM的强大力量,如果把编程分为两类的话,一类是软件开放,它是真正能赚钱的行业,但是现在我们都做不到。另一类是ACM题,以简约的形式考察编程能力,却需要不输于开放大型软件能力,如果仅仅把ACM看成是对算法的提升,那就太浪费了!
ACM对Acmer有以下作用:
培养团队协作能力;
培养吃苦耐劳的意志;
培养学习能力;
提升英语水平;
提升专业英语水平;
提升思维能力与敏锐的判断力;
提升编程水准、编程素养、算法能力;
提升调试代码、测试代码、程序分析的能力;
提升撰写文档的能力,比如我现在做的;
提升阅读代码的能力,比如你刚才做到;
综上所述,ACM除了对你如何记忆马克斯主义没有作用外,都对你有极大的提升。
必然,一个获奖的Acmer——一个充分得到提升的Acmer,会得到谷歌、百度等公司的应聘!