2022-09-09:给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。
示例 1:
输入: n = 5
输出: 2
解释: 5 = 2 + 3,共有两组连续整数([5],[2,3])求和后为 5。
示例 2:
输入: n = 9
输出: 3
解释: 9 = 4 + 5 = 2 + 3 + 4
示例 3:
输入: n = 15
输出: 4
解释: 15 = 8 + 7 = 4 + 5 + 6 = 1 + 2 + 3 + 4 + 5

答案2022-09-09:

如果有,N = (x+1) + (x+2) + … + (x+k)
上式子可以化简为:N = kx + k(k+1)/2
左右两边同时乘以2,可以得到:2N = 2kx + k^2 + k
进而得到:2N = k(2x + k + 1)
2N 偶 k * (2x + k + 1)
k 2x + k + 1
所以,对于2N = k(2x + k + 1),这个式子来说,只要给定不同的一组x和k,就对应一种不同的方案
进一步分析可以看出:
如果k为偶数,那么2x + k + 1就是奇数
如果k为奇数,那么2x + k + 1就是偶数
2N = 左 K 右 2x + k + 1
2N 奇数因子K, 2x + k + 1
也就是说,对于每一种方案,k和2x + k + 1,一定是不同的,并且连奇偶性都相反
所以2N里任何一个奇数因子,可能作为k这一项,也可能作为2x+k+1这一项,
不管奇数因子作为哪一项,都可以推出另外一项的值,进而确定k和x具体是多少
进而可以推出,2N里有多少个奇数因子,就有多少种方案
于是这个题就变成了求N里有多少奇数因子
一般来说,求N里有多少奇数因子,用O(根号N)的方法肯定可以
但其实可以更加的优化,
如果 N = 3^a * 5^b * 7^c * 9^d …那么N一共会出现多少奇数因子呢?
N的质数因子:可以选择0个3…可以选择1个3…可以选择2个3…可以选择a个3,所以有a+1种选择
上面的选择,去乘以:可以选择0个5…可以选择1个5…可以选择2个5…可以选择b个5,所以有b+1种选择
上面的选择,去乘以:可以选择0个7…可以选择1个7…可以选择2个7…可以选择c个7,所以有c+1种选择

所以,一共有(a + 1) * (b + 1) * (c + 1) * (d + 1) …这么多个奇数因子。

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

fn main() {
let n = 3 * 5 * 7;
let ans = consecutive_numbers_sum1(n);
println!("ans = {}", ans);
let ans = consecutive_numbers_sum2(n);
println!("ans = {}", ans);
} fn consecutive_numbers_sum1(mut n: i32) -> i32 {
while (n & 1) == 0 {
n >>= 1;
}
let mut res = 1;
let mut i = 3;
while i <= n {
let mut count = 1;
while n % i == 0 {
n /= i;
count += 1;
}
res *= count;
i += 2
}
return res;
} // 进一步优化
fn consecutive_numbers_sum2(mut n: i32) -> i32 {
while (n & 1) == 0 {
n >>= 1;
}
let mut res = 1;
// O(根号N)
let mut i = 3;
while i * i <= n {
let mut count = 1;
while n % i == 0 {
n /= i;
count += 1;
}
// rest *= (计数+1)
res *= count;
i += 2
}
// N == 1表示已经找到了所有奇数因子
// N != 1表示只残留着最后一个奇数因子了
// 简单证明:如果N最后残留着不只一个奇数因子,
// 比如x*y(不妨设x<y),那么在for循环里,就依然会有i*i <= N
// 因为i=x时,x*x <= x*y,所以x在for循环里就能计算到
// 所以如果N != 1表示只残留着一个奇数因子
return if n == 1 { res } else { res << 1 };
}

执行结果如下:


左神java代码

