覆蓋數字

/**
 * 覆蓋數字
 * 
 * 給定整數區間[a,b]和整數區間[x,y],你可以使用任意多次a,b之間的整數做加法,可以湊出多少個[x,y]區間內的整數? 輸入
 * a,b,x,y,其中1<= a < b <= 1000000000, 1 <= x < y <= 1000000000。 輸出:
 * 用[a,b]內的整數做任意多次加法,可以得到多少個[x,y]內的整數。 例如a = 8, b = 10, x = 3 , y = 20 我們可以得到
 * [3..20]之間的整數 8, 9, 10, 16 ( 8 + 8), 17(8 + 9), 18(9 + 9), 19(9 + 10), 20(10 +
 * 10),因此輸出8。 問:2+3=5 1+4=5 這算1個還是2個? 答:算1次 問你能覆蓋多少個不同的數字 [x,y]全覆蓋住得話 就是y - x +
 * 1。
 * 
 * @author zoyation
 * 
 */
public class OverWriteNumber {
	public static int howmany(int a, int b, int x, int y) {
		/*
		 * Scanner sc = new Scanner(System.in); 獲取輸入abcd輸入,1<= a < b <=
		 * 1000000000,1 <= x < y <= 1000000000 while (a <= 0 || a >= 999999999
		 * || b <= a || b >= 1000000000 || x <= 0 || x >= 999999999 || y <= x ||
		 * y >= 1000000000) { if (a <= 0 || a >= 999999999) {
		 * System.out.print("請輸入a的值([1,999999999]):"); a = sc.nextInt(); if (a
		 * <= 0 || a >= 999999999) {
		 * System.out.println("a的值不在區間[1,999999999]內,請重新輸入!"); } } else if (b <=
		 * a || b >= 1000000000) { System.out.print("請輸入b的值([a+1=" + (a + 1) +
		 * ",999999999]):"); b = sc.nextInt();
		 * 
		 * if (b <= a || b >= 1000000000) { System.out.println("b的值不在區間[a+1=" +
		 * (a + 1)+ ",999999999]內,請重新輸入!"); } } else if (x <= 0 || x >=
		 * 999999999) { System.out.print("請輸入x的值([1,999999999]):"); x =
		 * sc.nextInt();
		 * 
		 * if (x <= 0 || x >= 999999999) {
		 * System.out.println("x的值不在區間[1,999999999]內,請重新輸入!"); } } else if (y <=
		 * x || y >= 1000000000) { System.out.print("請輸入y的值([x+1=" + (x + 1) +
		 * ",999999999]):"); y = sc.nextInt();
		 * 
		 * if (y <= x || y >= 1000000000) { System.out.println("y的值不在區間[x+1=" +
		 * (x + 1)+ ",999999999]內,請重新輸入!"); } } } System.out.println("a=" + a +
		 * ",b=" + b + ",x=" + x + ",y=" + y);
		 */
		/* count 記錄能覆蓋多少個不同的數字 */
		int count = 0;
		if (a > y) {
			count = 0;
		} else if (a == y) {
			count = 1;
		} else {
			int i = a >= x ? a : x;// 記錄遍歷起始[x,y]值

			if (b >= y) {
				/* b比y大,直接計算 */
				count = y - i + 1;
			} else {
				int k = 0;/* 記錄開始在區間[x,y]通過循環計算統計的最小數 */
				if (b < x) { /* a<b<x */
					count = 0;
					k = x;
				} else {
					count = b - i + 1;
					k = b + 1;
				}
				/* 下面遍歷統計覆蓋數字 */
				int t1 = a;
				int t2 = b;
				do {
					int m1 = k % t1;
					if (m1 >= a || m1 == 0) {
						/*當前統計數和t1求餘,如果爲0或者不比a小,在區間[a,t1)內,k=t1*n+m1(n=k/t1)*/
						count++;
						// System.out.println("m1="+m1+",t1="+t1+",k="+k);
						t1 = a;
						t2 = b;
						k++;
					} else {
						int m2 = k % t2;

						if (m2 >= a || m2 == 0) {
							/*當前統計數和t1求餘,如果爲0或者不比a小,在區間[a,t2)內,k=t2*n+m2 (n=k/t2)*/
							count++;
							// System.out.println("m2="+m2+",t2="+t2+",k="+k);
							t1 = a;
							t2 = b;
							k++;
						} else {
							t1++;
							t2--;
							/* t1大於t2時,[a,b]區間值都取過了,重新開始下一個數的驗證 */
							if (t1 > t2) {
								t1 = a;
								t2 = b;
								k++;
							}
						}
					}

				} while (k <= y);
			}
		}

		return count;
	}

	public static void main(String args[]) {
		System.out.println(howmany(51, 52, 50, 999999999));// 57315234
	}
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章