题目
定义一种数:可以表示成若干(数量>1)连续正数和的数。
比如:5 = 2+3, 5就是这样的数;12 = 3+4+5, 12就是这样的数;1不是这样的数,因为要求数量大于1个、连续正数和。
2 = 1 + 1,2也不是,因为等号右边不是连续正数。给定一个参数N,返回是不是可以表示成若干连续正数和的数。
对数器找规律总结
- 某个面试题,输入参数类型简单,并且只有一个实际参数
- 要求的返回值类型也简单,并且只有一个
- 用暴力方法,把输入参数对应的返回值,打印出来看看,进而优化code
代码
package com.harrison.class26;
/**
* @author Harrison
* @create 2022-04-07-18:12
* @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
*/
public class Code03_MSumToN {
// 暴力解法
public static boolean isMSum1(int num) {
for (int start = 1; start <= num; start++) {
int sum = start;
for (int j = start + 1; j <= num; j++) {
if (sum + j > num) {
break;
}
if (sum + j == num) {
return true;
}
sum += j;
}
}
return false;
}
// 规律解法
public static boolean isMSum2(int num) {
// return num == (num & (~num + 1));
// return num==(num&(-num));
return (num & (num-1)) !=0;
}
public static void main(String[] args) {
for (int num = 1; num < 200; num++) {
System.out.println(num + ":" + isMSum1(num));
}
System.out.println("test begin");
for (int num = 1; num < 5000; num++) {
if (isMSum1(num) != isMSum2(num)) {
System.out.println("Oops!");
}
}
System.out.println("test finish");
}
}