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++初學者之依據輸出的任何一個正整數,輸入能夠被表現的持續正整數,願望對年夜家有所贊助!