The 3n+1 problem

    uva online上的第一个题:对一个正整数n(0<n<1000000),做如下处理: 若n=1,退出;若n为奇数,则使n=3n+1;若n为偶数,n=n/2。n从开始输入到变为1的过程中变化值的个数称为n的cycle length,如4的cycle length为3。                     INPUT:输入两个0到1000000之间的整数。                                                                                                           OUTPUT:输出这两个数以及这两个数(包括这两个数)之间的所有数的cycle length的最大值。

#include<iostream>
#include<malloc.h>
using namespace std;
int array[1000000];
char ch;
int main()
{
 long int i,j,ii,jj,k;
 unsigned long   n;
 int max,temp;
 int count;
 array[1]=1;array[2]=2;
 for(k=3;k<1000000;k++)
 {
   n=k;
   count=0;
   while(n!=1) 
   { 
	if(n<k)  {count+=array[n];break;} 
	if (n%2)  {n=3*n+1;count++;}
      else {n=n>>1;count++;}
   }
   array[k]=count;
 }
 while(cin>>i&&i!=EOF)
 {
 cin>>j;
 ii=i,jj=j;
 if(i>j)
 {
   temp=i;
   i=j;
   j=temp;
 }
 max=0;
 for(;i<=j;i++)
 {
 if (max<array[i])   max=array[i];
 }
 cout<<ii<<" "<<jj<<" "<<max<<endl;
 }
 return 0;
}

    这个问题其实很简单,我一开始的做法是对输入的两个数i,j(假设i<j),作从i到j的循环,依次求i,j之间每个数的cycle length,保存其中的最大值,最后输出最大值。但提交上去,返回的信息是运行时间超出了time limmit。后来在网上找到的一种方法,先定义一个大小为1000000的数组array,用来保存每个数的cycle length,然后从1开始求每个数的cycle length,在求后面的数的cycle length的时候,可以利用前面已经求出的cycle length值,从而有效减少了运行时间。最后在输入的两个数之间找到cycle length的最大值。这种方法就是我们平时所说的“用空间换取时间”吧!

转载于:https://my.oschina.net/u/585691/blog/65392

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值