打印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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM