打印1到最大的n位数

来源:互联网 发布:数据挖掘电脑配置 编辑:程序博客网 时间:2024/05/29 12:42

//输入数字n,按顺序打印出从1最大的n位十进制数。//比如输入3,则打印1、2、3一直到最大的3位数即999.#include "iostream"#include "string"#include "vector"using namespace std;//用一个string做加法器void stringAdd(string &str){if (str.empty()){str = "1";return;}int len = static_cast<int>(str.size());for (int i = len - 1; i >= 0; i--){if (str[i] == '9')str[i] = '0';else{str[i]++;return;}}str = "1" + str;return;}void print1ToMaxOfNDigits_1_str(int n){if (n <= 0)return;string max = string(n, '9');string str("1");while (str != max){cout << str << ",";stringAdd(str);}cout << str << endl;}//做一个vector的加法器void vectorAdd(vector<int> &vec){if (vec.empty()){vec.push_back(1);return;}for (size_t i = 0; i < vec.size(); i++) //index大小正比位数高低{if ((vec[i]) == 9)vec[i] = 0;else{vec[i] += 1;return;}}vec.push_back(1);return;}void printVecAsNum(const vector<int> &num){for (int i = static_cast<int>(num.size()) - 1; i >= 0; i--){cout << num[i];}}bool MaxofNDigits(const vector<int> &vec, int n){if (vec.size() < n)return false;for (size_t i = 0; i < vec.size(); i++){if (vec[i] != 9)return false;}return true;}void print1ToMaxOfNDigits_1_vec(int n){if (n <= 0)return;vector<int> num;vectorAdd(num);while (!MaxofNDigits(num, n)){printVecAsNum(num);cout << ",";vectorAdd(num);}printVecAsNum(num);cout << endl;}//转化成全排列问题void printNum(char* num){int len = strlen(num);int i = 0;while (num[i] == '0')i++;while (i < len){printf("%c", num[i]);i++;}printf("\t");  //这里格式就没用“,”隔开了,更简单了。}void print1ToMaxOfNDigitsRecursively(char* num, int len, int index){if (index == len - 1){printNum(num);return;}for (int i = 0; i < 10; i++){num[index + 1] = i + '0';print1ToMaxOfNDigitsRecursively(num, len, index + 1);}}void print1ToMaxOfNDigits_1_permutation(int n){if (n <= 0)return;char* num = new char[n + 1];num[n] = '\0';for (int i = 0; i < 10; i++){num[0] = i + '0';print1ToMaxOfNDigitsRecursively(num, n, 0);}delete[] num;}void test(){print1ToMaxOfNDigits_1_str(-1);print1ToMaxOfNDigits_1_str(0);print1ToMaxOfNDigits_1_permutation(2);print1ToMaxOfNDigits_1_str(5);}int main(){test();return 0;}

三种方法,个人更倾向于string的方法。(关于输出格式,可以根据需求更改。)


这里主要是考虑大数问题,如果对效率要求高,可以甚至阈值,当小于某个数max(int)-1,直接递增输出。大于之后才用其他的方法。


0 0
原创粉丝点击