leecode | 829连续整数求和

2024-01-05 10:28
文章标签 连续 整数 求和 829 leecode

本文主要是介绍leecode | 829连续整数求和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

给一个整数n 求连续整数的和等于n 的个数
这道题 是一个数论的思想

解决思路: 数必须是连续的,可以转化成一个通用的公式,以101为例做一般性推导,: 101 = 101 = 50 + 51 = 24 + 25 + 26 + 27 = 24 * 4 + 6 = a *n + (n - 1)*n/2

归纳出一般性结论: y = a * n + (n - 1) * n / 2 ==> a = y/n - (n - 1) / 2 ==> 猜想:a是整数才能匹配

以y=101为例 a = 101/n - (n - 1) / 2 (n - 1) / 2的小数位为0.5或0,当n > 2时,101/n小数位肯定不为0或者0.5,所以a = 101/n - (n - 1) / 2肯定>不为整数

问题可以转化为求n的值

推演: 示例1: 以15为例 15 = a * n + (n - 1) * n / 2 a = 15/n - (n - 1) / 2

当n=1: a = 15 匹配 15

当n=2: a*2 + 1 = 15 a = 7 匹配 7,8

当n=3: a*3 + 3 = 15 a = 4 匹配 4,5,6

当n=4: a*4 + 6 = 15 a = 9/4 不能除尽 不匹配

当n=5: a*5 + 10 = 15 a = 1 匹配 1,2,3,4,5

a = 1 不大于1,匹配结束, 匹配结果为n=3组

class Solution {
public:int consecutiveNumbersSum(int n) {//(a, k)// (a + a + k - 1)*k/2 = n//2a = 2n/k-k+1 ==> //2a = 2n/k -k + 1 >= 2 ==> 2n/k >= k+1 <==> 2n/k > k//那么 就在 [1, 2n^1/2) 的范围去枚举 k // 如果k  是2n约数,再结合 (2a+k-1)*k = 2n 就可以验证a合法//枚举k 就好, k 必是2n的约数,并且为 较小 的约数//经过推论 ,满足上面的不等式  接着两个条件 就把答案挑出来了int n *= 2 , ans = 0;for(int k = 1; k * k < n; ++k){if(n % k != 0){continue;}if((n / k - (k - 1))%2 == 0){ans++;}}return ans;}
};// 真的太秀了

这篇关于leecode | 829连续整数求和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/572552

相关文章

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

XTU 1233 n个硬币连续m个正面个数(dp)

题面: Coins Problem Description: Duoxida buys a bottle of MaiDong from a vending machine and the machine give her n coins back. She places them in a line randomly showing head face or tail face o

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

1 模拟——67. 二进制求和

1 模拟 67. 二进制求和 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1:输入:a = "11", b = "1"输出:"100"示例 2:输入:a = "1010", b = "1011"输出:"10101" 算法设计 可以从低位到高位(从后向前)计算,用一个变量carry记录进位,如果有字符没处理完或者有进位,则循环处理。两个字符串对

单精度浮点数按存储格式转为整数的程序

///#include<cstdio>//-----------------union int_char{unsigned char ch[4];float i;};void out_put(union int_char x)//x86是小端对其模式,即最数据的最低位存储在地址的最低位上。{printf("单精度浮点数值为:%f\n",x.i,x.i);printf("存储位置从左到右

Leetcode面试经典150题-128.最长连续序列-递归版本另解

之前写过一篇这个题的,但是可能代码比较复杂,这回来个简洁版的,这个是递归版本 可以看看之前的版本,两个版本面试用哪个都保过 解法都在代码里,不懂就留言或者私信 class Solution {/**对于之前的解法,我现在提供一共更优的解,但是这种可能会比较难懂一些(思想方面)代码其实是很简洁的,总体思想如下:不需要排序直接把所有数放入map,map的key是当前数字,value是当前数开始的

Leetcode67---二进制求和

https://leetcode.cn/problems/add-binary/description/ 给出的两个二进制,我们可以从最后开始往前运算。 给当前短的一位前面补充0即可。 class Solution {public String addBinary(String a, String b) {//给的就是二进制字符串 最后一位开始遍历 如果没有就补充0?StringBuil

LCP 485. 最大连续 1 的个数[lleetcode -11]

从今天起,我们的算法开始研究搜索,首先就是DFS深度优先搜索(depth-first seach,DFS)在搜索到一个新的节点时,立即对该新节点进行遍 历;因此遍历需要用先入后出的栈来实现,也可以通过与栈等价的递归来实现。对于树结构而言, 由于总是对新节点调用遍历,因此看起来是向着“深”的方向前进。 下面是一个一维的DFS算法 LCP 485. 最大连续 1 的个数 给定一个二进制数组 nu

UVa 10820 Send a Table (Farey数列欧拉函数求和)

这里先说一下欧拉函数的求法 先说一下筛选素数的方法 void Get_Prime(){ /*筛选素数法*/for(int i = 0; i < N; i++) vis[i] = 1;vis[0] = vis[1] = 0;for(int i = 2; i * i < N; i++)if(vis[i]){for(int j = i * i; j < N; j += i)vis[j] =