躺在床上的日子里,一直就觉得需要锻炼下编程能力,意外的想到了百度之星,这个偏向算法的编程比赛。我想分析和解答该比赛的历年试题,自己在算法和编程方面应该会有大幅提升。我也就不罗嗦了,开始第一题。
第一题(共四题 100 分):连续正整数( 10 分)
题目描述:一个正整数有可能可以被表示为 n(n>=2) 个连续正整数之和,如:
15=1+2+3+4+5
15=4+5+6
15=7+8
请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。
分析思路:第一种:尝试法,即从第一个数为1 开始的若干连续正整数是否可以表示该正整数。依次尝试从2,3,4,......开始的连续正整数。那么这就会产生一个问题,并不是所有的正整数都需要尝试一遍。大家不难想出,如果要求的正整数为A,那么尝试的最大数不超过 A/2。
因此可以通过两层循环来解决问题。外层为i,是开始尝试的最小正整数当然从1开始。内部循环 当然需要 进行 A-i,A-i-1......的操作,来判断是否该连续正整数满足条件。
以下为代码部分:
// astar0501.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
int main()
{
int u32_input,u32_thre,u32_first,u32_last,u32_temp;
int i=1,j,k=0;
printf("please input the number !\n");
scanf("%d",&u32_input);
u32_thre = u32_input/2+1; //确定外循环上限
while (i < u32_thre)
{
u32_first = i; //如果满足条件 则需记录开始输出的最小正整数
u32_temp = u32_input;
j = i;
while(u32_temp > 0) //判断该连续正整数是否满足
{
u32_temp -= j;
u32_last = j; //记录最后一位正整数
j++;
}
if(u32_temp == 0) //若该连续正整数满足条件
{
while(u32_first <= u32_last) //依次输出该正整数
{
printf("%d \t",u32_first);
u32_first++;
}
printf("\n");
k = 1; //用于判断该正整数是否能够被连续正整数表示 为1则可以 为0 则不能
}
i++; //外循环自动增加,判断下一组连续正整数
}
if(k == 0) //表示该正整数不能被连续正整数表示
{
printf("None!\n");
}
return 0;
}
该题中S 就为需要判定的正整数。A1就是需要我们确定的开始的第一个正整数。为保险可以设 n最大值为A/2 ,然后根据S和n,确定 A1.若能整除则可以得出开始的第一个数a,同时可以根据n来确定输出的连续正整数的个数。我只是说说想法,大家可以自己编程试试的。