2021-03-28:定义一种数:可以表示成若干(数量>1)连续正数和的数 。比如:5 = 2+3,5就是这样的数 ;12 =

举报
福大大架构师每日一题 发表于 2021/03/28 20:58:57 2021/03/28
【摘要】 2021-03-28:定义一种数:可以表示成若干(数量>1)连续正数和的数 。比如:5 = 2+3,5就是这样的数 ;12 = 3+4+5,12就是这样的数 。1不是这样的数,因为要求数量大于1个、连续正数和 。2 = 1 + 1,2也不是,因为等号右边不是连续正数 。给定一个参数N,返回是不是可以表示成若干连续正数和的数 。福大大 答案2021-03-28:1.自然智慧。滑动窗口。中点到1...

2021-03-28:定义一种数:可以表示成若干(数量>1)连续正数和的数 。比如:5 = 2+3,5就是这样的数 ;12 = 3+4+5,12就是这样的数 。1不是这样的数,因为要求数量大于1个、连续正数和 。2 = 1 + 1,2也不是,因为等号右边不是连续正数 。给定一个参数N,返回是不是可以表示成若干连续正数和的数 。

福大大 答案2021-03-28:

1.自然智慧。
滑动窗口。中点到1。L左移,和增大;R左移,和减小。如果和=N,成立。

2.根据结果反推,找规律。
N是2次幂,不能表示成连续正数和;N不是2次幂,是连续正数和的数。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
    for i := 1; i <= 64; i++ {
        fmt.Println(i, isMSum1(i), isMSum2(i))
    }
}

func isMSum1(num int) bool {
    if num == 1 {
        return false
    }
    R := (num + 1) >> 1
    L := R - 1
    sum := R
    for {
        if sum == num {
            return true
        } else if sum > num {
            sum -= R
            R--
        } else {
            if L == 0 {
                break
            }
            sum += L
            L--

        }
    }
    return false
}
func isMSum2(num int) bool {
    return num != (num & (^num + 1))
    //return num != (num & (-num))

    //return (num & (num - 1)) != 0
}

执行结果如下:
图片


左神java代码
评论

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。