把整数分解为连续整数之和(难度:normal 注意优化)


输入:35
输出: 2,3,4,5,6,7,8
       5,6,7,8,9
       17,18

以上都是连续的整数,也许大家第一想到的是穷举法,呵呵 ,大家可以先试试
 

下面给出自己的算法

 

Code:
  1. #include <stdio.h>   
  2. int main(void)   
  3. {   
  4.     int n, nSum=1;// nSum 保存总和   
  5.     scanf("%d", &n);// 输入要分解的n   
  6.     for(int n1=1, n2=n1; n1<=n/2; )// n1为最开头的数,n2是最末尾   
  7.     {   
  8.         if(nSum<n)      //总和偏小   
  9.         {   
  10.             n2++;       //末尾加数   
  11.             nSum+=n2;   
  12.         }   
  13.         else if(nSum>n) //总和偏大   
  14.         {   
  15.             nSum -= n1; //开头删数   
  16.             n1++;   
  17.         }   
  18.         else //if(nSum==n) //相等就输出结果   
  19.         {   
  20.             for(int t=n1; t<=n2; t++)   
  21.             {   
  22.                 printf("%d,", t);   
  23.             }   
  24.             printf("/n");   
  25.             n2++;       //末尾加数,如果不加就会死循环   
  26.             nSum+=n2;   //这步要小心   
  27.         }   
  28.     }   
  29.     return 0;   
  30. }   

 


原文链接: http://blog.csdn.net/crazyjixiang/article/details/6464438

转载于:https://my.oschina.net/chen106106/blog/51181

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值