【演算法詳解】列印1到最大的n位數
1. 問題描述
輸入數字n,按順序列印出從1到最大的n位十進位制數。
比如輸入3,則列印出1,2,3,... ,一直到最大的3位數即 999.
注意的問題:考慮大數的情形導致的溢位。
2. 演算法1
使用字串陣列表示大數,在字元陣列上模擬整數的加法(加 1 );
字串陣列中每個元素都是 ‘0’ 到 ‘9’ 之間的某一個字元。初始化時將每一個字元都設定為 ‘0’, 相當於整數 0 .
#include <iostream>
#include <string>
using namespace std;
// print the integers characters array.
// if current interger is 123, the integer characters array looks like as below
// a[0], a[1], a[2], a[3]
// '3' '2' '1' '0'
// the order is opposite to real interger order, so we need to print the characters array form the first non '0' element with reversed order.
void printInteger(char* pStrIntegers, int size)
{
if (pStrIntegers == NULL || size <= 0)
{
return;
}
bool isPrint = false;
for (int i = size - 1; i >= 0; i--)
{
if (!isPrint)
{
if(pStrIntegers[i] != '0')
{
isPrint = true;
cout<<pStrIntegers[i];
}
}else
{
cout<<pStrIntegers[i];
}
}
cout<<endl;
}
// add 1 to current integer, mock addition operation on the charaters array.
bool incrementone(char* pStrIntegers, int size)
{
if (pStrIntegers == NULL || size <= 0)
{
return false;
}
bool isValid = true;
// for 0 ~ size-1 th elements
// try to add 1 from the first character: pStrIntegers[0]
// from 1th element to nth elements
for (int i = 0; i < (size - 1); i++)
{
if (pStrIntegers[i] != '9')
{
pStrIntegers[i] = pStrIntegers[i] + 1; // if current character is not '9', then just add 1 on current characte.
break; // end this increment, add 1 successfully.
}else
{
// current character is '9', adding 1 should carry.
// go to next character element, meanwhile set current character to '0'.carry
pStrIntegers[i] = '0';
// if current character is in the last valid index, this increment is invalid, as current character should be like "999..999".
if (i == (size - 2))
{
isValid = false;
}
}
}
return isValid;
}
void printToMaxOfInteger(int n)
{
if (n <= 0)
{
cout<<"Invalid n = "<<n<<endl;
return;
}
cout<<"Start to print n = "<<n<<endl;
// declare a character array with capacity n + 1
char strIntegers[n + 1];
// initialize all the characters as '0'.
for (int i = 0; i <= n; i++)
{
strIntegers[i] = '0';
}
// start to increment by 1.
while (incrementone(strIntegers, n + 1))
{
printInteger(strIntegers, n + 1);
}
}
int main(int argc, const char * argv[])
{
printToMaxOfInteger(3);
printToMaxOfInteger(-1);
printToMaxOfInteger(0);
return 0;
}
2. 演算法2
使用全排列。
參考:劍指offer 名企面試官精講典型程式設計題》 - 面試題12:列印1到最大的n位數
相關文章
- 劍指offer面試題12 列印1到最大的n位數面試題
- 劍指 Offer 列印從1到最大n位數c++C++
- LeetCode題解(Offer17):列印從1到最大的n位數(Python)LeetCodePython
- [每日一題] 第二十四題:列印從1到最大的n位數每日一題
- 劍指Offer-17-列印從1到最大的n位數-Java程式碼實現(兩種思路)Java
- ACM n-1位數ACM
- 演算法 1~n中1的次數演算法
- 小於n的最大數
- 【演算法題解】485. 最大連續1的個數 - Java演算法Java
- 1,2,3…n*n 的數字按照順時針螺旋的形式列印成矩陣(遞迴)矩陣遞迴
- (演算法)求1到1億間的質數或素數演算法
- 詳解IIS最大併發連線數
- 從最大似然到EM演算法淺解演算法
- 生成{1,2,...,n}的排列的演算法-組合數學演算法
- 查詢數N二進位制中1的個數(JS版 和 Java版)JSJava
- poj3252 數位dp(所有比n小的二進位制位0的個數不少於1的個數)記憶化搜尋
- 【Algorithm】《劍指offer》面試題32----從1到n整數中1出現的次數Go面試題
- 最大公約數的演算法演算法
- 【演算法詳解】求解數值的整數次方演算法
- 【刷演算法】二進位制中1的個數演算法
- 階乘之和 輸入n,計算S=1!+2!+3!+…+n!的末6位(不含前導0)。n≤10 6 ,n!表示 前n個正整數之積。
- 生成k個不同的隨機數,從m到n,並輸出最大值的程式程式碼隨機
- python 數字 十六進位制 列印Python
- 求最大公公約數(最大公因數)—— 歐幾里得演算法演算法
- .C++整數的N進位制字串表示C++字串
- YT14-HDU-求N^N的個位數(暴力破解版)
- 按字典序生成{1,2,...,n}的r子集的演算法-組合數學演算法
- 透過裝飾器列印最大值與根據傳入引數進行列印次數
- 非1~2^n數列的自然數密碼《一》密碼
- 非1~2^n數列的自然數密碼《一A》密碼
- 非1~2^n數列的自然數密碼《二》密碼
- 非1~2^n數列的自然數密碼《二A》密碼
- 小於n的最大數,記一道位元組面試題面試題
- Python計算1到n的和常用方法!Python
- javascript列印1-100內的質數JavaScript
- 演算法訓練 - 調和數列問題 輸入一個實數x,求最小的n使得,1/2+1/3+1/4+...+1/(n+1)>=x。 輸入的實數x保證大於等於0.01,小於等於5.20,並且恰好有兩位小數。你的演算法
- 【演算法拾遺】最大數和最小數演算法
- 垃圾回收的引用計數器演算法詳解演算法