剑指offer_12_打印1到最大的n位数

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

显然,这里面有一个小陷阱,当我们输入的n很大时,就算我们用长整形(long long)都会溢出。long int 最大值为2^64 -1,约二十位。也就是说当输入的n大于20是就会产生溢出。我们就需要考虑到这是一个大数问题。

最常用的方法是用字符串或数组表示大数。

用字符串表示数字的时候,最直观的方法就是字符串里每个字符都是 '0' 到 '9' 之间的某一个字符,用来表示数字中的一位。因为数字最大的时候n位的,因此我们需要一个长度为n+1的字符串(字符串中最后一个是结束符号 '\0' )。当实际数字不够n位时,在字符串的前半部分补0。

void Print1ToNDigits(int n)
{if(n<0) return;char *number = new char[n+1];memset(number, '0', n);number[n] = '\0';while(!Increment(number)){PrintNumber(number);//printf("%s \n",number);}delete []number;
}

在字符串模拟加一

bool Increment(char* number)
{//溢出判定bool isOverFlow = false;//进位int nTakeOver = 0;//长度int nLength = strlen(number);for(int i = nLength - 1; i >= 0; i--){//第n位的值等于第n位字母的ascii减去 0 的ascii 再加第n+1位的进位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;
}

打印字符串表示的数字

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){printf("%c",number[i]);}}printf("\t");
}

全部代码:

//字符串模拟数字
#include<stdio.h>
#include<stdlib.h>
#include <algorithm>
using namespace std;#define type charbool Increment(char*);
void PrintNumber(char*);
void Print1ToNDigits(int);void main(){//输出到文件//freopen("output.txt","w",stdout);Print1ToNDigits(5);
}void Print1ToNDigits(int n)
{if(n<0) return;char *number = new char[n+1];memset(number, '0', n);number[n] = '\0';while(!Increment(number)){PrintNumber(number);//printf("%s \n",number);}delete []number;
}//字符串模拟加法
bool Increment(char* number)
{//溢出判定bool isOverFlow = false;//进位int nTakeOver = 0;//长度int nLength = strlen(number);for(int i = nLength - 1; i >= 0; i--){//第n位的值等于第n位字母的ascii减去 0 的ascii 再加第n+1位的进位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;
}
//打印字符串表示的数字
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){printf("%c",number[i]);}}printf("\t");
}

剑指offer_12_打印1到最大的n位数相关推荐

  1. 剑指offer- 顺时针打印矩阵 精品算法

    剑指offer 刷了这么多题但是这一道,这个算法和其他人的算法都不一样 ,必须吹爆, 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 ...

  2. 剑指offer--打印1到最大的n位数

    记录来自<剑指offer>上的算法题. 题目如下: 输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1,2,3一直到最大的3位数即999. 第一种解法是比较容易想到, ...

  3. 剑指Offer_12_数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 解题思路 当exponent为0时,返回1,当exponent大于0,那么循环 ...

  4. 剑指-顺时针打印矩阵

    注意:在每次进行循环进行读写时,一定要判断left.right.top.bom的关系 vector<int> printMatrix(vector<vector<int> ...

  5. 剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)

    题目描述  请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵 ...

  6. 不支持给定路径的格式_剑指offer_12_矩阵中的路径

    //面试题12.矩阵中的路径 //题目:请设计一个函数,用来判断在一个矩阵中,是否存在一条包含某字符串所有字符的路径. //路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如 ...

  7. 【剑指offer】顺时针打印矩阵

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...

  8. 剑指offer:顺时针打印矩阵

    题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1 ...

  9. 【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序的链表(C++和Python实现)...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 剑指Offer(三):从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每 ...

最新文章

  1. mysql单列索引和多列索引_mysql索引类型 normal, unique, full text
  2. 怎么看python环境变量配置是否好了验证图片_简述验证Anaconda是否安装成功的两种方式和Anaconda环境变量配置过程...
  3. ant design pro取消登录_JeecgBoot实战按需加载 Ant-Design-Vue和Icon
  4. ABAP的数据字典DDIC和Hybris Commerce的类型系统Type system
  5. checkbox ajax 不选中的值,php – 无法通过ajax传递checkbox的值
  6. 导出excel/xml
  7. 来讨论一下这些常见的 Redis 面试题
  8. 全面解析Java的垃圾回收机制(转)
  9. 调用远程接口上传文件
  10. 字节跳动最新开源!java条件运算符判断三个数大小
  11. Eigen中的map
  12. 写给人类的机器学习 一、为什么机器学习重要
  13. OneNote的同步问题
  14. 租房需要注意些什么?
  15. 电脑黑屏只有鼠标箭头怎么修复 电脑开机黑屏的修复办法
  16. 【超分辨率】Zoom to Learn, Learn to Zoom
  17. java生成指定位数的随机英文字符串
  18. git报错error: index uses extension, fatal: index file corrupt
  19. tinyint(1)与tinyint(3),int(1)与int(3),tiny(1)与int(1)区别
  20. 初中计算机科学生情况,初中计算机科学与技术的现代化运用探究

热门文章

  1. Ubuntu 14.04.2安装内核源码树以及编译
  2. GitHub学习总结
  3. 国产电源厂家及具体型号pin-to-pin替代手册
  4. WEB_BASIC---01 Web概述、HTML概述、文本处理、图像和超链接、表格、菜单
  5. 上市公司融资需要哪些条件
  6. 做人如水 做事如山
  7. 小红书商业生态产品负责人精卫:全面解锁小红书达人营销新玩法
  8. iOS 按钮、Cell暴力点击触发多次响应的问题研究
  9. dss数字签名技术java_DSS数字签名标准
  10. 豆瓣2022年度影视资源榜单合集,速度保存!