最大公约数
求最大公约数
两个int型数字,求出他们的最大公约数。
欧几里得算法 反转相除法
public int gcd(int a, int b) {
if (a < b) {
int temp = a;
a = b;
b = temp;
}
return a % b == 0 ? b : gcd(b, a % b);
}
只要可以保证 gcd(b, a % b)而不是gcd(a % b, b),因为60%33=27,33%60=33,所以优化后得:
public int gcd(int a, int b) {
return a % b == 0 ? b : gcd(b, a % b);
}
字符串最大公因子
- 如果str1 + str2 != str2 + str1,那么说明他们没有最大公因子,因为如果存在最大公因子a,str1和str2就都是拼接多个a字符串组成,顺序变动不会导致值不同。
- 求两个字符串的长度的最大公因子b,b就是a的长度。
public String gcdOfStrings(String str1, String str2) {
if(!(str1 + str2).equals( str2 + str1)){
return "";
}
int gcdNum = gcd(str1.length(), str2.length());
return str1.substring(0, gcdNum);
}
private int gcd(int a, int b) {
return a % b == 0 ? b : gcd(b, a % b);
}
比较直观的方法
- 如果str1 + str2 != str2 + str1,那么说明他们没有最大公因子,因为如果存在最大公因子a,str1和str2就都是拼接多个a字符串组成,顺序变动不会导致值不同。
- 遍历较短字符串,取前n个字符进行比较,是否同时满足能被str1,str2整除。最后得到最大值返回。
class Solution {
public String gcdOfStrings(String str1, String str2) {
if(!(str1 + str2).equals( str2 + str1)){
return "";
}
if(str2.length() > str1.length()){
String temp = str1;
str1 = str2;
str2 = temp;
}
int len1=str1.length();
int len2=str2.length();
String gcdStr = "";
for(int i = 0; i < len2; i++){
String tempgcdStr = str2.substring(0, i+1);
if(len2 % (i+1) == 0 && (len1 % (i+1) == 0) ){
gcdStr = tempgcdStr;
}
}
return gcdStr;
}
}