C++初學者之依據輸出的任何一個正整數,輸入能夠被表現的持續正整數。本站提示廣大學習愛好者:(C++初學者之依據輸出的任何一個正整數,輸入能夠被表現的持續正整數)文章只能為提供參考,不一定能成為您想要的結果。以下是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。請拍磚,^_^
#include <iostream>
#include <vector>
using namespace std;
// 依據輸出的任何一個正整數,輸入能夠被表現的持續正整數
void Numbers(int number)
{
if (number <= )
{
return;
}
vector<int> save;
bool exist = false;
// 遍歷能夠的肇端值
for (int possible = ; possible < number / + ; possible++)
{
int start = possible;
int i = start;
int sum = ;
while (sum <= number) // 保留可以表現的持續正整數並輸入
{
sum += start;
if (sum == number)
{
exist = true;
for (; i < start + ; i++)
{
save.push_back(i);
}
for (i = ; i < save.size(); i++)
{
cout << save[i] << " ";
}
save.clear(); // 清空、預備保留下一能夠的序列
cout << endl;
}
start++;
}
}
if (false == exist)
{
cout << "NONE" << endl;
}
}
int main(int argc, char **argv)
{
const int number = ;
Numbers(number);
Numbers();
return ;
}
以上所述是小編給年夜家引見的C++初學者之依據輸出的任何一個正整數,輸入能夠被表現的持續正整數,願望對年夜家有所贊助!