2022-09-09:给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。 示例 1: 输入: n = 5 输出: 2 解释: 5 = 2 + 3,共有两组连续整数([5],[2,的更多相关文章

  1. 算法:Manacher,给定一个字符串str,返回str中最长回文子串的长度。

    [题目] 给定一个字符串str,返回str中最长回文子串的长度 [举例] str="123", 1 str="abc1234321ab" 7 [暴力破解] 从左 ...

  2. 环形链表(给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null)

    思想: 思想:用快慢指针先判断是否有环,有环则 假设头结点到环入口距离为n,环入口到快慢指针相遇结点距离为m,则慢指针走的路程 为m+n,而快指针走的路程为m+n+k*l (k*l表示绕环走的路程), ...

  3. 给定一个奇数n,比如n=3,生成1到n平方的数,如1到9,填入九宫格,使得横竖斜的和都相等。

    对于N阶幻方,从1开始把数字从小到大按以下规则依次写入: 一.在第一行中间一列写入1 二.依次向右上方写入2.3.4...... 三.如果某数字写在了表格的某个方向外面,那就把这个数字向相反方向移动N ...

  4. 给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。

    分析,是一个dp的题目, 设f[i]表示以i为结尾的最大值,g[i]表示以i结尾的最小值,那么 f[i+1] = max{f[i]*arr[i+1], g[i]*arr[i+1],arr[i+1]} ...

  5. 给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)

    """ #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 解题思路: 1.设定一个 ...

  6. JAVA 之 每日一记 之 算法( 给定一个正整数,返回它在 Excel 表中相对应的列名称。 )

    题目: 给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如: 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -& ...

  7. 课堂练习:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。

    题目 1 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 2 要求: (1) 写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数.例如 f(12)  ...

  8. 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。

    一.题目: n给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. n要求: n写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数.例如 f(12)  ...

  9. 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。

    题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0. 解法一:暴力求解.从1开始查找M,然后判断M*N=X这个数字是否只含有0,1. 解法二:由 ...

  10. 给定一个正整数,实现一个方法求出离该整数最近的大于自身的 换位数 <把一个整数各个数位进行全排列>

    """给定一个正整数,实现一个方法求出离该整数最近的大于自身的 换位数 -> 把一个整数各个数位进行全排列""" # 使用 permu ...

随机推荐

  1. bind、call、apply区别

    bind.call.apply都是用来改变函数内部this指向的方法,使用上仅有细微差别 一.代码 function person(p1, p2, p3) { console.log('this: ' ...

  2. OO多项式求导作业总结

    一.程序分析 1.1第一次作业 第一次作业是简单的多项式求导,甚至没有括号嵌套.但是,就是这个在如今看来如此简单的作业,由于俺寒假过于起飞,pre没做,正则表达式也不会(属实拉跨),一度想用c语言字符 ...

  3. 第八次团队作业:Beta冲刺(凡事预则立)

    这个作业属于哪个课程 2018级计算机和综合实验班 这个作业要求在哪里 Beta冲刺要求 这个作业的目标 Beta冲刺 改进完善的功能 完善之前年度报告功能 尽快上线小程序 增加的新功能 小程序打卡功 ...

  4. 学习笔记-C++

    题目:声明一个基类BaseClass,从它派生出类DerivedClass,BaseClass有成员函数fn1()和fn2(),fn1()是虚函数,DerivedClass也有成员函数fn1()和fn ...

  5. HTML-CSS常用代码

    注释标签:对代码进行说明<!-- 单行注释,也可以对多行文字进行注释 -->常用格式标签<b>加粗</b> <i>斜体</i> <u& ...

  6. 如何利用Apifox通过签名计算及数据加解密进行用户认证接口测试?

    用户注册场景:输入签名数据signature,appId,13位时间戳timestamp,6位随机数nonce,merchantId(非必填,本次不填)的请求参数发送给服务器,服务器返回响应数值后,校 ...

  7. TypeScript 学习笔记 — infer 类型推导、类型兼容 (九)

    目录 1.ReturnType 返回值类型 2.Parameters 参数类型 3.InstanceType 实例类型 4.ConstructorParameters 构造函数参数类型 5.infer ...

  8. markdown空格缩进以及HTML空格实体

    参考链接:https://www.jianshu.com/p/31eade263e7a https://www.cnblogs.com/naixil/p/13193364.html

  9. Springboot 结合 Netty 实战聊天系统

    音视频技术为什么需要微服务 微服务,英文名:microservice,百度百科上将其定义为:SOA 架构的一种变体.微服务(或微服务架构)是一种将应用程序构造为一组低耦合的服务. 微服务有着一些鲜明的 ...

  10. .NET应用系统的国际化-多语言翻译服务

    上篇文章我们介绍了 .NET应用系统的国际化-基于Roslyn抽取词条.更新代码 系统国际化改造整体设计思路如下: 提供一个工具,识别前后端代码中的中文,形成多语言词条,按语言.界面.模块统一管理多有 ...