判断一个数是否是n个连续数的和

73 阅读1分钟
  • 5 = 2 + 3
  • 12 = 3 + 4 + 5
  • 思路:
    • 暴力找出规律
    • 两个for循环
    • 如果大于这个数直接跳出循环
package class01;

public class Code03_MSumToN {

	public static boolean isMSum1(int num) {
            for (int i = 1; i <= num; i++) {
                int sum = i;
                for (int j = i + 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) {
		if (num < 3) {
			return false;
		}
		return (num & (num - 1)) != 0; // 判断num是不是2的某次幂
	}
	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 end");

	}
}
  • javascript版本
  • (num & (num - 1)) == 0 说明num是2的某次幂
/**
 * - 5 = 2 + 3
- 12 = 3 + 4 + 5
- 思路:
    - 暴露找出规律
    - 两个for循环
    - 如果大于这个数直接跳出循环
 */
function isMSum(num) {
  for(let i = 1; i <= num; i++) {
    let sum = i
    for(let j = i + 1; j <= num - i; j++) {
      if(sum + j == num) {
        return true
      }
      if(sum + j > num) {
        break
      }else {
        sum += j
      }
    }
  }
  return false
}
// 规律写法
function isMSum2(num) {
  if(num < 3) {
    return false
  }
  return (num & (num - 1)) != 0
}
console.log(isMSum(5) == isMSum2(5))
console.log(isMSum(15) == isMSum2(15))
console.log(isMSum(25) == isMSum2(25))