WUSTOJ 1323: Repeat Number(Java)规律统计
题目链接:1323: Repeat Number
Description
Definition: a+b = c, if all the digits of c are same ( c is more than ten),then we call a and b are Repeat Number. My question is How many Repeat Numbers in [x,y].
定义:a + b = c,如果 c 的每一位数字相同(c > 10),那么我们就把 a 和 b 称为重复数,问题是在区间 [x, y] 中有多少对这样的 a,b 使得 c 满足上述条件。
Input
There are several test cases.
Each test cases contains two integers x, y(1<=x<=y<=1,000,000) described above.
Proceed to the end of file.
多组测试数据。
每组数据输入两个整数 x,y (1 <= x <= y <= 1000000)。
Output
For each test output the number of couple of Repeat Number in one line.
每组数据,输出有多少对满足条件的 a,b。
Sample Input
1 8
1 10
1 12
1 18
1 25
10 100
20 1000
30 10000
40 100000
50 1000000
Sample Output
3
5
7
15
29
213
2868
31461
320892
3220161
HINT
If a equals b, we can call a, b are Repeat Numbers too, and a is the Repeat Numbers for itself.
分析💬
下面二维数组表示 c 的值,且 c = a + b,数组 array[a][b] = c,下面只列出一部分。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 11 | ||||||||||||||||
2 | 11 | ||||||||||||||||
3 | 11 | ||||||||||||||||
4 | 11 | ||||||||||||||||
5 | 11 | 22 | |||||||||||||||
6 | 22 | ||||||||||||||||
7 | 22 | ||||||||||||||||
8 | 22 | ||||||||||||||||
9 | 22 | ||||||||||||||||
10 | 22 | ||||||||||||||||
11 | 22 | ||||||||||||||||
12 | |||||||||||||||||
13 | |||||||||||||||||
14 | |||||||||||||||||
15 | |||||||||||||||||
16 | 33 | ||||||||||||||||
17 |
给定的 x,y 就相当于在数组中取出一块正方形区域,统计其中的 c 的个数。比如给定 x = 10,y = 12,那么取出的区域如下所示:
10 | 11 | 12 | |
---|---|---|---|
10 | 22 | ||
11 | 22 | ||
12 |
因此结果为2。
由于数据较大,我们肯定不能按照二维数组逐位统计,那样很可能超时。
观察符合条件的 c ,会发现 c 的取值并不多。如数组 fc[6][9] 所示:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|---|
0 | 11 | 22 | 33 | 44 | 55 | 66 | 77 | 88 | 99 |
1 | 111 | 222 | 333 | 444 | 555 | 666 | 777 | 888 | 999 |
2 | 1111 | 2222 | 3333 | 4444 | 5555 | 6666 | 7777 | 8888 | 9999 |
3 | 11111 | 22222 | 33333 | 44444 | 55555 | 66666 | 77777 | 88888 | 99999 |
4 | 111111 | 222222 | 333333 | 444444 | 555555 | 666666 | 777777 | 888888 | 999999 |
5 | 1111111 |
y 取最大值 1000000 时,a + b 最大为 2000000 ,符合条件的 c 最大为 1111111 。上面的数组 fc[6][9] 由init()
方法得到。
代码
/**
* Time 306ms
* @author wowpH
* @version 2.2
* @date 2019年6月24日下午5:05:25
* Environment: Windows 10
* IDE Version: Eclipse 2019-3
* JDK Version: JDK1.8.0_112
*/
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {
private int[][] fc = new int[6][9];// 保存46个满足条件的c的取值
public Main() {
init();// 初始化
Scanner sc = new Scanner(new InputStreamReader(System.in));
while (sc.hasNext()) {
int x = sc.nextInt();
int y = sc.nextInt();
System.out.println(count(x, y));
}
sc.close();
}
private void init() {// 初始化数组fc
int d = 1;// 公差
for (int i = 0; i < 6; ++i) {
d = d * 10 + 1;// 位数增加
fc[i][0] = d;
for (int j = 1; j < 9; ++j) {
fc[i][j] = fc[i][j - 1] + d;
}
}
}
private int count(int minI, int maxI) {// 统计满足条件的取值个数
int ans = 0;
int minC = minI * 2;
int maxC = maxI * 2;
for (int i = 0; i < 6; ++i) {
for (int j = 0; j < 9; ++j) {
// 满足条件就统计取值个数
if (fc[i][j] >= minC && fc[i][j] <= maxC) {
int a = fc[i][j] / 2;// 一维下标
int b = fc[i][j] - a;// 二维下标
ans = ans + Math.min(a - minI, maxI - b) + 1;
}
}
}
return ans;
}
public static void main(String[] args) {
new Main();
}
}
版权声明
- 转载、参考、引用必须在首页添加如下文字:
[WUSTOJ 1323: Repeat Number(Java)规律统计——wowpH](https://blog.csdn.net/pfdvnah/article/details/93490424)
- 代码原创,公开引用不能删除首行注释(作者,版本号,时间等信息);
- 如果有疑问欢迎评论区留言,尽量解答;
- 如果有错误,还望大侠评论区指正。