uva题目做题记录

来源:互联网 发布:airbnb淘宝上的优惠券 编辑:程序博客网 时间:2024/05/21 17:35

uva100:3n+1

http://acm.uva.es/p/v1/100.html 

    一般的思路都是不开数组直接计算,即先设一个最大值max,每次循环时将每个数的步数和max进行比较,如果max小于该数,交换2数,否则继续循环,直至循环结束。此时花费时间较多,每次输入都要重新计算。

      

 

    若能将每次循环的结果都保存在数组里,则能节省大量时间,故先生成数组。还有,每次输入时,都会有许多重复计算。如输入36

数字

计算次数

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的计算实际上已包括了345的计算,即345重复计算了。如果能将重复计算的时间也省去,则程序效率又能提高。

    当然,如果还要优化的话,还是可以优化的,可以将除2运算转为位运算。同时注意到当t为奇数时,乘上3再加1会变成偶数,偶数要除以2,这时可以将2步合成一步,即:t+=(t>>1)+1

 

代码如下:

 

 

该代码运行时间为0.044s。

 

本题需要注意的有2点:

1 未告诉ij 的大小,所以输入后要么另设2个新变量,要么输入ij的值后马上输出。

  (2 )  本题要计算到1000000,当用int型数据时会越界,故用unsigned int long int型数据。