L2-029 特立独行的幸福 - java

题目解析

能通过迭代得到1的数 为 幸福数
区间内不会被其他数迭代到的数 为 特立独行的幸福数

有则输出区间内所有特立独行的幸福数和它的独立性
没有则输出SAD

解题思路

暴力去枚举每个数是否为幸福数 也就是是否会出现除了1的循环
然后枚举过程中 将每次迭代后的数 给标记为非独立数

然后输出即可 别忘了 素数的幸福数的独立性要 * 2

可以提供一个我错的 第4个样例 50 100 可以把我的给判出来错误

提供一个清晰点的样例1解释

幸福数 每次迭代结果 迭代次数 素数 独立性
10 1 1 false 1
13 10 1 2 true 4
19 82 68 100 1 4 true 8
23 13 10 1 3 true 6
28 68 100 1 3 false 3
31 10 1 2 true 4
32 13 10 1 3 false 3

如上表 10 和 13 都有被其他数所迭代 所以 10 13不是特立独行的幸福数

代码

import java.io.*;
import java.math.*;
import java.util.*;

public class Main
{
	static int N = (int) 1e4;
	static int shu[] = new int[N + 10];
	static boolean vis[] = new boolean[N + 10];

	static int sum(int x)
	{
		int ans = 0;
		for (int i = x; i > 0; i /= 10)
		{
			int a = i % 10;
			ans += a * a;
		}
		return ans;
	}

	static boolean to(int x)
	{
		TreeSet<Integer> tr = new TreeSet<Integer>();

		int t = x;
		while (t != 1)
		{
			tr.add(t);
			t = sum(t);
			shu[x]++;
			vis[t] = true;
			if (tr.contains(t))
				return false;
		}
		return true;
	}

	static boolean isprime(int x)
	{
		for (int i = 2; i <= x / i; i++)
		{
			if (x % i == 0)
				return false;
		}
		return true;
	}

	public static void main(String[] args)
	{
		int l = sc.nextInt();
		int r = sc.nextInt();

		ArrayList<Integer> ar = new ArrayList<Integer>();
		for (int i = l; i <= r; i++)
		{
			if (to(i))
				ar.add(i);
		}

		for (int i : ar)
		{
			if (!vis[i])
			{
				int x = shu[i];
				if (isprime(i))
					x *= 2;
				out.println(i + " " + x);
			}
		}
		if (ar.size() == 0)
			out.println("SAD");

		out.flush();
		out.close();
	}

	static Scanner sc = new Scanner(System.in);
	static PrintWriter out = new PrintWriter(System.out);
}


TreeSet


团体程序设计天梯赛-练习集-java

赞赏