要求:输入一个数字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. 循序渐进开发WinForm项目(2)--项目代码的分析

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  2. 用stimulsoft Reports报表工具制作简单报表的过程

    这是在数据库sql server中People表的数据

  3. Oracle数据库常用设置积累

    1.在oracle的之前版本时, 你的用户名密码是大小写不敏感的, 但在11g中, 数据库默认密码的大小写是敏感的,去除oracle的密码大写敏感设定: alter system set sec_ca ...

  4. 用Perl编写Apache模块续二 - SVN动态鉴权实现SVNAuth 禅道版

    代码地址:https://code.csdn.net/x3dcn/svnauth 以禅道项目管理系统的数据库结构为标准,实现了可用的svn authz验证功能. 以用户名.密码.项目的acl开发程度o ...

  5. mongodb学习1---基本命令

    0:基本命令:1,登录mongodb数据库mongo 2,查看数据库,选择数据库show dbs;use table1; 3,查看集合show collections; 4,查看集合所有数据db.集合 ...

  6. 防止用户误操作退出APP的处理

    /** * 软件退出的处理:先跳到第一个页面,再点提示“再点一次退出”,2秒内再点一次退出 * 防止用户误操作 */ private boolean isExist=false; private Ha ...

  7. 常见的几种RuntimeException

    一般面试中java Exception(runtimeException )是必会被问到的问题 常见的异常列出四五种,是基本要求.更多的....需要注意积累了   常见的几种如下:   NullPoi ...

  8. Angularjs,WebAPI 搭建一个简易权限管理系统 —— Angularjs名词与概念(一)

    目录 前言 Angularjs名词与概念 Angularjs 基本功能演示 系统业务与实现 WebAPI项目主体结构 Angularjs 前端主体结构 2. 前言 Angularjs开发CRUD类型的 ...

  9. 如何实现两个Activity 之间如何通讯

    <转> 今天主要学习了Activity 组件,在这里作一下总结 1,学习如何创建Activity 创建 Activity 要点: (1) 一个Activity就是一个类,并且这个类要继承A ...

  10. DigitalOcean上SSH Key的创建(附DigitalOcean邀请)

    DigitalOcean是一家云主机商家,最低配置512M内存,20G的SSD,每月只有5刀.半个月前刚刚在这上面买了一个VPS,创建Droplet的时候看见创建SSH Key的时候就有点懵,不知道这 ...