打印1到最大的n位数

打印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;
}
复制代码
posted on 2015-07-29 17:58  bendantuohai  阅读(415)  评论(0编辑  收藏  举报