在线等,1到100以内连续相加和等于100的数输出,用C++,急

baozoudeqinchun 2011-03-04 12:15:44
在线等,1到100以内连续相加和等于100的数输出,用C++,急
谢谢了,小弟想的头都大了;
...全文
1196 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
hslinux 2011-03-07
  • 打赏
  • 举报
回复
int main(int argc, char* argv[])
{
int nSum = 0;
int nInit = 1;
for (int i=nInit; i<50; )
{
nSum += i;
cout << i << "\t";
if ( 100 == nSum )
{
cout << endl << "[ " << nInit << " , " << i << " ]" << endl;
}

if ( nSum >= 100 )
{
i = ++nInit;
nSum = 0;
cout << endl;
}
else
{
++i;
}
}

system("pause");
return 0;
}
wangyangkobe 2011-03-07
  • 打赏
  • 举报
回复


#include <iostream>
using namespace std;

void print(int begin, int end)
{
for(int i=begin; i<=end; i++)
{
cout<<i<<" ";
}
cout<<endl;
}

/*
函数功能:1到100以内连续相加和等于100的数输出
利用等差数列的公式:sum=(a+b)*n/2;
*/
void SequenceSum()
{
for(int i=1; i<=50; i++)
{
for(int j=i+1; j<50; j++)
{
if((i+j)*(j-i+1) == 200)
print(i, j);
}
}
}


int main()
{
SequenceSum();
}
wbruce 2011-03-06
  • 打赏
  • 举报
回复
可以找规律缩减复杂度,如x表第一个数字,n为x后第n个数字,则
(x+x+n)*n/2=100,
即2*n*x+n平方=200
15的平方大于200,可以将n限定在14范围内,另外,2*n*x是偶数,则n的平方必须为偶数,这样将n也必须为偶数,进一步缩短了范围。
shaotine_wu 2011-03-06
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 boyhailong 的回复:]

其实可以缩小范围:
C/C++ code
#include<iostream>
#include <math.h>
using namespace std;
int main()
{
int n = sqrt((double)200);
for(int i = 2; i < 50; ++i)
{
int sum = i;
for(in……
[/Quote]
学习了!
xiaolomg 2011-03-06
  • 打赏
  • 举报
回复
其实可以缩小范围:
#include<iostream> 
#include <math.h>
using namespace std;
int main()
{
int n = sqrt((double)200);
for(int i = 2; i < 50; ++i)
{
int sum = i;
for(int j = i+1; j < 50; ++j)
{
sum += j;
if(sum == 100)
{
for (int k = i; k <= j; ++k)
{
cout << k << " + ";
}
cout << "= 100" << endl;
break;
}
if(sum>100)
break;
}
}
cout << "100 = 100 "<< endl;
}
xiaolomg 2011-03-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhhmily 的回复:]

测试通过
C/C++ code

#include<iostream>
using namespace std;
int main()
{
for(int i=0; i<100; i++)
{
int sum =0;
for(int j=i; j<100; j++)
{
sum += j;
……
[/Quote]
这个比较清晰!
dianyancao 2011-03-06
  • 打赏
  • 举报
回复
while and for 一模一样,没啥区别,呵呵
dianyancao 2011-03-06
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 npuhuxl 的回复:]

n个数和为100,设最小数为a
则有a,a+1,……,a+n-1和为100
n*(2*a+n-1)/2=100
a=(200-n*(n-1))/(2*n)
a为整数,则(200-n*(n-1)) 可以 整除 (2*n)
200-n*(n-1)>=0所以
1<=n<(1+sqrt(801))/2=14

这样应该可以很快编出程序了!
[/Quote]
ttssrs 2011-03-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 arong1234 的回复:]
100以内的怎么算都行,就是用10F的算法也没问题,虽然效率低了点
如果数很大,例如:200,000,000以内所有连续的和等于200,000,000的,应该首先做数学分析,看看那些模式的数会满足条件


假如偶数个连续数和满足条件,中间两个数的和一定能整除200,000,000,且数的个数是200,000,000除以中间两个数的和的两倍

如果奇数个数满足此条件,中间那个数一定能整除……
[/Quote]
学习了
npuhuxl 2011-03-05
  • 打赏
  • 举报
回复
n个数和为100,设最小数为a
则有a,a+1,……,a+n-1和为100
n*(2*a+n-1)/2=100
a=(200-n*(n-1))/(2*n)
a为整数,则(200-n*(n-1)) 可以 整除 (2*n)
200-n*(n-1)>=0所以
1<=n<(1+sqrt(801))/2=14

这样应该可以很快编出程序了!
欣客 2011-03-05
  • 打赏
  • 举报
回复
等差数列求和
if(n%2) sum = n*(n - 1)/ 2;
else sum = n*(n + 1)/2

接下来就是从1开始遍历找到n值使sum = 100.
只要找到开始为1 对应的末尾值假如为x;
第一次的联系值为1 ,2 ,3 ...x.
第二轮为 2, 3,....x -1;
第三轮为3,4,....x -2 ;
所以只要找到1对应的x就可以。
yuanshangda 2011-03-05
  • 打赏
  • 举报
回复
都是高手!
pmars 2011-03-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 baozoudeqinchun 的回复:]
引用 1 楼 pmars 的回复:
int sum = 0 , s = 1 ;
for (int i = 1 ; i <= 100 ; ++ i)
{
if (sum<100) sum += i ;
if (sum>100) { sum -= s ; ++ s ; }
if (sum == 100)
{
for (int j = s ; j <= i ; ++ j) cout<<j……
[/Quote]
想法就是sum记录和,之后start记录开始的位置,从前往后加,要是多了就从前面剪掉,等于就输出,少了就在后面加入数据!动态规划,用O(n)的方法解决。。。
arong1234 2011-03-05
  • 打赏
  • 举报
回复
100以内的怎么算都行,就是用10F的算法也没问题,虽然效率低了点
如果数很大,例如:200,000,000以内所有连续的和等于200,000,000的,应该首先做数学分析,看看那些模式的数会满足条件


假如偶数个连续数和满足条件,中间两个数的和一定能整除200,000,000,且数的个数是200,000,000除以中间两个数的和的两倍

如果奇数个数满足此条件,中间那个数一定能整除200,000,000,且数的个数是200,000,000除以中间那个数的商的两倍-1
dooX8086 2011-03-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pmars 的回复:]

int sum = 0 , s = 1 ;
for (int i = 1 ; i <= 100 ; ++ i)
{……
[/Quote]
算法跟 pmars 兄 的一样,只不过写得装13一点..

int main(int argc, char **argv)
{
int s=1, e=2, sum;

while (s<e)
{
sum = (s + e) * ((e - s) + 1) * 0.5;
100 == sum ? printf("%2d + ... + %2d = 100\n", s, e), ++s : 100 > sum ? ++e : ++s; //最近老看到类似这样的13号代码,把整个这样的while写成一行for... - -!!!
}

return 0;
}
bill_yang88 2011-03-05
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
int main()
{
int sum=0,std=1,end;//std记录开始位置,end记录结束位置的后一个位置
while(std!=50)
{
end=std;
while(sum<100)
{
sum+=end;
end++;
}
if(100==sum)
{
for(int n=std;n!=end-1;++n)
cout<<n<<"+";
cout<<n<<endl;
}
sum=0;
++std;
}
return 0;
}
pathuang68 2011-03-04
  • 打赏
  • 举报
回复
老师到底是想考循环还是递归呢?这是个问题。
pmars 2011-03-04
  • 打赏
  • 举报
回复
int sum = 0 , s = 1 ;
for (int i = 1 ; i <= 100 ; ++ i)
{
if (sum<100) sum += i ;
if (sum>100) { sum -= s ; ++ s ; }
if (sum == 100)
{
for (int j = s ; j <= i ; ++ j) cout<<j<<' ' ;
cout<<endl ;
sum -= s ;
++ s ;
}
}

大约就是这些代码,没有编译器,写的可能有点小错误,你改一下吧。。。
Zhhmily 2011-03-04
  • 打赏
  • 举报
回复
测试通过

#include<iostream>
using namespace std;
int main()
{
for(int i=0; i<100; i++)
{
int sum =0;
for(int j=i; j<100; j++)
{
sum += j;
if(sum==100){printf("%2d + ... + %2d = 100\n", i, j);break;}
if(sum>100) break;
}
}
}
csdn5211 2011-03-04
  • 打赏
  • 举报
回复
等差数列求和嘛
加载更多回复(6)

64,653

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