云南网站开发,兰州模板网站seo价格,wordpress 常用查询,新作的网站怎么做百度推送自除数
问题描述
自除数 是指可以被它包含的每一位数整除的正整数。
例如#xff0c;128 是一个自除数#xff0c;因为 128 % 1 0#xff0c;128 % 2 0#xff0c;128 % 8 0。
注意#xff1a;自除数不允许包含 0#xff0c;因为任何数除以 0 都是未定义的。
给定两个…自除数问题描述自除数是指可以被它包含的每一位数整除的正整数。例如128 是一个自除数因为128 % 1 0128 % 2 0128 % 8 0。注意自除数不允许包含 0因为任何数除以 0 都是未定义的。给定两个整数left和right返回[left, right]范围内所有自除数的列表。示例输入: left 1, right 22 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]算法思路遍历[left, right]范围内的每个数字对每个数字提取其每一位数字进行验证验证条件不能包含数字 0因为除以 0 未定义原数字必须能被每一位数字整除如果满足所有条件则为自除数代码实现方法一逐位验证importjava.util.*;classSolution{/** * 找出指定范围内所有的自除数 * * param left 范围左边界包含 * param right 范围右边界包含 * return 自除数列表 */publicListIntegerselfDividingNumbers(intleft,intright){ListIntegerresultnewArrayList();// 遍历给定范围内的每个数字for(intnumleft;numright;num){// 检查当前数字是否为自除数if(isSelfDividing(num)){result.add(num);}}returnresult;}/** * 判断一个数字是否为自除数 * * param num 待检查的数字 * return true表示是自除数false表示不是 */privatebooleanisSelfDividing(intnum){intoriginalnum;// 保存原始数字用于后续的整除判断// 逐位检查数字的每一位while(num0){intdigitnum%10;// 获取当前数字的最后一位// 如果包含0则不是自除数// 任何数都不能被0整除除以0未定义if(digit0){returnfalse;}// 原始数字必须能被当前位数字整除if(original%digit!0){returnfalse;}num/10;// 去掉最后一位继续检查下一位}// 所有位都通过检查是自除数returntrue;}}方法二字符串importjava.util.*;classSolution{/** * 使用字符串判断自除数 * * param left 范围左边界包含 * param right 范围右边界包含 * return 自除数列表 */publicListIntegerselfDividingNumbers(intleft,intright){ListIntegerresultnewArrayList();for(intnumleft;numright;num){if(isSelfDividingString(num)){result.add(num);}}returnresult;}/** * 使用字符串判断自除数 * * param num 待检查的数字 * return true表示是自除数false表示不是 */privatebooleanisSelfDividingString(intnum){StringnumStrString.valueOf(num);// 遍历字符串的每个字符for(charc:numStr.toCharArray()){intdigitc-0;// 将字符转换为数字// 检查是否包含0或不能整除if(digit0||num%digit!0){returnfalse;}}returntrue;}}算法分析时间复杂度O(n × log m)n right - left 1范围内的数字个数log m 数字的位数m 为数字的大小以10为底的对数每个数字需要检查其所有位数空间复杂度O(1)不包括结果列表只使用了常数个额外变量算法过程输入left 1, right 22num 1位数11 % 1 0num 2位数22 % 2 0num 10位数1, 0包含0num 11位数1, 111 % 1 0最终结果[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]测试用例publicstaticvoidmain(String[]args){SolutionsolutionnewSolution();// 测试用例1标准示例System.out.println(Test 1: solution.selfDividingNumbers(1,22));// [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]// 测试用例2包含10的范围System.out.println(Test 2: solution.selfDividingNumbers(10,15));// [11, 12, 15]// 测试用例3单个数字System.out.println(Test 3: solution.selfDividingNumbers(1,1));// [1]// 测试用例4较大范围System.out.println(Test 4: solution.selfDividingNumbers(1,100));// 包含1-9, 11, 12, 15, 22, 24, 33, 36, 44, 48, 55, 66, 77, 88, 99// 测试用例5包含边界值System.out.println(Test 5: solution.selfDividingNumbers(47,85));// [48, 55, 66, 77]// 测试用例6无自除数的范围System.out.println(Test 6: solution.selfDividingNumbers(100,101));// []// 测试用例7包含2000System.out.println(Test 7: solution.selfDividingNumbers(1999,2000));// []}关键点0自除数绝对不能包含数字0原始数字保存在逐位检查时必须使用原始数字进行整除运算位数提取使用num % 10获取最后一位使用num / 10去掉最后一位常见问题为什么不能包含0数学上除以0是未定义的操作即使其他位都能整除只要包含0就不是自除数为什么要保存原始数字在逐位提取过程中原数字会被修改num / 10整除判断必须用完整的原始数字单数字1-9为什么都是自除数任何非零数字都能被自己整除