Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4757987
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: C/C++

2008-11-05 23:03:57

输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列
这道题应该先好好分析一下,再决定怎么编程。(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);
          }
      }
   }

阅读(1033) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

pushion2008-11-10 14:06:29

另一种方法: 15 = 7 + 8 = 7 * 2 + (0+1) 15 = 4 + 5 + 6 = 4 * 3 + (0 + 1 + 2) 15 = 1 + 2 + 3 + 4 + 5 = 1 * 5 + (0 + 1 + 2 + 3 + 4) 可见,只要判断( num- n * (n-1) /2 ) % n是否为0,就能够知道是否为n个连续数的和。函数很简单: [code] void seq_plus_list(int num) { int val, ind; int i, j; ind = 2; while( 1 ) { val = ind * (ind - 1) / 2; if( val >= num ) break; if( 0 == ( (num - val) % ind ) ) { printf("%d = ", num); j = (num - val) / ind; for(i=1; i