【C/C++练习题】打印1到最大的n位数

举报
王建峰 发表于 2021/11/19 00:04:02 2021/11/19
【摘要】 《剑指Offer》面试题17:打印1到最大的n位数   1 题目 输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。   2 问题分析 由于n的值不确定,也就无法确定用什么数据类型来表示最大的数字。如果n很大的话,可能没有足够大的数据类型来支持。这里...

《剑指Offer》面试题17:打印1到最大的n位数

 

1 题目

输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。

 

2 问题分析

由于n的值不确定,也就无法确定用什么数据类型来表示最大的数字。如果n很大的话,可能没有足够大的数据类型来支持。这里采用字符串来模拟数值计算,来解决大数问题。

 

3 代码分析

在Increment()函数中,将字符串模拟数值加法运算

  1. 将字符转换成对应的数值,参与'位运算',加法运算要考虑进位
  2. 计算方向是从底位到高位,依次判断
    1. 如果产生进位,则继续计算高位部分
    2. 如果没有进位,较高位部分保持不变,直接返回
    3. 如果最高位产生进位,则达到最大值,返回结果
  3. 在将计算后的数值,写回原来的字符串中(对应字符位置)

 


  
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. //问题:打印从1到最大的n位数
  6. bool Increment(char* number);
  7. void Print_number(char* number);
  8. bool Show_nubmer(int n);
  9. void test01()
  10. {
  11. Show_nubmer(3);
  12. }
  13. int main(int argc, char const *argv[])
  14. {
  15. test01();
  16. return 0;
  17. }
  18. //输入:n最大数值的位数
  19. //返回:false 失败, true 成功
  20. bool Show_nubmer(int n)
  21. {
  22. if (n <= 0) return false;
  23. //1.构造一个长度为n的存储空间,初始化字符串
  24. char* number = new char [n+1];
  25. memset(number,'0',n);
  26. number[n] = '\0';
  27. //3.模拟数字加法,并打印每次计算的结果
  28. while (!Increment(number))
  29. {
  30. Print_number(number);
  31. // cout << number << endl;
  32. }
  33. //2.释放堆内存
  34. delete [] number;
  35. }
  36. //功能:字符串上模拟数字加法
  37. //输入:number 指向堆内存的地址
  38. //返回:false 未溢出, true 溢出了
  39. bool Increment(char* number)
  40. {
  41. bool all_overflag = false; //溢出标志
  42. int n_overflag = 0; //进位标志
  43. int length = strlen(number); //字符串长度
  44. int value = 0; //数值
  45. //从最底位开始进行计算
  46. for (int i = length-1;i >= 0;i--)
  47. {
  48. //1.字符 -> 数值
  49. value = number[i] - '0' + n_overflag; //转换成对应的数值(考虑进位)
  50. //2.加法运算
  51. if (i == length-1)
  52. {//
  53. ++value;
  54. }
  55. //3.判断进位
  56. if (value >= 10)
  57. {
  58. if (i == 0)
  59. {//溢出,计算完成,返回
  60. all_overflag = true;
  61. }
  62. //其他位进位,继续向高位判断
  63. n_overflag = 1;
  64. value -= 10;
  65. number[i] = value + '0'; //4.数值 -> 字符
  66. }
  67. else
  68. {//没有进位,计算完成
  69. n_overflag = 0;
  70. number[i] = value + '0'; //4.数值 -> 字符
  71. all_overflag = false;
  72. break;
  73. }
  74. }
  75. return all_overflag;
  76. }
  77. //功能:从第一个非零字符开始打印字符串数字
  78. //输入:number 指向堆内存的地址
  79. //输出:打印结果
  80. void Print_number(char* number)
  81. {
  82. bool isbegining = false; //起始打印标志
  83. int length = strlen(number); //字符串长度
  84. for (int i = 0; i < length;i++)
  85. {
  86. if (!isbegining && number[i] != 0)
  87. {//遇到非零字符
  88. isbegining = true;
  89. }
  90. printf("%c", number[i]);
  91. }
  92. printf("\t");
  93. }

 

 

4 运行结果

文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/feit2417/article/details/98501851

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。