| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 671 人关注过本帖
标题:寻求算法
只看楼主 加入收藏
sunnvya
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:1094
专家分:0
注 册:2005-11-23
收藏
得分:0 
楼上的算法不错
但有点看不明白,可否结实一下

[此贴子已经被作者于2006-8-15 2:54:11编辑过]


http://www. 第二站>>>提供源码下载
2006-08-15 02:53
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

没考虑到2?怎么说,请指教。。。
Num==2时,if(i%2!=0&&Num%i==0)ans++;if(i%2==0&&(Num-i/2)%i==0)ans++;
这两个都不满足。所以ans==0;请问哪里有问题?
我说说我的想法:
由于是连续数的和加起来等于Num;那么我想用这个连续数的个数来作为循环的条件
因为比如3个连续数的和等于Num;那么3个数的连续数只有唯一的这一个。
根据这种唯一性,判断从2个到max个这么多种不同情况的连续数个数的和是否有等于Num.这个判断是否就是通过两个if语句判断的。
先说说那个max来由:
假设有n个连续数,从1加到n要小于等于<Num数学可得到:
n<(int)pow((double)2*Num,0.5)+1;而<后面的就是max。
因此限定连续数个数的范围。
再看if语句(i表示连续数的个数,所以必须从2开始):
如果是奇数个连续数,那么他们的平均值就是在他们正中间的那个数,所以需要
Num%i==0;因为Num/i这个时候就是这个平均值。这时确定一个解。
如果是偶数个连续数,这时,我举几个例子似乎容易理解点:
比如4个连续数:3,4,5,6本来3,4,5奇数个连续,平均值4,现在右边多出一个数字,偏离平均值数字2位(也就是大2)。
再比如6个连续数:1,2,3,4,5,6相当于1,2,3,4,5的中心值偏离3(大于3)
可以看出,每增加2个连续,他的多出来的值就比平均值多偏离一位。
想要Num是这些连续数的和,只需要Num减去这个多出来的偏离值再去除以i来确定是否整除,如果成立,这时确定一个解。(当然,由于前面的n有限定,所以n的个数会因为Num而有限制)
大家可以想一下:任给一个数,我假设是100,那么如果是偶数的话,比如有10个连续数,那么(100-5)%10 !=0,所以没有这种解,换一个:8,那么(100-4)%8==0;有解,为什么呢?(100-4)/8=12;
那么解为:9,10,11,12,13,14,15,16
希望大家能看懂


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-08-15 09:52
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
收藏
得分:0 
哦,我看错了
#include <iostream>
using namespace std;
int main()
{
int n,t,p = 1,i = 0;
cin>>n;
t = n/2 +1;
while(p < t)
{
int sum = 0;
for(int j = p;j <= t; j++)
{
sum += j;//cout<<"j= "<<j<<endl;
if(sum == n)
{
i++;
break;
}
}
p++;
}
system("cls");
cout<<n<<" "<<i<<endl;
system("pause");
return 0;
}

2006-08-15 10:50
快速回复:寻求算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014350 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved