打印1到最大的n位数----java实现

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

分析:

1、这是一个典型的大数加法问题,无论是int还是long long类型多无法表示。所以在解决大数问题时,通常是使用字符串或者数组实现其功能(由于个人比较钟爱数组,所以下面代码是使用数组实现的)。

2、在大数的加法中,我们需要注意的问题是进位问题。

3、在该题中还需要判断是否为最大的n位整数。这里需要一个小技巧,我们只需判断最高位(第n位)是否要进位,如果需进位,则已经为最大数。

package com.edu;

public class PrintMaxOfNDigits {              

    public boolean Increment(int[] number){                 //  这个方法是用来实现对数加1操作
boolean isOverflow = false;
int nTakeOver=0;
for(int i=number.length-1;i>=0;i--){
int nSum = number[i]+nTakeOver;
if(i==number.length-1)
nSum++;
if(nSum>=10){
if(i==0)
isOverflow=true;
else{
nTakeOver=1;
nSum=nSum-10;
number[i]=nSum;
}
}
else{
number[i]=nSum;
break;
}
}
return isOverflow;
} public void PrintNumber(int[] number){ //该方法是负责打印一个正类,千万不要尝试将数组变成一个整数
boolean isBeginning=true;
for(int i=0;i<number.length;i++){
if(isBeginning&&number[i]!=0)
isBeginning=false;
if(!isBeginning){
System.out.print(number[i]);
}
}
} public void Test(int n){ //打印从1到最大的n位整数
if(n<=0)
System.out.println("输入出错,请重新输入!");
int[] number = new int[n]; while(!Increment(number)){
PrintNumber(number);
//System.out.println();
}
} public static void main(String[] args) {
// TODO Auto-generated method stub
new PrintMaxOfNDigits().Test(1);
} }

第二种解法:全排列的思想

//第二中方法实现,全排序实现
public void PrintMaxOfNdigits(int[] number,int length,int index){
if(index ==length-1){
PrintNumber(number);
return;
}
for(int i=0;i<10;i++){
number[index+1]=i;
PrintMaxOfNdigits(number, length, index+1);
}
} public void Test1(int n){
if(n<=0)
return;
int[] number = new int[n];
for(int i=0;i<10;i++){
number[0]=i;
PrintMaxOfNdigits(number, n, 0);
}
}

类似的题目还有:

描述

编程精确计算2的N次方。(N是介于100和1000之间的整数)。
输入:正整数N (100≤N≤1000)
输出:2的N次方
样例输入:200
样例输出:1606938044258990275541962092341162602522202993782792835301376

下面给出c语言的代码:

#include<stdio.h>
#include<math.h> void main(){
int i,j,n,temp,k=0,sub=0;
int a[1000];
a[0]=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=0;j<=sub;j++) a[j]=a[j]*2;
if(a[sub]/10==1)
{
sub++;
a[sub]=0;
}
for(j=0;j<=sub;j++)
{
temp=(a[j]+k)%10;
k=a[j]/10;
a[j]=temp;
}
}
for(j=sub;j>=0;j--)
printf("%d",a[j]); }
描述:求两个非负整数(1000位以内)的和。
输入:两个非负整数(1000位以内),以空格分隔。
输出:两个非负整数的和。
样例
输入:111111111111 222222222222
样例输出:333333333333

下面个出的代码是用使用字符串实现的:

#include<stdio.h>
#include<string.h> char* r(char a[])
{
int i,j;
char t;
i=strlen(a)-1;
j=0;
while(j<i)
{
t=a[j];
a[j]=a[i];
a[i]=t;
--i;++j;
}
return a;
}
int main()
{
char a[1000],c[1000];
int b[1000]={0};
int i,t,m,n,mx,mi,k=0;
scanf("%s %s",a,c);
r(a);
r(c);
t=strlen(a);
m=strlen(c);
mx=t>m?t:m;
mi=t<m?t:m;
for(i=0;i<mi;i++)
{
n=a[i]+c[i]-'0'-'0';
b[i]=(n+k)%10;
k=(n+k)/10;
}
for(i=mi;i<mx;++i)
{
if(mx==t)
n=a[i]-'0';
if(mx==m)
n=c[i]-'0';
b[i]=(n+k)%10;
k=(n+k)/10;
}
if(k==1)
{
b[mx]=1;
++mx;
}
for(i=mx-1;i>=0;i--)
printf("%d",b[i]);
printf("\n");
return 0;
}

