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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Unity3D游戏引擎最详尽基础教程

    Unity3D游戏引擎最详尽基础教程转自:http://blog.sina.com.cn/s/blog_7c336a8301013son.html我一直向所有想做游戏的朋友推荐Unity3D,为什么呢?首先是因为专业,Unity3D非常强大,用它创建一个类似MiniGore这样的3D平面射击游戏简直轻而易举,而就连使命召唤这样的大型3d游戏,如果素材得当也不在话下。二是因为易用,他的操作非常容易,而使用的脚本语言又是JavaSc

    2022年4月30日
    92
  • [紧急通告]关于蓝色理想经典论坛无法访问的声明

    [紧急通告]关于蓝色理想经典论坛无法访问的声明亲爱的蓝色理想网站及经典论坛的会员朋友们,我们在这里非常遗憾地通知大家,在未来的一段时间里,我们将不能保证经典论坛的正常访问,由于来自外部的不可抗力,论坛服务器所在的机房已对我们进行封网处理,原因是相

    2022年7月4日
    34
  • Java环境搭建(超详细)

    Java环境搭建(超详细)目录一 JDK 的下载与安装 1 JDK 下载 建议下载 1 8 版本 2 JDK 安装二 配置环境变量三 安装 IDE1 IDEA 安装地址 2 Eclipse 安装地址一 JDK 的下载与安装 1 JDK 下载 建议下载 1 8 版本链接 https www oracle com java technologies javase downloads html2 JDK 安装查看是否安装成功 win R 输入 cmd 进入控制台 输入 java version 查看版本 如下则安装成功二 配置环境变量右键点击此电脑 选

    2025年8月20日
    3
  • PKCS11接口解析「建议收藏」

    PKCS11接口解析「建议收藏」pkcs密码中间件位于上层应用和底层安全设备之间,应用基于PKCS#11标准接口开发各类应用程序。主要包括2个库主API库:提供给应用的PKCS11接口。 tokenDLL库:由主API库调用,完成从上向下到指定设备的套接。 安全密码设备:安全服务资源和实施的载体,完成具体安全功能支撑。表pkcs11函数接口 种类 函数 …

    2022年5月24日
    44
  • java批量修改数据库数据_sql批量更新多条数据

    java批量修改数据库数据_sql批量更新多条数据批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:代码如下:UPDATEmytableSETmyfield=’value’WHEREother_field=’other_value’;如果更新同一字段为同一个值,mysql也很简单,修改下where即可:代码如下:UPDATEmytableSETmyfield=’value’WHEREother_…

    2025年6月10日
    3
  • F分布的概率密度函数_F分布的统计量是

    F分布的概率密度函数_F分布的统计量是定义:设X1∼χ2(m),X2∼χ2(n)X_{1}\sim\chi^{2}(m),X_{2}\sim\chi^{2}(n)X1​∼χ2(m),X2​∼χ2(n),X1X_{1}X1​与X2X_{2}X2​相互独立,则称随机变量F=X1/mX2/nF=\frac{X_{1}/m}{X_{2}/n}F=X2​/nX1​/m​服从自由度为mmm及nnn的FFF分布,mmm称为第一自由度,n\boldsymbol{n}n称为第二自由

    2022年10月10日
    3

发表回复

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

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