2005年百度之星初赛第一题分析与解答

 

        躺在床上的日子里,一直就觉得需要锻炼下编程能力,意外的想到了百度之星,这个偏向算法的编程比赛。我想分析和解答该比赛的历年试题,自己在算法和编程方面应该会有大幅提升。我也就不罗嗦了,开始第一题。


第一题(共四题 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;
}

第二种方法:则需要利用等差数列的性质。An=A1+(n-1)d 其中An为相邻两数差距为d的第n个数,A1为第一个数。S=A1*n+n(n-1)/2

该题中S 就为需要判定的正整数。A1就是需要我们确定的开始的第一个正整数。为保险可以设 n最大值为A/2 ,然后根据S和n,确定 A1.若能整除则可以得出开始的第一个数a,同时可以根据n来确定输出的连续正整数的个数。我只是说说想法,大家可以自己编程试试的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值