码迷,mamicode.com
首页 > 其他好文 > 详细

整数拆分

时间:2014-08-19 23:59:25      阅读:473      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   for   div   log   ad   

将一个整数N拆分成n个连续自然数的和。例如:

15 = 1+2+3+4+5

15 = 4+5+6

15 = 7+8

实现一个函数,打印所有可能,并且统计有多少种方法?

分析过程如下。

对于一个数N,

2个自然数相加:m+(m+1)                                                                                                                  =2m+1

3个自然数相加:(m-1)+m+(m+1)                                                                                                        =3m

4个自然数相加:(m-1)+m+(m+1)+(m+2)                                                                                             =2(2m+1)

5个自然数相加:(m-2)+(m-1)+m+(m+1)+(m+2)                                =5m

6个自然数相加:(m-2)+(m-1)+m+(m+1)+(m+2)+(m+3)                            =3(2m+1)

7个自然数相加:(m-3)+(m-2)+(m-1)+m+(m+1)+(m+2)+(m+3)                         =7m

8个自然数相加:(m-3)+(m-2)+(m-1)+m+(m+1)+(m+2)+(m+3)+(m+4)                   =4(2m+1)

9个自然数相加:(m-4)+(m-3)+(m-2)+(m-1)+m+(m+1)+(m+2)+(m+3)+(m+4)              =9m

可以总结:

对于一个整数N

如果可以表示为偶数个整数连加,则有k*(2m+1),其中k,m是自然数;

如果可以表示为奇数个整数连加,则有k*m,其中k为奇数,m为自然数。

此外,还要注意,对于偶数的情况,累加的表达式可以总结为m+i,范围是i = 1-k:1:k

对于奇数的情况,累加的表达式可以总结为m+i,范围是i = -k/2:1:k/2

因此,综上可以可以得出最终的程序如下所示:

 

 1 int PrintContinuousAdd(int source) {
 2 
 3     int count = 0;
 4 
 5     // error check
 6 
 7     if(source<3){
 8 
 9         cout<<"error"<<endl;
10 
11     }
12 
13     else {
14 
15         // the right situation
16 
17         int m = 0;
18 
19         int k = 0;
20 
21         int beg = 0;
22 
23         int i = 0;
24 
25         for(m=1;m<=source/2;m++) {
26 
27             if(!(source%(2*m+1))) {
28 
29                 k = source/(2*m+1);
30 
31                 beg = 1-k;
32 
33                 if(m+beg>0) {
34 
35                     for(i=beg;i<=k;i++) {
36 
37                         cout<<m+i<<" ";
38 
39                     }
40 
41                     cout<<endl;
42 
43                     count++;
44 
45                 }
46 
47             }
48 
49             if(!(source%m)) {
50 
51                 k = source/m;
52 
53                 if(1==k%2) {
54 
55                     beg = 0-k/2;
56 
57                     if(m+beg>0) {
58 
59                         for(i=beg;i<=(0-beg);i++) {
60 
61                             cout<<m+i<<" ";
62 
63                         }
64 
65                         cout<<endl;
66 
67                         count++;
68 
69                     }
70 
71                 }
72 
73             }
74 
75         }
76 
77     }
78 
79     return count;
80 
81 }

 

整数拆分,布布扣,bubuko.com

整数拆分

标签:style   blog   color   io   for   div   log   ad   

原文地址:http://www.cnblogs.com/warnet/p/3923513.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!