打印1到最大的n位数:
这里一个很重要的概念就是n位数,不知道n为多大,那么需要用一个字符来表示一个大数
这里用string来表示大数,为了打印的时候方便,这里需要模拟一个字符的加法操作
另外,之前实现过大数的乘法,异曲同工:
http://blog.csdn.net/xietingcandice/article/details/44729323
#include<iostream> #include<string> using namespace std; int Incrument(string& num,int n) { int length = num.length(); bool overflag = false; int nextflag = 0;//<标示进位符号 for (int i = length-1; i>=0;i--) { int nSum = num[i]-'0'+nextflag; if (i == length-1) { nSum++;//<最后一位加上1 } if (nSum < 10) { num[i] = nSum+'0'; break; } if (nSum >= 10) { if (i == 0 && length == n)//<标示最高位进位了,标识需要退出程序 { overflag = true; break; } num[i] = nSum-10+'0'; nextflag = 1; if (i == 0)//<如果最低位进位,那么string需要扩展,如果这里不用string利用char那么在输出的时候有一定操作 { num = '1'+num; } } } return overflag; } void PrintNum(string num) { for (int i = 0; i < num.length(); i++) { cout << num[i]; } cout << endl; } void PrintMax(int n) { string num = "0";//<输出的数据 if(n == 0) { return; } while (!Incrument(num,n)) { PrintNum(num); } } int main() { PrintMax(4); return 0; }
因为题目是只需要打印出这些数据,因此也可以直接利用数字的全排列的特点:
全排列,基本就是一个循环加上遍历的过程
#include<iostream> #include<string> using namespace std; void PrintNum(char* num,int n) { int flag = true; for (int i = 0; i <n; i++) { if(flag) { if (num[i] == '0') { continue; } else { cout<<num[i]; flag = false; } } else { cout<<num[i]; } } if (!flag) { cout<<endl; } } void PrintRecursively(char* num, int n, int index) { if(index == 0) { PrintNum(num,n); return; } for (int i = 0; i < 10; i++) { num[index-1] = i+'0'; PrintRecursively(num,n,index-1); } } void PrintMax(int n) { char *num = new char[n]; if(n == 0) { return; } for (int i = 0; i < 10; i++) { num[n-1] = i+'0'; PrintRecursively(num,n,n-1); } delete []num; } int main() { PrintMax(2); return 0; }
时间: 2024-11-05 13:47:46