算法之连续整数之和

首先以,1000为例

设这组数的平均数为X,个数为N。

1.当N为奇数时,X为整数。( X等于N个数中的中位数 )此时,N是1000的因数中的奇数,共计有N=1,N=5,N=25,N=125四种,则对应的X分别为X=1000,200,40,8;
2.当N为偶数是,X为小数位为0.5的小数,那么2X是个奇数,令2X=Y,则有N*Y=2000,此时,Y是2000的因数中的奇数共计有Y=1,5,25,125四种,则对应的N为2000,400,80,16。X=0.5,2.5,12.5,62.5
所以一共有8组连续整数之和等于2000。
N=1时,1000;
N=5时,198,199,200,201,202
N=25时,28,29,。。。,40,。。。,51,52
N=125时,-54,-53,。。。,8,。。。,69,70
N=16时,55,56,。。。,62,63,。。。,69,70
N=80时,-27,-26,。。。,12,13,。。。51,52
N=400时,-197,-196,。。。,2,3,。。。,201,202
N=2000时,-999,-998,。。。,0,1,。。。999,1000

上面的分析方法含有负数的分组。
如果考虑只有连续的正整数,该如何处理呢?
一个正整数M,最长的连续整数的个数是:从1开始 n(n+1)/2 = M;其中n就是和为M的最长的连续整数的长度。n <= sqrt(2*M)
所以在要使全部为正整数的话,就要保证所有的分组中,每一组中正整数的个数不超过n

在第一种情况下,找到N<=n的个数c1;
在第二种情况下,找到2N/Y <= n的个数 c2;
最终结果 C1+C2;

在这里贴出自己最近的一道题目以及个人解题

★实验任务
大部分的正整数可以表示为2 个以上连续整数之和。例如

6 = 1 + 2 + 3

9 = 5 + 4=2+3+4
现在要求计算给定的正整数可以表示为多少个2 个以上连续整数之和(即有多少种划分方案)。
★数据输入
输入数据只有一行,一个正整数N(1<=N<=1000)。
★数据输出
输出相应的连续整数分解方案的个数。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 int main()
 5 {
 6     int i = 1,N,count=0;
 7     scanf("%d",&N);
 8     int max = (int)(sqrt(2*N));
 9     while(i < N){ //组数为奇数
10         if(i%2==1 && N%i==0 && N/i<=max ){
11             count++;}
12         i++;
13     }
14     i = 0;
15     while(i<2*N){
16         if(i%2==1 && 2*N%i==0 && 2*N/i<=max ){
17             count++;}
18         i++;
19     }
20     printf("%d\n",count);
21     return 0;
22 }

 

转载请标注 http://home.cnblogs.com/u/plxx/

 
posted @ 2014-09-26 20:10  平林新袖  阅读(2203)  评论(0编辑  收藏  举报