输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列 这道题应该先好好分析一下,再决定怎么编程。(eg 15=7+8=4+5+6=1+2+3+4+5)
1,一个数如果能被奇数个连续正整数之和表示,譬如12=3+4+5 那么中间的数肯定是 12/3,也就是说n是输入的数目,如果K是个奇数, 如果n%K==0(12%3==0)成立,则n肯定可以表示成K个连续的整数之和,而 且最中间的那个数,就是n/k 2 下面考虑K是偶数的情况,n表示为K个连续的数之和,譬如10=1+2+3+4 这个可以看成 (1+2+3) +4 前面是K-1个(奇数个)连续数,中间值是第 k/2个,最后一个是第K个,它的值比中间的值大k/2。 因此 n-k/2 应该是k个中间值,即10-4/2=4*2,其中2是中间值。 即判断 (n-k/2)%k==0 是否成立即可 附上代码,在linux/gcc version 4.0.2上调试编译通过 /* Auther: qiwei.ye@163.com date: 2006.10.7 */ #include <stdio.h> #include <math.h> int main () { int n,middle,i; printf("Please input the number: "); scanf("%d",&n); if(n <1){ printf("please input the number larger than 0 "); exit(-1); } middle=(int)sqrt(2*n); // the min sum of i numbers is (i+1)*i/2
for(i=2; i<=middle; i++) { // i is odd
if( i % 2 ==1) { if( n % i ==0) // 15 % 3
{ int min, max,middle; //printf(" %d could added by %d numbers \n",n,i);
//printf the i numbers
//printf the min &max
middle=n/i; min=middle - i/2; max=middle + i/2; printf("%d could added by %d numbers for %d to %d \n",n,i,min,max); } }else // i is even
{ if( (n-i/2) % i ==0) { int min,max,middle; //printf(" %d could added by %d numbers \n",n,i);
middle=(n -i/2)/i; min=middle-(i-1)/2; max=middle+(i-1)/2+1; printf("%d could added by %d numbers for %d to %d \n",n,i,min,max); } } }
|