JZ-C-41-Plus

剑指offer第四十一题-拓展:和为s的连续正数序列:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)

 1 //============================================================================
 2 // Name        : JZ-C-41-Plus.cpp
 3 // Author      : Laughing_Lz
 4 // Version     :
 5 // Copyright   : All Right Reserved
 6 // Description : 和为s的连续正数序列:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)
 7 //============================================================================
 8 
 9 #include <iostream>
10 #include <stdio.h>
11 using namespace std;
12 
13 void PrintContinuousSequence(int small, int big);
14 
15 void FindContinuousSequence(int sum) {
16     if (sum < 3)
17         return;
18 
19     int small = 1;
20     int big = 2;
21     int middle = (1 + sum) / 2;
22     int curSum = small + big; //这里curSum其实是从small到big之间所有数字的累加和
23 
24     while (small < middle) {
25         if (curSum == sum)
26             PrintContinuousSequence(small, big);
27 
28         while (curSum > sum && small < middle) {
29             curSum -= small; //每次更新curSum值
30             small++;
31 
32             if (curSum == sum)
33                 PrintContinuousSequence(small, big);
34         }
35 //        while (curSum <= sum && small < middle) { //自己写的还是不如源码啊。。清晰却不简洁
36 //            big++;
37 //            curSum += big;
38 //            if (curSum >= sum)
39 //                break;
40 //        }
41         big++;
42         curSum += big; //每次更新curSum值
43     }
44 }
45 
46 void PrintContinuousSequence(int small, int big) {
47     for (int i = small; i <= big; ++i)
48         printf("%d ", i);
49 
50     printf("\n");
51 }
52 
53 // ====================测试代码====================
54 void Test(char* testName, int sum) {
55     if (testName != NULL)
56         printf("%s for %d begins: \n", testName, sum);
57 
58     FindContinuousSequence(sum);
59 }
60 
61 int main(int argc, char** argv) {
62     Test("test1", 1);
63     Test("test2", 3);
64     Test("test3", 4);
65     Test("test4", 9);
66     Test("test5", 15);
67     Test("test6", 100);
68 
69     return 0;
70 }

 

转载于:https://www.cnblogs.com/Laughing-Lz/p/5615247.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值