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

  这个看起来好像很简单啊。巴拉巴拉,已经得出了下面的代码

/**
* 注意: 错误的示范,当n的值很大的时候,将会溢出
* @param n 最大的位数
*/
public static void Print1ToMaxOfNDigits_1(int n)
{
int number = 1;
int i = 0;
while(i++ < n)
{
number *= 10;
}
for(i = 0 ; i < number ; i++)
{
System.out.println(i + "\t");
} }

   恩,好的,完美写错了。乍看之下好像没有什么问题,但仔细分析一下,貌似这个n没有给出范围,假如这个n的值特别大,int能容纳吗?哦,那就用long类型,但假如n更大呢,是不是会溢出咧!好吧,现在我们遇到的就是大数问题。怎么才在n很大的时候仍然能得到我们想要的结果呢?我们可以通过字符串或者数组进行模拟。下面给出使用字符数组模拟的代码:

/**
* 使用数组模拟数字,可以解决大数溢出的问题
* @param n 最大的位数
*/
public static void Print1ToMaxOfNDigits(int n)
{
if(n < 0 )
{
return;
}
char[] number = new char[n]; //给number数组赋初值0
for(int i = 0 ; i < n ; i++)
{
number[i] = '0';
} while(!Increment(number))
{
PrintNumber(number);
} }

字符数组值加1函数

/**
* 实现数字数组加1的功能
* @param number 数字数组
* @return 是否溢出,即是否已经打印完所有1到n位最大数,是返回true
*/
public static Boolean Increment(char[] number)
{
Boolean isOverflow = false;
int nTakeOver = 0;
int nLength = number.length;
for(int i = nLength - 1 ; i >= 0 ; i--)
{
int nSum = number[i] - '0' + nTakeOver;
if(i == nLength -1) //数字的最低位
{
nSum ++;
} if(10 <= nSum) //产生进位
{
if(0 == i) //产生进位的是最高位,证明已经打印完所有数了
{
isOverflow = true;
}
else //产生进位的不是最高位
{
nSum -= 10;
nTakeOver = 1; //高一位要加1
number[i] = (char) ('0' + nSum);
} }
else
{
number[i] = (char) ('0' +nSum);
break;
}
}
return isOverflow;
}

显然,我们打印数组的时候假如不做操作假如存在位数达不到n的,前面会出现0,输出出来和我们日常生活遇到的有点不同,感觉有点别扭,所以这里还是重写了字符数组输出的格式,去掉了前面多余没有意义的0.

/**
* 打印出数组,去掉数组前面的0
* @param number 要打印的数组
*/
public static void PrintNumber(char[] number)
{
Boolean isBeginning0 = true;
int nLength = number.length; for(int i = 0 ; i < nLength ; i++)
{
if(isBeginning0 && '0' != number[i]) //用于判断是否是0开头
{
isBeginning0 = false;
}
if(!isBeginning0)
{
System.out.print(number[i]);
}
}
System.out.println("");
}

测试

public static void main(String[] args)
{
//Print1ToMaxOfNDigits_1(25); Print1ToMaxOfNDigits(2);
}

总结

当遇到有关数的时候,我们要考虑一下是否会出现数据特别大的情况,假如出现,可以通过数组或字符串进行替换处理。

