您的位置:首页 > 职场人生

面试题12:打印1到最大的n位数

2017-02-19 10:28 232 查看
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1,2,3,4,5一直到最大的3位数999。

思路:看到题目的第一反应,应该是想到先把这个最大的数给找出来,然后在从1一直输出到这个数。

void printToMax(int n)
{
int maxNum = 1;

for(int i = 0; i < n; ++i)
{
maxNum = 10 * maxNum;
}
for(int i = 1; i < maxNum; ++i)
{
cout<<i<<endl;
}

}


但是这个做法存在一个潜在的陷阱,当n比较大的时候,不能用int,double,long来存储时,程序会发生错误。
所以我们需要换一个策略,可以用字符串来存储,用字符串来模拟整数的加法过程。

int main(int argc, const char * argv[]) {

int n = 9;
char *number = new char[n + 1];
memset(number, '0', n+1);
number
= '\0';

while(!increment(number))
{
printnumber(number);
}
delete[] number;
return 0;
}





increment()实现模拟整数递增的功能,printnumber()实现显示的功能。

bool increment(char *s) //将字符串看成整数 实现递增
{
int length = strlen(s);

int nTakeover = 0;
bool isOverflow = false; //是否到达了最高n位整数

for(int i = length - 1; i >= 0; i--)
{
int nSum = s[i] - '0' + nTakeover;   //nSum为整数 不是char型
if(i == length - 1)
nSum++;           //第一次循环时 最后一位数+1

if(nSum >= 10)        //当nSum>=10时 说明此位需要进位
{
if(i == 0)        //当i=10时 说明第一位也需要进位 说明这个时候已经到达了n位最大数 循环到此结束 返回1
{
isOverflow = true;

break;
}
else
{
nTakeover = 1;     //当i!=0时 说明时中间的位数需要进位 使进位标识为1
s[i] = '0';     //将进位的此为置为0
}

}
else
{
s[i] = '0' + nSum;       //如果此位没有进行进位 那么前面的位数也不可能进位 所以到这里直接break
break;
}

}

return isOverflow;
}


void printnumber(char *s)  //从第一个非0位开始输出
{
int length = strlen(s);
int flag = 0;

for(int i = 0; i < length; i++)
{
if(s[i] == '0' && flag==0)
{
continue;
}
flag = 1;
cout<<s[i];

}
cout<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: