计算1到最大的n位十进制数 ——大数解决
要求:输入一个数字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位十进制数 ——大数解决的更多相关文章
- 剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)
		
题目:输入一个数字n,按照顺序打印出1到最大n位十进制数,比如输入3,则打印出1,2,3直到最大的3位数999为止. 本题陷阱:没有考虑到大数的问题. 本题解题思路:将要打印的数字,看成字符串,不足位 ...
 - 打印出从1到最大的n位十进制数
		
首先这一题会溢出,要考虑的大数问题.所以不能用简单的是int类型数来表示(32位无符号int 范围是0x00000000···0xFFFFFFFF),下面主要是非递归的实现代码,自己做了注释方便以后回 ...
 - 输入数字n,按顺序打印出从1到最大的n位十进制数
		
题目:输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1,2,3一直到最大的999. 跳进面试官的陷阱 void PrintfToMaxNDigits(int n) { ; ; ...
 - FPGA中将十进制数在数码管中显示(verilog版)--二进制转换为BCD码
		
这周有朋友问怎样在fpga中用数码管来显示一个十进制数,比如1000.每个数码管上显示一位十进制数.如果用高级语言来分离各位,只需要分别对该数做1000,100,10对应的取商和取余即可分离出千百十个 ...
 - Python实现计算圆周率π的值到任意位的方法示例
		
Python实现计算圆周率π的值到任意位的方法示例 本文实例讲述了Python实现计算圆周率π的值到任意位的方法.分享给大家供大家参考,具体如下: 一.需求分析 输入想要计算到小数点后的位数,计算圆周 ...
 - 计算a除b的第一位小数 in C++.
		
my codes: #include<iostream> #include<cstdio> using namespace std; int main() { int a,b; ...
 - 实验10.3_数值显示拓展_dword型数转变为表示十进制数的字符串
		
assume cs:code data segment db 10 dup (0) data ends code segment start : mov ax,4240H;F4240H=1000000 ...
 - 在Java中,为什么十六进制数0xFF取反之后对应的十进制数是-256呢?
		
int number = 0xFF: 字面值是指在程序中无需变量保存,可直接表示为一个具体的数字或字符串的值. 0xFF是一个整数字面值,整数字面值的缺省类型是 int. 我们知道在Java中, in ...
 - 十进制数转IEE754单精度浮点数以及浮点数转换的python实现
		
十进制数转IEE754单精度浮点数 理解题目 单精度浮点数:单精度浮点数是用来表示带有小数部分的实数,一般用于科学计算.占用4个字节(32位)存储空间,包括符号位1位,阶码8位,尾数23位.其数值范围 ...
 
随机推荐
- 后缀数组 --- HDU 3518 Boring counting
			
Boring counting Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3518 Mean: 给你一个字符串,求:至少出 ...
 - Mongodb:修改文档结构后出现错误:Element '***' does not match any field or property of class ***.
			
Mongodb:修改文档结构后出现错误:Element '***' does not match any field or property of class ***. Mongodb是一种面向文档的 ...
 - 周末web前端练习
			
在 CSS 样式定义中,以下哪种 RGB 颜色值是 Web 安全色? A]#111111B]#222222C]#333333D]#444444 答案:http://hovertree.com/ti ...
 - SQL Server中@@ROWCOUNT的用法
			
SQL Server中@@ROWCOUNT返回受上一语句影响的行数,返回值类型为 int 整型. 如果行数大于 20 亿,则需要使用 ROWCOUNT_BIG. @@ROWCOUNT和@@ERROR变 ...
 - SqlServer一张表数据导入另一张表,收藏使用,工作中更新数据错误很有用
			
sql一张表数据导入另一张表 1.如果2张表的字段一致,并且希望插入全部数据,可以用这种方法: INSERT INTO 目标表 SELECT * FROM 来源表; 2.比如要将 arti ...
 - java事务理解
			
还在学Hibernate,后续一大堆概念刚接触需要理解.觉得-——事务——这个概念不是很好理解,所以发上来记录一下. 首先说点千篇一律的东西.概念和特性都是随处可见的,无论哪里都很容易找到,关键是你如 ...
 - Javascript中void操作符
			
Javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值. void操作符用法格式如下:1.javascript:void (expression)2.javascript ...
 - phpcms——  内容中的附件调用和添加远程地址的调用
			
phpcms中几个地址调用的方法 1,CSS路径有{CSS_PATH}2,图片路径有{IMG_PATH}3,JS路径有{JS_PATH} 4,那么附件的路径如何调用,使用下面的方式可以得到附件的路径前 ...
 - c++之函数重载(函数匹配)
			
Case void f(); void f(int); void f(int, int); void f(double, double = 3.14); 匹配原则: 1)其形参数量与本次调用提供的实参 ...
 - 【GOF23设计模式】建造者模式
			
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...