计算1到最大的n位十进制数 ——大数解决的更多相关文章

  1. 剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)

    题目:输入一个数字n,按照顺序打印出1到最大n位十进制数,比如输入3,则打印出1,2,3直到最大的3位数999为止. 本题陷阱:没有考虑到大数的问题. 本题解题思路:将要打印的数字,看成字符串,不足位 ...

  2. 打印出从1到最大的n位十进制数

    首先这一题会溢出,要考虑的大数问题.所以不能用简单的是int类型数来表示(32位无符号int 范围是0x00000000···0xFFFFFFFF),下面主要是非递归的实现代码,自己做了注释方便以后回 ...

  3. 输入数字n,按顺序打印出从1到最大的n位十进制数

    题目:输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1,2,3一直到最大的999. 跳进面试官的陷阱 void PrintfToMaxNDigits(int n) { ; ; ...

  4. FPGA中将十进制数在数码管中显示(verilog版)--二进制转换为BCD码

    这周有朋友问怎样在fpga中用数码管来显示一个十进制数,比如1000.每个数码管上显示一位十进制数.如果用高级语言来分离各位,只需要分别对该数做1000,100,10对应的取商和取余即可分离出千百十个 ...

  5. Python实现计算圆周率π的值到任意位的方法示例

    Python实现计算圆周率π的值到任意位的方法示例 本文实例讲述了Python实现计算圆周率π的值到任意位的方法.分享给大家供大家参考,具体如下: 一.需求分析 输入想要计算到小数点后的位数,计算圆周 ...

  6. 计算a除b的第一位小数 in C++.

    my codes: #include<iostream> #include<cstdio> using namespace std; int main() { int a,b; ...

  7. 实验10.3_数值显示拓展_dword型数转变为表示十进制数的字符串

    assume cs:code data segment db 10 dup (0) data ends code segment start : mov ax,4240H;F4240H=1000000 ...

  8. 在Java中,为什么十六进制数0xFF取反之后对应的十进制数是-256呢?

    int number = 0xFF: 字面值是指在程序中无需变量保存,可直接表示为一个具体的数字或字符串的值. 0xFF是一个整数字面值,整数字面值的缺省类型是 int. 我们知道在Java中, in ...

  9. 十进制数转IEE754单精度浮点数以及浮点数转换的python实现

    十进制数转IEE754单精度浮点数 理解题目 单精度浮点数:单精度浮点数是用来表示带有小数部分的实数,一般用于科学计算.占用4个字节(32位)存储空间,包括符号位1位,阶码8位,尾数23位.其数值范围 ...

随机推荐

  1. 重构第21天 合并继承 (Collapse Hierarchy)

    理解:本文中的”合并继承”是指如果子类的属性和方法也适合于基类,那么就可以移除子类,从而减少依赖关系. 详解:上一篇我们讲到“提取子类”重构是指当基类中的一个责任不被所有的子类所需要时,将这些责任提取 ...

  2. Apache log4net™ 手册——概述【翻译】

    原文地址 本文内容 概述 框架 日志(Loggers)和追加器(Appenders) 日志层次(Logger hierarchy) 追加器(Appenders) 筛选(Filters) 布局(Layo ...

  3. jQuery实现表格拖动排序

    原理就是利用mousedown.mouseover.mouseup事件实现拖动,并用Ajax实现保存结果. JS代码如下: <!--题目调序功能--> <script type=&q ...

  4. jQuery $.extend() 和 $.fn.extend() 用法

    http://blog.csdn.net/xuemoyao/article/details/19021659

  5. 划分树---Feed the dogs

    POJ  2761 Description Wind loves pretty dogs very much, and she has n pet dogs. So Jiajia has to fee ...

  6. Linux Shell系列教程之(十七) Shell文件包含

    本文是Linux Shell系列教程的第(十七)篇,更多Linux Shell教程请看:Linux Shell系列教程 通过文件包含,可以引用其他文件的内容,也可以将复杂内容分开,使程序结构更加清晰. ...

  7. 使用PHP搭建书虫网站

    年前开始了一个新项目,书虫项目的启动,项目组里面我是负责搭建网站的.以前听说过PHP的大名,就是没怎么看过,只能从一无所知开始了. 来自PHP手册的介绍:PHP, 即“PHP: Hypertext P ...

  8. css3实现switch开关效果

    之前阿里电面的时候问的一个问题,今天抽时间做了个demo. html结构 <div class="container"> <div class="bg_ ...

  9. SAPScript、Smartforms动态打印图像或者背景图片

    在利用 SMARTFORMS 进行打印的时候有时候要求输出的图片可能是随着打印内容的不同而不同了,也就是动态输出图片,SMARTFORMS的提供了相关的支持技术,下面是实现截图 1.创建要显示的图片 ...

  10. andriod 读取网络图片

    来自:http://blog.csdn.net/jianghuiquan/article/details/8641283 Android手机上,我们常用ImageView显示图片,我们本章获取网络图片 ...