首先以,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 ",count); 21 return 0; 22 }
转载请标注 http://home.cnblogs.com/u/plxx/