打印1到最大的n位数
2017-11-10 09:27
260 查看
题目:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入数字3,则打印出1,2,3一直到最大的三位数999。
这道题中,题目并没有说明n的范围,所以我们需要考虑到大数问题。我们通常用字符串或数组表达大数,字符串里的每个字符都是‘0’到‘9’之间的某一个字符,用来表示数字中的一位,因为数字最大是n位的,因此我们需要一个n+1的字符串(字符串中最后一个是结束字符’\0’)。当实际数字不够n位的时候,在字符串的前半部分补0。
首先我们把字符串中的每一个数字都初始化为‘0’,然后每一次为字符表示的数字加1。
那么什么时候停止给字符串表示的数字加1呢?我们注意到,当字符串为“999…9”时,给字符串加1,就会在第一位上产生进位,此时表示已经到了最大的n位数,循环终止。
第二步,打印数字。这里需要注意的是,比如数字为099,我们需要打印的是99,忽略前面的0。所以,在打印的时候,我们需要从第一个不为0的位开始打印。
当n为2的时候,应该打印出1到99的每个数字。
我们可以想到,其实n未的所有十进制就是在每个位上对0-9进行一次全排列,数字的每一位都有可能是0-9中的一个数。
这道题中,题目并没有说明n的范围,所以我们需要考虑到大数问题。我们通常用字符串或数组表达大数,字符串里的每个字符都是‘0’到‘9’之间的某一个字符,用来表示数字中的一位,因为数字最大是n位的,因此我们需要一个n+1的字符串(字符串中最后一个是结束字符’\0’)。当实际数字不够n位的时候,在字符串的前半部分补0。
首先我们把字符串中的每一个数字都初始化为‘0’,然后每一次为字符表示的数字加1。
那么什么时候停止给字符串表示的数字加1呢?我们注意到,当字符串为“999…9”时,给字符串加1,就会在第一位上产生进位,此时表示已经到了最大的n位数,循环终止。
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; }
第二步,打印数字。这里需要注意的是,比如数字为099,我们需要打印的是99,忽略前面的0。所以,在打印的时候,我们需要从第一个不为0的位开始打印。
void PrintNumber(char* number) { bool isBegining0 = true; int nlength = strlen(number); for (int i = 0; i < nlength; ++i) { if (isBegining0 && number[i] != '0') { isBegining0 = false; } if (!isBegining0) { //打印第一个非0位的数字 printf("%c", number[i]); } } printf("\t"); }
void Print1ToMaxOfDigits(int n) { if (n <= 0) return; char* number = new char[n + 1]; memset(number, '0', n); number = '\0'; while (!InCreament(number)) { PrintNumber(number); } delete[] number; }
当n为2的时候,应该打印出1到99的每个数字。
int main() { Print1ToMaxOfDigits(2); system("pause"); return 0; }
我们可以想到,其实n未的所有十进制就是在每个位上对0-9进行一次全排列,数字的每一位都有可能是0-9中的一个数。
void PrintNumber(char* number) { bool isBegining0 = true; int nlength = strlen(number); for (int i = 0; i < nlength; ++i) { if (isBegining0 && number[i] != '0') { isBegining0 = false; } if (!isBegining0) { //打印第一个非0位的数字 printf("%c", number[i]); } } printf("\t"); }
void PrintDigtit(char* number, int length, int index)
{
if (index == length - 1)
{
PrintNumber(number);
return;
}
for (int i = 0; i < 10; ++i)
{
number[index + 1] = i + '0';
PrintDigtit(number, length, index + 1);
}
}
void PrintMax(int n)
{
if (n <= 0)
return;
char* number = new char[n + 1];
number
= '\0';
for (int i = 0; i < 10; i++)
{
number[0] = i + '0';
PrintDigtit(number, n, 0);
}
delete[] number;
}
相关文章推荐
- 打印1到最大的n位数
- C++实现打印1到最大的n位数
- [3]《剑指offer》17.打印从1到最大的n位数
- 面试题12:打印1到最大的n位数
- 剑指offer—打印1到最大n位数
- 剑指offer——面试题12:打印1到最大的n位数
- 12、打印1到最大的n位数
- 《剑指offer》:[16]打印1到最大的N位数
- 打印1到最大的N位数
- 打印从1到最大的n位数
- 【面试题十二】打印1到最大的n位数
- 打印1到最大的n位数
- 剑指offer 面试题12 打印1到最大的N位数
- 边看边写(打印1到最大的n位数)
- 剑指offer系列源码-打印1到最大的N位数
- 剑指offer 12 -打印1到最大的n位数
- 剑指Offer12打印1到最大的n位数
- 每天一道算法题(15)——打印1到最大的n位数
- 剑指offer之面试题12:打印1到最大的n位数
- 12:打印 1 到最大的 n 位数