uva100:3n+1
http://acm.uva.es/p/v1/100.html
一般的思路都是不开数组直接计算,即先设一个最大值max,每次循环时将每个数的步数和max进行比较,如果max小于该数,交换2数,否则继续循环,直至循环结束。此时花费时间较多,每次输入都要重新计算。
若能将每次循环的结果都保存在数组里,则能节省大量时间,故先生成数组。还有,每次输入时,都会有许多重复计算。如输入3和6:
数字 | 计算次数 |
3->10->5->16->8->4->2->1 | 7 |
4->2->1 | 2 |
5->16->8->4->2->1 | 5 |
6->3->10->5->16->8->4->2->1 | 8 |
我们发现6的计算实际上已包括了3,4,5的计算,即3,4,5重复计算了。如果能将重复计算的时间也省去,则程序效率又能提高。
当然,如果还要优化的话,还是可以优化的,可以将除2运算转为位运算。同时注意到当t为奇数时,乘上3再加1会变成偶数,偶数要除以2,这时可以将2步合成一步,即:t+=(t>>1)+1。
代码如下:
该代码运行时间为0.044s。
本题需要注意的有2点:
(1) 未告诉i和j 的大小,所以输入后要么另设2个新变量,要么输入i和j的值后马上输出。
(2 ) 本题要计算到1000000,当用int型数据时会越界,故用unsigned int 或long int型数据。