打印1到最大的n位数的更多相关文章

  1. 剑指Offer面试题:11.打印1到最大的n位数

    一.题目:打印1到最大的n位数 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数即999. 二.不同的解法 2.1 不假思索的解法 最容易想到的办 ...

  2. 面试题12:打印1到最大的n位数

    // 面试题12_打印1到最大的n位数.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> ...

  3. 《剑指offer》面试题12:打印1到最大的n位数

    面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...

  4. 【面试题012】打印1到最大的n位数

    [面试题012]打印1到最大的n位数  大数问题 字符串中的每一个字符都是‘0’到‘9’之间的某一个字符,用来表示数字中的一位,因为数字最大是n位的,因此我们需要一个长度为n+1的字符串,字符串的最后 ...

  5. 1515:打印1到最大的N位数 @jobdu

    题目1515:打印1到最大的N位数 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:625 解决:323 题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一 ...

  6. 剑指offer编程题Java实现——面试题12打印1到最大的n位数

    题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了l ...

  7. 打印1到最大的n位数-Java

    在练习剑指offer的时候,第12题打印1到最大的n位数的时候,想找个java版的,但大家要么用BigInteger做,要么给出其他的方法.我觉得要给就给最好的方法,下面是我自己参考C++代码写的ja ...

  8. 【Java】 剑指offer(16) 打印1到最大的n位数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印 ...

  9. 《剑指offer》第十七题(打印1到最大的n位数)

    // 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. #include <ios ...

随机推荐

  1. spring源码学习之【准备】jdk动态代理例子

    一:被代理的对象所要实现的接口 package com.yeepay.testpoxy; import java.util.Map; /** * 被动态代理的接口 * @author shangxia ...

  2. java基础之:匿名内部类

    在java提高篇-----详解内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以 了解到匿名内部类的使用.匿名内部类要注意的事项.如何初 ...

  3. cluster,network

    How cluster works https://technet.microsoft.com/en-us/library/cc738051(v=ws.10).aspx http://blogs.te ...

  4. PHP-关于$_SERVER

    类似于Nginx中的请求头,所有header,都可以使用 $http_xxx来使用,比如$http_accept,甚至包括自定义的,比如,$http_x_forwarded_host proxy_se ...

  5. Nginx-/etc/sysctl.conf 参数解释

    来自<深入理解Nginx模块开发与架构解析> P9 #表示进程(例如一个worker进程)可能同时打开的最大句柄数,直接限制最大并发连接数 fs. #1代表允许将状态为TIME-WAIT状 ...

  6. 11G RAC 进程启动顺序

  7. line-hieght与vertical-align的区别与联系

    7.3 line-height 行高指的是文本行的基线间的距离,但是文本之间的空白距离不仅仅是行高决定的, 同时也受字号的影响. 7.3.1 语 法 line-height属性的具体定义列表如下: 语 ...

  8. dl,dt,dd,ul,li,ol区别

    dl.dt.dd也是列表项,不过它们被忽视得比较厉害,人们只知道ul.ol.li,却经常漠视它们的存在,其实有时候,dl.dt.dd也是非常好用的,这两个家族是近亲,很多地方都是一模一样. dl类似u ...

  9. ajax重构XMLHttpRequest

    //重构XMLHttpRequestvar net = new Object(); //名字空間對象 net.READY_STATE_UNINITIALIZED = 0; net.READY_STAT ...

  10. 006 [翻译] Haneke(一个Swfit iOS缓存类)

    Github项目地址:https://github.com/Haneke/HanekeSwift Haneke是一个用swift写成的轻量级iOS类,以简单好用著称(design-decisions- ...