728|Self Dividing Numbers
A self-dividing number is a number that is divisible(可分的,可分割的) by every digit( 数字) it contains.
For example, 128 is a self-dividing number because 128 % 1 == 0, 128 % 2 == 0, and 128 % 8 == 0.
Also, a self-dividing number is not allowed to contain the digit zero(不包含0).
Given a lower and upper number bound(界), output a list of every possible self dividing number, including the bounds if possible.
Example 1:
Input:
left = 1, right = 22
Output: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
Note:
The boundaries of each input argument are 1 <= left <= right <= 10000.
第一种方法:转化成String类型,这样一个一个遍历数字方便
存在的知识点:是字符类型时,来nums(整数)%自己的每一位字符的时候,是字符不是数字的运算,要考虑这个问题。
如果现在想要判断128%‘1‘
是不是为0,‘1’的ASCII码为49(二进制表示的),48(二进制表示的48)是字符‘0’的ASCII码,但是数字1在计算机以(二进制表示的1)存放,所以‘1’转成数字1的方法是 ‘1’-‘0’=49-48=1.所以128%(‘1’-‘0’)的值可以判断
class Solution {
public List<Integer> selfDividingNumbers(int left, int right) {
List<Integer> self_driving_nums=new ArrayList();
for(int i=left;i<=right;i++){
if(isSelfDriving(i))
self_driving_nums.add(i);
}
return self_driving_nums;
}
public boolean isSelfDriving(int num){
for(char c:String.valueOf(num).toCharArray()){
if(c=='0'||num%(c-'0')>0){
return false;
}
}
return true;
}
}
第二种方法:双重循环,比如left=1,right=1258,那外部循环就是i=1一直循环到1258,然后 内部循环就是把i的每个数来判断,每次判断 为0吗和是不是除以每个数字==0
class Solution {
public List<Integer> selfDividingNumbers(int left, int right) {
List<Integer> list=new ArrayList<>();
for(int i=left;i<=right;i++){
int j=i;
//1258
//1258%(1258%10=8)==0
//j=1258/10=125
//1258%(125%10=5)==0
//j=125/10=12
//1258%(12%10=2)==0
//j=12/10=1
//1258%(1%10=1)==0
//因为除以自己的每个数都为0,所以1258是自除数字
for(;j>0;j/=10){
//不是0,自除数字不能含一个0|| 自除数字的条件:自除数字%(自除的数字每一位数[个十百千万])==0
if((j%10==0)||(i%(j%10)!=0)) break;
}
if(j==0) list.add(i);
}
return list;
}
}