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();
	}
}

版权声明

  1. 转载、参考、引用必须在首页添加如下文字:
    [WUSTOJ 1323: Repeat Number(Java)规律统计——wowpH](https://blog.csdn.net/pfdvnah/article/details/93490424)
  2. 代码原创,公开引用不能删除首行注释(作者,版本号,时间等信息);
  3. 如果有疑问欢迎评论区留言,尽量解答;
  4. 如果有错误,还望大侠评论区指正。

posted @ 2019-06-24 22:27  wowpH  阅读(256)  评论(0编辑  收藏  举报