📏

下X桁が同じかどうかを判定するのに、余りを活用する

2022/03/02に公開

2つの整数の下X桁を比較するのに、余りが使えるということを知ったので、まとめてみた。

想定されるケース

  • 与えられるのは: 整数 n, a, b
  • 知りたいのは: a と b の下n桁が同じかどうか

// e.g.1
Input:  4, 1452345, 1234853
Output: false

// e.g.2
Input:  3, 12345, 34345
Output: true

方針1: 余りを活用する

例えば、e.g.2のように知りたいのが下3桁の場合、1000で割った余りが同じであればよい。
このからくりは、a, bの2つの整数を分解してみれば一目瞭然。

12345 = 12 x 1000 + 345
34345 = 34 x 1000 + 345

このように、異なるのは1000を何回かけるかのみ。最後に足す数(=下3桁)は両方とも同じ。この仕組を使ったコードは、以下のようになる。


public static void main(String[] args) {  

	System.out.println(isSameLastDigit(3, 12345, 23345));  		 // true
	System.out.println(isSameLastDigit(6, 12312345, 12323355));  // false
}

static boolean isSameLastDigit(int digit, int a, int b){  

	boolean result = false;  
	double divisor = Math.pow(10, digit);  
	
	if(a%divisor == b%divisor)
		result = true;  
	
	return result;  

}

方針2: 文字列に変換して調べる~無知だった私による~

この余りの方法を知らない私が、最初に書いたコードも公開しておく。これでもできるが、文字列に変換して、一部を切り取り、比較するという工程を踏んでいるため、無駄な処理時間がかかっているのだと思う。

public static void main(String[] args) {  

	System.out.println(isSameLastDigit(3, 12345, 23345));  		 // true
	System.out.println(isSameLastDigit(6, 12312345, 12323355));  // false
}

static boolean isSameLastDigit(int digit, int target, int num){ 
	
	boolean result = false;  
	String targetStr = String.valueOf(target);  
	String numStr = String.valueOf(num);  
	String targetStrPart = targetStr.substring(digit);  
	String numStrPart = numStr.substring(digit);  

	if(targetStrPart.equals(numStrPart)){  
		result = true;  
	}
	
	return result;  
}

Discussion