代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
题目描述:
从任一给定的正整数
n
n
n 出发,将其每一位数字相乘,记得到的乘积为
n
1
n_{1}
n1 。以此类推,令
n
i
+
1
n_{i+1}
ni+1 为
n
i
n_{i}
ni 的各位数字的乘积,直到最后得到一个个位数
n
m
n_{m}
nm ,则
m
m
m 就称为
n
n
n 的持续性。例如
679
679
679 的持续性就是
5
5
5,因为我们从
679
679
679 开始,得到
6
×
7
×
9
=
378
6×7×9=378
6×7×9=378,随后得到
3
×
7
×
8
=
168
3×7×8=168
3×7×8=168、
1
×
6
×
8
=
48
1×6×8=48
1×6×8=48、
4
×
8
=
32
4×8=32
4×8=32,最后得到
3
×
2
=
6
3×2=6
3×2=6,一共用了
5
5
5 步。
本题就请你编写程序,找出任一给定区间内持续性最长的整数。
输入格式:
输入在一行中给出两个正整数 a 和 b(
1
≤
a
≤
b
≤
1
0
9
1 \leq a \leq b \leq 10^{9}
1≤a≤b≤109 且
(
b
−
a
)
<
10
(b − a) < 10
(b−a)<10),为给定区间的两个端点。
输出格式:
首先在第一行输出区间
[
a
,
b
]
[a, b]
[a,b] 内整数最长的持续性。随后在第二行中输出持续性最长的整数。如果这样的整数不唯一,则按照递增序输出,数字间以
1
1
1 个空格分隔,行首尾不得有多余空格。
输入样例:
500 700
输出样例:
5
679 688 697
找到最长的持续性,并且找到最长持续性的所有数
emmmmmmm
按照题目意思
首先将这个数拆分成各位之积,直到各位之积为个位数。
统计操作的步数。
然后统计最大的步数,输出最大步数的所有数。
import java.io.*;
import java.util.*;
public class Main
{
// 将x拆分位各位之积
static int fen(int x)
{
int ans = 1;
while (x > 0)
{
ans *= x % 10;
x /= 10;
}
return ans;
}
// 获取x到一个个位需要几步
static int get(int x)
{
int cnt = 0;
while (x >= 10)
{
x = fen(x);
cnt++;
}
return cnt;
}
public static void main(String[] args)
{
int a = sc.nextInt();
int b = sc.nextInt();
int max = 0; // 统计最大值
ArrayList<Integer> ar = new ArrayList<Integer>();
for (int i = a; i <= b; i++)
{
int j = get(i);
// 如果比最大值大
if (j > max)
{
// 替换持续性
max = j;
ar = new ArrayList<Integer>();
}
// 如果小于最大值,则不添加这个数
else if (j < max)
continue;
// 添加当前这个数
ar.add(i);
}
out.println(max);
for (int i = 0; i < ar.size(); i++)
{
if (i != 0)
out.print(" ");
out.print(ar.get(i));
}
out.flush();
out.close();
}
static Scanner sc = new Scanner(System.in);
static PrintWriter out = new PrintWriter(System.out);
}
如果有说错的 或者 不懂的 尽管提 嘻嘻
一起进步!!!