C++初学者---根据输入的任何一个正整数,输出可能被表示的连续正整数

题目描述:一个正整数有可能可以被表示为 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

这是一道2005年百度之星程序设计大赛试题初赛题目。思路如下:

1、满足要求的数是连续的,所以只要选定起始值累加求和即可;

2、要确保遍历所有可能的起始值并且让循环的次数尽量少。分析一下可以知道,一个数最少由两个数求和构成,又因为这两个数是连续的。所以最大的起始值不会大于该数的二分之一。

代码如下,VC6.0验证OK。请拍砖,^_^

 1 #include <iostream>
 2 #include <vector>
 3
 4 using namespace std;
 5
 6 // 根据输入的任何一个正整数,输出可能被表示的连续正整数
 7 void Numbers(int number)
 8 {
 9     if (number <= 0)
10     {
11         return;
12     }
13
14     vector<int> save;
15     bool exist = false;
16     // 遍历可能的起始值
17     for (int possible = 1; possible < number / 2 + 1; possible++)
18     {
19         int start = possible;
20         int i = start;
21         int sum = 0;
22         while (sum <= number) // 保存可以表示的连续正整数并输出
23         {
24             sum += start;
25             if (sum == number)
26             {
27                 exist = true;
28                 for (; i < start + 1; i++)
29                 {
30                     save.push_back(i);
31                 }
32
33                 for (i = 0; i < save.size(); i++)
34                 {
35                     cout << save[i] << " ";
36                 }
37                 save.clear(); // 清空、准备保存下一可能的序列
38                 cout << endl;
39             }
40             start++;
41         }
42     }
43
44     if (false == exist)
45     {
46         cout << "NONE" << endl;
47     }
48 }
49
50 int main(int argc, char **argv)
51 {
52     const int number = 21;
53     Numbers(number);
54     Numbers(16);
55
56     return 0;
57 }

时间: 2024-11-01 01:07:32

C++初学者---根据输入的任何一个正整数,输出可能被表示的连续正整数的相关文章

////输入一个100以内的数,判断是不是正整数;

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 练习4 { class Program { static void Main(string[] args) { ////输入一个100以内的数,判断是不是正整数: Console.WriteLine("请输入一个整数"); int a = Convert.ToInt32(Console.ReadL

输入一个正数 n,输出所有和为 n 连续正数序列。 java实现

用了半小时才写出来啊, 其实这种思路应用范围很广,利用有序性这个特点,比如本体只要是有序就行,例如两个集合是有序的,求交集,有序数组的查找,有序数组的归并,有序有了优化的可能. 输入一个正数 n,输出所有和为 n 连续正数序列         例如输入 15,由于 1+2+3+4+5=4+5+6=7+8=15,所以输出 3 个连续序列 1-5.4-6 和 7-8.         分析:我们用两个数small和big分别表示序列的最小值和最大值.首先把small初始化为 1,big初始化为 2.

自动切换输入焦点的一个小&quot;插件&quot;

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <style> form{ margin-bottom:10px; } form#inputs>input,form#inputs2>input,form#inputs3>input{ width:40px; height:40px; border-right-co

客户端一个http连接包含两个方向,一个是这个http连接的输入,另一个是这个http连接的输出。

1.客户端一个http连接包含两个方向,一个是这个http连接的输入,另一个是这个http连接的输出. 利用httpclient进行ip地址和端口号连接后,http的输出端作为http请求参数设置.http输出端用于http请求设置. http输入端,用于接收服务端传回来的数据. 其中有个关键的http.openConencetion()方法来启动连接.和httpConn.getInputStream()用于接收服务器端返回的数据. 1.客户端获取json字符串 public class Htt

找出输入中的一个或多个匹配的字符串

//找出输入中的一个或多个匹配的字符串. 这里使用的是Mather类的find方法,来查找匹配的内容 package match; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxE

编写一个程序从键盘输入字符,并按要求输出

从键盘输入字符,并按要求输出.下面有几点说明: (1)这里的getchar()函数为字符输入函数,putchar()函数为字符输出函数. (2) EOF是end of file的缩写.表示"文字流"(stream)的结尾,!=EOF表示文件还没有结束. (3) continue只能放到循环体中,它只把循环体从continue及以下的部分忽略掉,不影响程序的循环. #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int 

26.打印所有和为S的连续正整数序列

http://zhedahht.blog.163.com/blog/static/25411174200732711051101 题目: 输入一个正数n,输出所有和为n连续正数序列.例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5.4-6和7-8. 分析: 这是网易的一道面试题.这道题和本面试题系列的第10题有些类似.我们用两个数small和big分别表示序列的最小值和最大值.首先把small初始化为1,big初始化为2.如果从small到big的序列的

编程算法 - 和为s的连续正整数序列 代码(C)

和为s的连续正整数序列 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个正数s, 打印出所有和为s的连续正数序列(至少含有两个数). 起始于1, 2, 相加, 如果相等则返回, 如果小于, 则前端递增右移, 如果大于, 则后端递增右移, 一直到后端移动到s的一半位置. 因为两个数, 小数为一半, 大数为一半加一, 则必然结束. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author:

C语言 &#183; 连续正整数的和

算法训练 连续正整数的和 时间限制:1.0s   内存限制:256.0MB 问题描述 78这个数可以表示为连续正整数的和,1+2+3,18+19+20+21,25+26+27. 输入一个正整数 n(<=10000) 输出 m 行(n有m种表示法),每行是两个正整数a,b,表示a+(a+1)+...+b=n. 对于多种表示法,a小的方案先输出. 样例输入 78 样例输出 1 1218 2125 27 作者注释:将1~i的和存进数组中的第i个元素,此时只用判断两个元素的差是否等于n,满足则按格式输出