【面试题】剑指offer12--打印1到最大的n位数

来源:互联网 发布:淘宝雪花代码在线生成 编辑:程序博客网 时间:2024/06/15 00:26
输入数字n,按顺序打印从1到最大的n位十进制数。

例如输入3,则打印出1,2,3,一直到最大的三位数999。

首先,我们使用一个库函数pow,用10的n次方,计算出最小的(n+1)位数,再减去1

就可以得到最大的n位数。

代码的实现:

//打印1到最大的n位数//输入数字n,按顺序打印从1到最大的n位十进制数。//例如输入3,则打印出1,2,3,一直到最大的三位数999。#include<iostream>using namespace std;#include<math.h>void Print1ToN(int n){int MaxNum = pow(10, n)-1;int i = 1;for (i = 1; i <= MaxNum; i++){printf("%10d", i);}cout << endl;}int main(){int n = 0;cout << "请输入n的值->";cin >> n;Print1ToN(n);printf("\n");system("pause");return 0;}
但是这种简单的方法会有很多的弊端,如果遇到特别大的n时,会出现一些问题。

后来就是用了字符的方法:

//打印1到最大的n位数//输入数字n,按顺序打印从1到最大的n位十进制数。//例如输入3,则打印出1,2,3,一直到最大的三位数999。#include<iostream>using namespace std;#include<math.h>bool Increament(char* number){bool isOverflow = false;int nTakeOver = 0;int nLength = strlen(number);for (int i = nLength - 1; i >= 0; i--){int nSum = number[i] - '0' + nTakeOver;if (i == nLength - 1){nSum++;}if (nSum >= 10){if (i == 0){isOverflow = true;}else{nSum -= 10;nTakeOver = 1;number[i] = '0' + nSum;}}else{number[i] = '0' + nSum;break;}}return isOverflow;}void PrintNumber(char* number){bool isBeginning0 = true;int nLength = strlen(number);for (int i = 0; i < nLength; i++){if (isBeginning0&&number[i] != '0'){isBeginning0 = false;}if (!isBeginning0){printf("%c", number[i]);}}printf("\t");}void Print1ToN(int n){if (n <= 0){return;}char *number = new char[n + 1];memset(number, '0', n);number[n] = '\0';while (!Increament(number)){PrintNumber(number);}delete []number;}int main(){int n = 0;cout << "请输入n的值->";cin >> n;Print1ToN(n);printf("\n");system("pause");return 0;}
用这种方法可以更准确的计算出结果。

运行结果如下:






原创粉丝点击