VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 476|回复: 3

[求助] 求一个答案的思路

[复制链接]
35_avatar_middle
在线会员 发表于 2019-1-18 16:15:10 | 显示全部楼层 |阅读模式
6驿站币
本帖最后由 Jeff_ 于 2019-1-18 16:18 编辑

题目我自己用迭代,用等差数组配合一元二次方程都做出来了,
但是看到个别人写的,非常清爽简洁的代码,但不知道思路,看看有没有大手子对下面代码流程有没有思路

这个是我在网上找到的代码:
  1. int main(){
  2.         int m;               
  3.         cin>>m;
  4.         for( int k=sqrt((double)(2*m)) ; k>1 ; k-- )   
  5.                 if( (2*m)%k==0 && (k+2*m/k)%2 )                                       
  6.                 {
  7.                         int j=2*m/k;                                                  
  8.                         cout<<(j-k+1)/2<<" "<<(j+k-1)/2<<endl;
  9.                 }
  10.                 return 0;
  11. }
复制代码


题目:
连续自然数和
描述:
给出一个自然数M.找到所有连续的自然段,其总和为M.
引用
例如:
M = 10000
1998+1999+2000+2001 +2002= 10000

引用
样本输入:
10000

样本输出:
18 142
297 328
388 412
1998 2002


最佳答案

查看完整内容

这个算法还真接触的不多,网上找到了几篇文章不知道能否帮助到楼主,类似公式推导的: https://blog.csdn.net/CS_O_1/article/details/53127916 https://blog.csdn.net/feizaoSYUACM/article/details/70039256




上一篇:字符串查找有哪些算法
下一篇:不是有效的win32应用程序
77_avatar_middle
online_vip 发表于 2019-1-18 16:15:11 | 显示全部楼层
这个算法还真接触的不多,网上找到了几篇文章不知道能否帮助到楼主,类似公式推导的:
https://blog.csdn.net/CS_O_1/article/details/53127916
https://blog.csdn.net/feizaoSYUACM/article/details/70039256
35_avatar_middle
ico_lz  楼主| 发表于 2019-1-19 14:29:24 | 显示全部楼层
Health 发表于 2019-1-18 20:02
这个算法还真接触的不多,网上找到了几篇文章不知道能否帮助到楼主,类似公式推导的:
https://blog.csdn. ...

好的,我看看,谢谢
35_avatar_middle
ico_lz  楼主| 发表于 2019-1-22 23:27:07 | 显示全部楼层
//思路:等差数列,因为从1开始,项数等于尾项-首项+1,所以项数一定和对应项数两者奇偶不同。
//若项数为奇数,对应两个项的和则为偶数。
//例如:1 4 两个数,其中包含4个项(1,2,3,4)为偶数,但1+4=5为奇数。
//既然是一个连续的数列,那么它们的和等于他们的平均数×项数,平均数可能为0.5,将其整体扩大2倍,平均数则为整数。
//若项数为奇数,其对应首位项和必为偶数,若项数为偶数,其对应首位项和必为奇数。
//项数和对应首位项和不可能同为奇,即(x+2*m/x)%2一定为奇数。
int main(){
        int m;               
        cin>>m;                                                                                       
        for( int x=sqrt((double)(2*m)) ; x>1 ; x-- )    //x是连续自然段的个数(项数),即x为首项数和尾项数的差+1
                if( (2*m)%x==0 && (x+2*m/x)%2 )                                //2m是x的倍数,x+y是奇数
                {
                        int y=2*m/x;                                                        //2倍的平均数,即y是符合条件的首项和尾项的和,防止平均数是小数?   
                        cout<<(y-x+1)/2<<" "<<(y+x-1)/2<<endl;  //平均数-项数*0.5,平均数+项数*0.5。将之前扩大的两倍缩小     验证:(y+x-1)/2-(y-x+1)/2=x-1,共x项,。
                }
                return 0;
}
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-9-16 13:12

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表