• 打印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("
    ");
        return 0;
    }
    复制代码
  • 相关阅读:
    C# IP地址字符串和数值转换
    Xstream序列化实体
    异步线程及同步控制
    XML序列化与反序列化(转)
    C# Webserice 代理生成工具(WSDL)
    ASP.NET(C#)图片加文字、图片水印(转)
    异步导致UI句柄增加的解决办法
    终于找到WinForm自定义控件不能拖到IDE设计器容器的办法
    C# PropertyGrid控件应用心得(转载)
    GDI_图片半透明效果示例
  • 原文地址:https://www.cnblogs.com/bendantuohai/p/4686686.html
Copyright © 2020-2023  润新知