打印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位数----java实现

时间: 2024-10-20 22:07:36

打印1到最大的n位数----java实现的相关文章

剑指OFFER之打印1到最大的N位数(九度OJ1515)

题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1到最大的N位数. 样例输入: 1 样例输出: 1 2 3 4 5 6 7 8 9 解题思路: 直接通过n快速指定比最大的那个数大1的数,10,100,1000,10000,100000.... 输出,就行了... 代码: #include <stdio.h> int main(void){ int

剑指offer (12) 打印1到最大的n位数

题目描述: 给定一个数字N,打印从1到最大的N位数 此题需要注意以下几点: 1. 涉及到大数问题,因为并没有限定 n的取值范围,所以需要采取 字符数组模拟大数运算 2. 打印数字时 需要忽略前置0 3. 我们始终 以n位数为整体,n位所有十进制数其实是 n位从0到9的全排列,可以采用递归解决 我们从 数组下标0开始 (对应于数字最高位),每一位都有0到9取值,然后设置下一位,递归的结束条件是 设置位到了数组的最末端 1 void PrintNum(char* num) 2 { 3 char* c

数据结构-打印1到最大的n位数

题目:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 分析:本题最关键的部分是当n值非常大的时候会超出数据类型的范围.偷个懒,没有实现打印1,2,3....999.可以利用分割把string分割成char[].然后单个的char转为int再进行加减法,作为输出. /* 剑指offer面试题12 该问题主要考虑到数据非常大超出数据类型的范围 */ #include <iostream> #include <cstring>

【C语言】打印1到最大的n位数

//打印1到最大的n位数 //输入数字n,按顺序打印出从1到最大的n位十进制数.比如:输入3,则打印出1.2一直到最大的3位数999 #include <stdio.h> #include <stdlib.h> #include <memory.h> int num[10]; int add(int n) { int isoverflow = 0; int carry = 0; int i; for (i = 9; i >= 10 - n; i--) { num[

面试题17:打印1到最大的n位数

// 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. 解题思路: 首先是一个大陷阱,n有多大?万一大到long long类型都盛不下,你要直接动手写,那写的再正确也是凉凉. 我们考虑到用字符来表示数字,然后把字符打印出来就行了. 书上巴拉巴拉说了一种很复杂的方法,代码量大也比较繁琐,感兴趣的去参考资料看就行了. 这里直接介绍第二种简单的方法,其实打印出从1最大的n位十进制数,实际就是

《剑指offer》第十七题:打印1到最大的n位数

// 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. #include <cstdio> #include <memory> void PrintNumber(char* number); bool Increment(char* number); void Print1ToMaxOfNDigitsRecursively(char* number, int length

【笔试】30、打印1到最大的n位数

/** *题目:输入数字n,按顺序打印从1最大的n位十进制数,比如输入3,则打印出1.2.3一直到最大的3位数即999. *时间:2015年8月29日09:32:48 *文件:MaxOfNDigits_1.java *作者:cutter_point */ package bishi.Offer50.y2015.m08.d29; import org.junit.*; public class MaxOfNDigits_1 { /** * 打印出来这些数 * @param n */ public

控制数据的小数位数 java / js

//java一般控制格式都是通过 DecimalFormat 来控制的.下边是个例子. import java.text.DecimalFormat; public class ControlBit { public static void main(String[] argu){ double money = 399.74099999999993; DecimalFormat df=new DecimalFormat("#.00"); System.out.println(df.fo

【Offer】[17] 【打印1到最大的n位数】

题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数即999. 思路分析 要考虑到大数问题,我们要求的n位数是否的整数,这里明显没有限制n的大小,我们可以用字符串来打印n位数 我们需要做两件事情: 在字符串表达的数字上模拟+1 ,对字符串进行加一操作,注意停止加一的时机,即当最高位+1时,如果产生进位,则停止加1 ,比如:999+1 打印字符串表示的n为数,打印字符数组形成的数字,注意当遇