HDU 1032(3n+1问题)

本文介绍了一个关于3x+1猜想的高效算法实现方案,通过使用long long类型来处理大整数运算,并预先计算每个数的对应函数值以避免重复计算,从而显著提高了算法效率。
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#define MAXN 1000000+10
using namespace std;

/*
关键 : 
①运算中间数过大用long long; 
②可以先把所有数的对应函数值求出来(构造结果表)再让用户输入; 
③由于创建表时是从小到大一个个数创建的, 因此比i小的元素的环数一定已经计算过了, 可以直接加上去(不走已走过的路径, 优化) 
④看清题目对输入输出数字的顺序要求,  若需要则交换

*/

long long cnts[MAXN];
long long maxcnt;

int main(){
	int i,j;
    long long x,cnt;
    cnts[1] = 1;
    for(long long i=2; i<MAXN; i++){
    	cnt = 0;
    	x = i;
    	while( 1 ){
			cnt++;
			if( x&1 ){
				x = (3*x+1);
			}else{
				x = x/2;
			}
			if( x<i ){
				cnt += cnts[x];
				break;
			}
		}
		cnts[i] = cnt;
    }
	while( ~scanf("%d %d",&i,&j) ){
    	maxcnt = 0;
    	int a = i, b = j; 
    	if( i>j ) swap(i,j);
    	for( int k=i; k<=j; k++){
    		maxcnt = max(cnts[k], maxcnt);
    	}
	   	printf("%d %d %I64d\n",a,b,maxcnt);
    }
    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值