百度之星程序设计大赛试题-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);
}
}

浙公网安备 33010602011771号