UVa – The 3n + 1 problem 解读

UVa – The 3n + 1 problem 解读

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

这个问题并计算质数了一下相间隔似的。思想上一致。

注意问题:

1 i 可能 大于或等于j — 这里上传。小心阅读题意,我没有说这个地方不能保证。需要特殊处理

2 计算过程中可能溢出,的整数大于最大值,需要使用long long

关于效率和时间问题:

1 能够使用数组保存中间结果,这样执行快了。内存消耗大了,

2 能够不使用中间数组。 这样执行肯定比較慢了。可是内存消耗小,一样能够AC的。

全部没有个标准吧。看情况而定。假设须要速度就添加数组,假设省内存就不使用数组吧。

这样的题目一般都使用数组吧。

我这里使用数组。

參考博客:http://tausiq.wordpress.com/2008/12/09/uva-100-the-3n-1-problem/

题目例如以下:

Background

Problems in Computer Science are often classified as belonging to a certain class of problems (e.g., NP, Unsolvable, Recursive). In this problem you will be analyzing a property of an algorithm whose classification is not known for all possible inputs.

The Problem

Consider the following algorithm:

 
		1. 		 input n

2. print n

3. if n = 1 then STOP

4. if n is odd then tex2html_wrap_inline44

5. else tex2html_wrap_inline46

6. GOTO 2

Given the input 22, the following sequence of numbers will be printed 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

It is conjectured that the algorithm above will terminate (when a 1 is printed) for any integral input value. Despite the simplicity of the algorithm, it is unknown whether this conjecture is true. It has been verified, however, for all integers n such that 0 < n < 1,000,000 (and, in fact, for many more numbers than this.)

Given an input n, it is possible to determine the number of numbers printed (including the 1). For a given n this is called the cycle-length of n. In the example above, the cycle length of 22 is 16.

For any two numbers i and j you are to determine the maximum cycle length over all numbers between i and j.

The Input

The input will consist of a series of pairs of integers i and j, one pair of integers per line. All integers will be less than 1,000,000 and greater than 0.

You should process all pairs of integers and for each pair determine the maximum cycle length over all integers between and including i and j.

You can assume that no operation overflows a 32-bit integer.

The Output

For each pair of input integers i and j you should output i, j, and the maximum cycle length for integers between and including i and j. These three numbers should be separated by at least one space with all three numbers on one line and with one line of output for each line of input. The integers i and j must appear in the output in the same order in which they appeared in the input and should be followed by the maximum cycle length (on the same line).

Sample Input

1 10
100 200
201 210
900 1000

Sample Output

1 10 20
100 200 125
201 210 89
900 1000 174

注意好上述问题之后就比較好AC了。

我以下程序是写了个类,分开多个函数,能够看的逻辑十分清晰的。当然/2和*2能够改动成>>1和<<1操作。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <stdio.h>

using namespace std;

static int table[1000000] = {0};//={-1}不正常工作。仅仅能清零

class ThreeNOne
{
public:
	const static int MAX_N = 1000000;
	ThreeNOne()
	{
		table[1] = 1;
		for (int i = 2; i < 1000000; i*=2)
		{
			table[i] = table[i/2] + 1;
		}
		initTbl(table);
	}

	int checkTbl(int tbl[], long long i)//i一定要为longlong,int会溢出
	{
		if (i < MAX_N && 0 != tbl[i]) return tbl[i];
		if (i % 2)
		{
			if (i < MAX_N) tbl[i] = checkTbl(tbl, i * 3 + 1) + 1;
			else return checkTbl(tbl, i * 3 + 1) + 1;
		}
		else 
		{
			if (i < MAX_N) tbl[i] = checkTbl(tbl, i / 2) + 1;
			else return checkTbl(tbl, i / 2) + 1;
		}
		return tbl[i];
	}

	void initTbl(int tbl[])
	{
		for (int i = 3; i < 1000000; i++)
		{
			checkTbl(tbl, i);
		}
	}

	void The3n1problem()
	{
		int i = 0, j = 0;
		while (cin>>i>>j)
		{
			pair<int, int> t = minmax(i, j);//区间给定不一定是i<=j的,细致审题
			int ans = 0;
			for (long long d = t.first; d <= t.second; d++)
			{
				ans = max(ans, table[d]);
				//错误:ans += table[d];细致读题,不是和。而是maximum
			}
			cout<<i<<' '<<j<<' '<<ans<<endl;
		}
	}
};

int main()
{
	ThreeNOne tno;
	tno.The3n1problem();
	return 0;
}

版权声明:笔者心脏靖。景空间地址:http://blog.csdn.net/kenden23/。可能不会在未经作者同意转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117377.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • candence的图纸大小设置_标准制图图纸尺寸大小

    candence的图纸大小设置_标准制图图纸尺寸大小标准制图图纸尺寸大小[b]图纸尺寸大小[/b]A0:1189毫米*841毫米A1:841毫米*594毫米A2:594毫米*420毫米A3:420毫米*297毫米A4:297毫米*210毫米A5:210毫米*148毫米纸张幅面规格纸张的规格是指纸张制成后,经过修整切边,裁成一定的尺寸。过去是以多少”开”(例如8开或16开等)来表示纸张的大小,现在我采用国际标准,规定以A0、A1、A2、B1、B2…..

    2022年6月20日
    47
  • 解读滑块验证码(滑动验证码)与图形验证码的破解难度

    解读滑块验证码(滑动验证码)与图形验证码的破解难度

    2021年6月7日
    126
  • 双非本科22届暑期实习,成功拿到B站、阿里实习offer[通俗易懂]

    双非本科22届暑期实习,成功拿到B站、阿里实习offer[通俗易懂]拼一把不一定成功,但是不试试看肯定没有结果!1.前言想写这篇文章很久了,也有粉丝留言、私信问我打卡系列怎么断更了这么多天(狗头保命),首先给大家解释一下最近为什么“失踪了”?由于近两周要入职,找租房,整理微信公众号,所以没多少时间写博客,今天难得闲下来,做一篇近期总结给大家。关于交流群:有粉丝私信,建议创建一个学习群,大家互相分享校招经验,学习心得(我因为怕管理群太麻烦,而一拖再拖,不过也好歹建群了),大家可以通过我的博客首页关注一波公众号:兴趣使然的草帽路飞去获取交流群和内推群群.

    2022年5月21日
    48
  • loadrunner压力测试学习笔记

    loadrunner压力测试学习笔记loadrunner学习过程以下仅记录自己的学习过程,有不对之处欢迎指出。压力测试步骤:1.分析需求2.准备脚本3.调试脚本2.准备脚本:可以录制也可以自己写,录制的话先按需求分好每一个action,录制时先切换到当前action,再进行录制。例如:创建一个新的脚本,在action里添加新的action,open_index,submit_login,sign_off(loadrunner自带案例的登录过程)3.调试脚本:(1)回放:脚本准备好后进行回放,需要参数的提前准备好参数,比如注册

    2022年7月18日
    13
  • pycharm mac 激活码【2022.01最新】2022.03.12

    (pycharm mac 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1M2OME2TZY-eyJsaWNlbnNlSWQi…

    2022年3月13日
    211

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号