百度之星程序设计大赛试题-1 (含全部源代码)

第一题(共四题100分):连续正整数(10分)

题目描述:一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如:

15=1+2+3+4+5
15=4+5+6
15=7+8

请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。

输入数据:一个正整数,以命令行参数的形式提供给程序。

输出数据:在标准输出上打印出符合题目描述的全部正整数序列,每行一个序列,每个序列都从该序列的最小正整数开始、以从小到大的顺序打印。如果结果有多个序列,按各序列的最小正整数的大小从小到大打印各序列。此外,序列不允许重复,序列内的整数用一个空格分隔。如果没有符合要求的序列,输出“NONE”。

例如,对于15,其输出结果是:
1 2 3 4 5
4 5 6
7 8
对于16,其输出结果是:
NONE

晕倒,这么题目出啊: (n>=2) 是大于等于2的意思,一般人还真看不懂

我的解答代码一:比较老土

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "cd.h"

void main(int argv, char *argvc[])
{
unsigned int calcdigital = 0; int i = 0;
if(argv<2){return;}

calcdigital = atoi(argvc[1]);
for(i = 1;i<= ((calcdigital / 2)) +1;i++)
{
           add(calcdigital, i);
}

}

//=================cd.h====================

#define           MAX 100

typedef struct
{
unsigned int digital;
}item;

typedef struct
{
int n;
item item[MAX];
}items;

int assign_items(items *items, unsigned int digital)
{
items->n++;
items->item[items->n].digital = digital;
return 1;
}

int print_items(items *items, unsigned int calcdigital)
{
int i = 0;
if(items->n > 0 )
{
           printf("%d = ", calcdigital);
           for(i=1; i<=items->n; i++)
           {
            printf("%d", items->item[i].digital);
            if(i<items->n){printf(" + ");}
           }
           printf("\n");
           return 1;
}
return 0;
}

void add(unsigned int calcdigital, int begin)
{
int i = 0;
items aitems;
unsigned int result = 0;
aitems.n = 0;

for(i = begin;i<= ((calcdigital / 2)) +1;i++)
{
           result = result + i;
           assign_items(&aitems, i);
           if (result == calcdigital) {print_items(&aitems, calcdigital);}
           if (result > calcdigital){ return;};
}
}

测试结果(TC 20.编译运行通过):http://www.freewebs.com/killgoogle/MAIN.rar

E:\c\calcdigital\release>calcdigital 150
150 = 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17
150 = 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18
150 = 28 + 29 + 30 + 31 + 32
150 = 36 + 37 + 38 + 39
150 = 49 + 50 + 51

算法二(高人的指点、MD我写的还不一定对)(TC 20.编译运行通过): http://www.freewebs.com/killgoogle/MAIN2.rar

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int print_result(int m, float n)
{
int i = 0;
if ( (m % 2) == 0)
{
if( (int)(n - ((m -1)*0.5)) >0 )
{
          for(i = 1; i<= m / 2; i++)
          {
           printf("%d + ", (int)(n - ((m -i)*0.5)));
          }

          for(i = 1; i<= m / 2; i++)
          {
           if(i<( m / 2))
            printf("%d + ", (int)(n + ((m - i)*0.5)));
           else
            printf("%d", (int)(n + ((m - i)*0.5)));
          }
          printf("\n");
}
}
else
{
if( ((int)n - ((m -1)/ 2)) >0 )
{
          for(i = 1; i<= ((m -1)/ 2); i++)
          {
           printf("%d + ", (int)n - i);
          }
          printf("%d + ", (int)n);
          for(i = 1; i<= ((m -1)/ 2); i++)
          {
           if(i< ((m -1)/ 2))
           {
            printf("%d + ", (int)n + i);
           }
           else
           {
            printf("%d", (int)n + i);
           }
          }
          printf("\n");
}
}
return 1;
}

void divide(unsigned int calcdigital, int m, int canstop)
{
int i = 0;
int in = 0;
float n;
n = ((float)calcdigital / (float)m);
in = (int)n;

          if( (m % 2) == 0)
          {
           if( (int)(n * 2) == (n+n) )
           {
            print_result(m, n);
           }
          }
          else
          {
           if((int)n ==n)
           {
            print_result(m, n);
           }
          }

}

void main(int argv, char *argvc[])
{
unsigned int calcdigital = 0; int i = 0;
int m = 2 , canstop = 0; float n = 0.0;
if(argv<2){return;}

calcdigital = atoi(argvc[1]);
for(i = 2;i<= ((calcdigital / 2)) +1;i++)
{
          divide(calcdigital, i, canstop);
}

}

posted @ 2007-05-24 19:32  海浪~~  阅读(657)  评论(2)    收藏  举报