ACM训练题 3n+1问题

问题描述]*考虑如下的序列生成算法:

从整数 n 开始,如果 n 是偶数,把它除以 2;如果 n 是奇数,把它乘 3 加1。用新得到的值重复上述步骤,直到 n = 1 时停止。

例如,n = 22 时该算法生成的序列是:*22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1 *

人们猜想(没有得到证明)对于任意整数 n,该算法总能终止于 n = 1。这个猜想对于至少 1 000 000 内的整数都是正确的。对于给定的 n,该序列的元素(包括 1)个数被称为 n 的循环节长度。

在上述例子中,22 的循环节长度为 16。*输入两个数 i 和 j,你的任务是计算 i 到 j(包含 i 和 j)之间的整数中, *循环节长度的最大值。

输入*输入每行包含两个整数 i 和 j。所有整数大于 0,小于 1 000 000。

输出*对于每对整数 i 和 j,按原来的顺序输出 i 和 j,然后输出二者之间的整数中的最大循环节长度。 *这三个整数应该用单个空格隔开,且在同一行输出。 *对于读入的每一组数据,在输出中应位于单独的一行。 *

[样例输入]

1 10

100 200

201 210

900 1000

[样例输出]

1 10 20

100 200 125

201 210 89

900 1000 174

一开始总是没有明白这个i——j到底是干什么的,后来读了两片之后才明白。原来是让我比较i到j之间循环节长度的最大值的。这个程序呢,是用java写的,用c语言稍微改改就可以了。由于懒性让我不想改。
package com.imooc.bean;

import java.util.Scanner;

public class ThreeN {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] as = new int[8];
for (int i = 0; i < as.length; i++) {
as[i] = sc.nextInt();
}
System.out.println(“输出结果:”);
for (int j = 0; j < as.length; j = j + 2) {
int max = 1;
for (int i = as[j]; i <= as[j + 1]; i++) {
int c = test(i);
if (max <= c) {
max = c;
}
}
System.out.println(as[j] + " " + as[j + 1] + " " + max);
}
}

public static int test(int a) {
	int b = 1;
	while (true) {
		if (a % 2 == 0) {
			a = a / 2;
		} else if (a % 2 == 1) {
			a = a * 3 + 1;
		}
		b++;
		if (a == 1) {
			return b;
		}

	}
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风扶杨柳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值