剑指Offer-打印从 1 到最大的 n 位数
Posted codeapes666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer-打印从 1 到最大的 n 位数相关的知识,希望对你有一定的参考价值。
题目
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数999。
解法探析
解法 1
看完这道题目之后,我们一般都会想到先求出最大的 n 位数,再用一个循环从 1 开始逐个打印。代码如下所示:
int Print1ToMaxOfNDigits(int n)
{
int number = 1;
int i = 0;
while (i++ < n) {
// 求出最大的 n 位数
number *= 10;
}
for (i = 1; i < number; ++i) {
printf("%d ", i);
}
return 0;
}
仔细分析会发现题目中没有规定 n 的范围,当 n 很大时,代码中不管是用整型(int)或长整形(long long)最终都会溢出,故这里就要考虑一下大数处理的问题。
解法 2
对于大数问题的处理,我们一般能想到的方法是用字符串或者数组。
Print1ToMaxOfNDigits函数
int Print1ToMaxOfNDigits(int n)
{
// n 小于等于 0 时不符合条件,则异常退出
if (n <= 0) {
return 1;
}
// 给表示数字的字符串 number 申请 n + 1 个char类型大小的内存空间
char* number = (char*)malloc(sizeof(char) * (n + 1));
if (number == NULL) { // 若内存申请失败,则异常退出
return 1;
}
memset(number, '0', n); // 将字符串中的每一个数字初始化为 '0'
number[n] = '