最近把剑指offer再过一遍,准备把之前生疏的地方在csdn上写博客做一个标记。这一轮中,每看到一个题,不看解析,直接自己分析求解,写代码。
最近看到了“打印1到最大n位数”,然后感觉跟第一遍看时候的想法不一样,接下我就把我的思路代码写出来。
问题:输入一个正整数n,然后打印从从1开始到最大的n位数99...999;
分析:这个题属于一个大数问题,就是说当n比较大时用我们传统的思路会造成溢出问题。针对这类问题一般用数据解决,要么是字符数组要么是数值数组。由于是整数,在这里我是用了数值数组。
使用一个int number[n]来存储我们的数据。每次在最右边加1,在这个过程中要处理进位操作、结束操作、打印操作等。下面直接上代码:
#include<iostream>
using namespace std;
void print(int *number, int n)
{
int flag = 0;
for (int i = 0; i < n ; ++i)
{
if (number[i] == 0 && flag == 0)
{
continue;
}
else
{
flag = 1;
cout << number[i];
}
}
cout << '\t';
}
void toMaxNumber(int n)
{
int *number = new int[n];//用于存放我们的数据
for (int i = 0; i < n; ++i)
{
number[i] = 0;
}
bool increament = false;//进位标记
bool overflowFlag = false;//溢出标记
while (true)
{
increament = true;
for (int i = n - 1; i >= 0 && increament; --i)//每次都从最后一位开始,在最后一位加1
{
increament = false;
number[i] += 1;
if (number[i] >= 10)//说明需要进位
{
increament = true;
number[i] = 0;
if (i == 0 && number[i] == 0)//说明溢出
{
overflowFlag = true;//溢出
break;
}
}
else//不用进位
{
print(number, n);
break;
}
}
if (overflowFlag)
{
break;
}
}
delete[]number;
}
int main()
{
int n;
cin >> n;
toMaxNumber(n);
return 0;
}