百度之星—一个整数拆分成连续的正整数之和的个人解决方法

题目描述:一个正整数有可能可以被表示为 n(n>=2) 个连续正整数之和,如:

15=1+2+3+4+5
15=4+5+6
15=7+8

请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。

为了解决这个问题,我声明了一个类用来实现。具体声明如下所示:


class CNumber
{
private:
int split_number;
int result_number; //用来保存拆分的序列的个数。

public:
void set_number(int split_number);
int get_number() const;

void number_dispose();
void show_result(int begin , int end);

void class_interface();

public:
CNumber(int split_number = 15);
~CNumber(void);
};

解决方法

1、要想解决这个问题,比较直观一点的方法就是穷举法,从1到这个数值的一半,逐渐相加,直到找出等于数值的序列。要想实现这种想法,只用两个for循环语句就可以实现了,但是其时间复杂度接近于O(n3)。

具体解决问题的成员函数代码为:


void CNumber::number_dispose()
{
int temp = split_number / 2;

for(int i = 1 ; i <= temp ; i++)
{
int result = i;
for(int j = i + 1 ; j<= temp + 1 ; j++)
{
result += j;
if(split_number == result)
{
show_result(i , j); //用来输出结果
result_number++;
}
else if(result > split_number)
{
break;
}
}
}
}

2、由于是连续整数之和,那么也就是说,这一串数值构成等差数列,运用等差数列的求和公式(begin + end)*(end – begin +
1)/2,通过begin的值来求出end的值,如果end的值是整数的话,那么这个整数就可以拆分成begin到end之间的连续整数,如果不能,则继续。另外begin的取值范围是1到数值的一半。运用这种方法,其时间复杂度为O(n)。具体的实现代码为:


void CNumber::number_dispose()
{
int temp = split_number / 2;

for(int i = 1 ; i <= temp ; i++)
{
double result = 8 * split_number + 4 * i * i - 4 * i + 1;
double first_judge = sqrt((double)result);
if((int)first_judge != first_judge)
continue;

int end = ((int)first_judge - 1)/ 2;//上面的运算,其实就是求一元二次方程的解。
show_result(i , end);
result_number ++;
}
}

运行后的结果显示为:

时间: 2024-12-22 12:41:52

百度之星—一个整数拆分成连续的正整数之和的个人解决方法的相关文章

关于求已知整数数组的连续子数组的最大和的方法

日期:2019.3.9 博客期:039 星期六 这次的标题就是题目——关于求已知整数数组的连续子数组的最大和的方法,打个比方:给予数组 { 1 , -2 , 3 , -1 , 0 , 2 } ,它的连续子数组的最大和就是取得 { 3 , -1 , 0 , 2 } 时的和 4 !就是说我们需要找到元素值和最大的子数组.我们大可以考虑几种方法: (1)先求出所有的子数组,再找出每一组的和,求出和的最大值 >>>>>>>(优化)>>>>>&

QTP录制后弹出框一个或多个ActiveX控件无法显示的解决方法

制一段脚本代码,在专家视图窗口中编辑录制的脚本代码时,会碰到弹出一个对话窗口,提示为"当前安全设置禁止运行该页中的ActiveX 控件,因此,该页可能无法正常显示"类似的东西,而在人工操作时却没有这样的现象.(如图) 问题主要出在于QTP设置本身,之所以在编辑录制好的脚本时,QTP出现关于Active的对话提示窗口,问题在于QTP的设置,要消除该提示窗口.应对QTP作如下设置:toos–options–Active Screen–Advanced–点选Load ActiveX cont

2015年百度之星初赛(1) --- B 找连续数

找连续数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 179    Accepted Submission(s): 65 Problem Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否能找到一个k 的区间,里面的 k 个数字排完序后是连续的. 现在小度熊增加题目难度,他不想知道是否有这样的 k 的区

hdu 2098 分拆素数和(一个偶数拆分成两个不同素数和 拆法数量)

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2098 分拆素数和 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 46434    Accepted Submission(s): 20210 Problem Description 把一个偶数拆成两个不同素数的和,有几种拆法呢? Input

将一个整数划分为多个正整数之和

整数划分问题是将一个正整数n拆分成一组数连加并等于n的形式,显然这组数中最大加数不大于n. 令n为需要划分的整数,m为划分后的最大整数.例如将6划分为最大加数为6的划分形式如下: 6 5 + 1 4 + 2, 4 + 1 + 1 3 + 3, 3 + 2 +1, 3 + 1 + 1 + 1 2 + 2 + 2, 2 + 2+ 1 + 1, 2 + 1 + 1 + 1 + 1 1 + 1 + 1 + 1 +1 + 1 共11中划分方法.若划分后最大整数为2,则划分形式为最后两行,共4种划分方法.易

poj 2100 尺取法 一个数字拆成连续数字平方和

题意:将一个数拆成若干个连续数字的平方和. 用尺取法枚举区间,复杂度为O(n),时限10s,3s多ac. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cmath> 5 using namespace std; 6 7 const int N = 100; 8 9 struct Node 10 { 11 int from, to; 12 } node[N]

带有res资源文件的项目 需要导成jar包 供别人使用的解决方法

比如说自己的成品项目,名字是MyObject,需要导出成jar包,让别人的项目调用,但是自己的项目还包含有图片.layout布局.libs里面的依赖包等等: 步骤: 1.MyObject项目需要“is library”一下,当做一个类库.(项目右键-Properties-Android页面下部Library部分选中“Is Library”,点击ok就行了) 2.新建一个项目,名称随意,我起名字叫MyLib,packageName一定要和MyObject项目一样.然后也是“is library”一

关于matlab2014a中生成dll文件,打包成com组件出现的问题和解决方法

问题1:matlab2014a破解不完整,容易导致package打包失败 解决方法:1.下载破解文档:链接: http://pan.baidu.com/s/1eRJ4E2I 密码: 44th 2.下载后解压,把install.jar以及相应位数的三个文件(compiler.dll,mcc.exe,libmwservices.dll)复制到对应位置替换即可,另外把license.lic改为与MATLAB\licenses文件夹下的那个lic文件同名,复制并替换之. 问题2:如果出现mbuild -

记一个VS连接过程中找不到cpp的解决方法

在新增几个qt页面时,发现原来没动的几个cpp 连接报错了,错误均是qt的相关文件找不到 应该是moc文件没有生产或者没有被包含进工程.我想着既然我没动,应该不会是moc的原因,就在其他方向解决了很久也没解决 然后在vs文件管理器搜相关moc文件,缺失没有,这就很奇怪了. 我的方法是,用记事本格式打开工程的.vcxproj文件,跟之前的一对比.发现缺失有几个cpp的命令行被改掉了.这个如果用vs的可视化界面,很难直观的看到哪个变动了 于是把这几个cpp文件删除再添加,就可以了 原文地址:http