uva题目做题记录

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型数据。

    

 

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值