问题:
小象有一个数字A,它想找出满足一下要求的数字的个数:
1.这个数字必须是A的因数
2.这个数字中至少有一位数字与A中的数字相同(例如:A=100,B =1,A的1和0中有一个1与B中的1相同)
请求出满足要求的数字的个数
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int sum = 0;
if(n==1) System.out.println(1);
else{
sum=1;
String s = String.valueOf(n);
if(s.contains("1")) sum++;
for(int i = 2; i<=Math.sqrt(n);i++){
if(n%i==0){
String s1 = String.valueOf(n);
String s2 = String .valueOf(i);
String s3 = String .valueOf(n/i);
if(same(s1,s2)){
sum++;
}
if(n/i !=i &&same(s1,s3)){
sum++;
}
}
}
System.out.println(sum);
}
}
public static boolean same(String s1,String s2){
for(int i = 0 ; i < s1.length();i++){
for(int j = 0 ;j<s2.length();j++){
if(s1.charAt(i)==s2.charAt(j)){
return true;
}
}
}
return false;
}
}
关键:
1.对输入的数字A进行循环,在循环中逐个判断得到A的因数
2.在循环确定的因数中进一步判断,判断所得到的因数与A中是否有相同的数字,如果有就给result+1
技巧:
1.先判断特殊值 A=1。如果A = 1,首先,1的因数只有1,而且1和本身有相同的数字,结果就是1,所以,如果输入A=1,那直接输出结果1
2.如果A!=1,那就需要循环判断,循环从2开始,到sqrt(A)结束。为什么呢?因为,一个数的两个因数,一个偏小,一个偏大,以sqrt(A)为界限。所以,判断了i之后,就可以利用 A/i得到另一个因数
3.判断过程中,最外层的循环,表示判断从2到sqrt(A)的所有数,如果找到了因数,那么,先将三个数 A,i , A/i 转为字符串(因为要进一步判断是否有相同的数字),对于这个因数,判断,是否和A有相同的数字,如果有,就给结果+1。然后与这个If并列的再来一个if判断,判断是否A/i也与A有相同的数字,并且i!=A/i(如果相等,说明他们两个含有的数字相同,在结果中只需要计算一次);如果满足条件,就表明,另一个因数不和这个因数相等,并且还与A含有相同的数字