1连续数字序列
问题描述:输入一个正整数S ,打印出所有和为 S 的连续正整数序列(至少含有两个数)。例如对于15有3个连续序列分别为1 2 3 4 5;4 5 6和7 8。
输入:一个正整数S (0< S <=10000 ),即连续序列的和。
输出:第一行输出“ANSWER“;第二行以后按如下规则输出。如果有连续序列其和为 S,则逐行输出每个连续序列;其中每行给出一种连续序列,且递增排序序列中数字;当有多个序列时,则按序列第一个数字的递增排序每一行;每行每个数字后都有一个西文空格,每行最后含有一个换行符\n
。如果没有连续序列其和为 S,则不输出任何字符。
样例1:
输入:
15
输出:
ANSWER
1 2 3 4 5
4 5 6
7 8
样例2:
输入:
4
输出:
ANSWER
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main (){
//以1为初始数字,依次加这个数后面的几个数,一直到大于或等于目标数字为止。
//如果大于目标数字,那么初始的数字值就加一
//如果等于这个数,则输出结果,然后再把初始数字加一
//如此循环往复,知道初始数字大于目标数字的1/2+1为止(为什么是到一半+1这个位置呢
//超过这个数的一半了必定不可能有连续的数相加等于这个数了
//比如15,一半的位置+1是8,8加上任何大于8的数都不可能 在等于15了
//当然把这个程序的初始位置的最大值设置成目标数字减1也行,只不过效率不高。
int aim;
scanf("%d" ,&aim);
int half=(aim/2+1);
int start;//标记初始位置
int end;//标记结束位置
printf("ANSWER\n");
int i;
for(i=1;i<half;i++){
start=i;
int sum=0;//没开启新一轮的寻找都把初始和变成0
for(end=i;end<half+1;end++){//寻找结束位置
sum+=end;
if(sum==aim){
int k;
for(k=start;k<=end;k++){
printf("%d ",k);
}
printf("\n");
break;
}//找到之后跳出内层循环进入下一轮
else if(sum>aim){
break;
}
}
}
}