zoukankan      html  css  js  c++  java
  • 任意给定一个大于等于10的整数A,请写一程序,以最小的时间复杂度找出比A小并且最接近A的一个整数B。要求:A的每位之和与B的每位之和相等 例:如果A=123 那么B=114

    自己所写没有凭据,但自己想到的测试没错,若有错希望大家指出。(类似123000这种情况源码中未写,但思路给出。相信这不是啥难题)。

    思路:

    原始输入oriNum,最终数endNum

    if(oriNum % 10 !=9 && oriNum % 100 !=0)

        endNum = oriNum -9;

    else if(oriNum % 100 ==0)

        1.找到第一个不为0的数位a(将其减一);

        2.a的下一位加一

        3.其余位不变

    else(处理类似1234999这种末位有几位9的情况){

       设置两个标志位flag1(末位含9的位数)和flag2(输入数据位数)

       if(flag1 == flag2 || flag1 ==(flag2-1))

       System.out.println("抱歉,您输入的数字无解");

       else{

          oriNum的第flag1+2位变为原数减一

          oriNum的第flag1+1至倒数第二位变为9

          oriNum的末位变为flag1+1位的数据+1

       }

    }

    代码:

    package com.donghao;

    import java.util.Scanner;

    public class HeXiangtong {
    public static void main(String[] args){
    System.out.println("请输入一个大于10的整数");
    Scanner scan = new Scanner(System.in);
    int oriNum = scan.nextInt();
    int lastNum=0;
    int[] arr = new int[100];//存取oriNum的逆序
    int[] endArr;//记录oriNum转换后的值,仍未倒序,此处倒着读取
    int i=0;//便于给arr赋值
    int flag1=0,flag2=0;//标识原数子有几个九,如果有flag1=flag2个则无解
    int length=0;//所给数据位数
    //最简单的数处理方式129934
    if(oriNum % 10 !=9 && oriNum % 100 !=0){
    lastNum = oriNum -9;
    System.out.println("The Nearest number is:" + lastNum);
    }
    //143000->000431(思路最初不为0的数位减1,末位加1)
    else if(oriNum % 100 ==0){

    int power =1;
    while(oriNum % 10 == 0){
    oriNum /= 10;
    power = power * 10;
    }
    oriNum = oriNum -1;
    lastNum = oriNum * power + (power / 10);
    System.out.print("The Nearest number is:" + lastNum);


    }
    //类似于199999这种情况
    else{
    //取最左边9的个数和数据位数
    while(true){
    if(oriNum % 10 == 9){
    flag1++;
    flag2++;
    arr[i++] = 9;
    }
    if(oriNum % 10 !=9){
    flag2++;
    arr[i++] = oriNum % 10;
    }
    oriNum = oriNum / 10;
    if(oriNum <1){
    arr[i] =oriNum;
    break;
    }
    }
    length = flag2;
    for(int j=0;j<length;j++){
    System.out.print(arr[j] + " ");
    }
    System.out.println("flag1=" + flag1);
    System.out.println("flag2=" + flag2);
    //处理类似于199999这种情况
    if(flag1 == flag2 || flag1 ==(flag2-1))
    System.out.println("抱歉,您输入的数字无解");
    //类似于123999这种情况
    else{
    endArr = new int[length];
    endArr[0] = arr[flag1]+ 1;
    for(int k=1;k<length;k++){
    if(k<=flag1){
    endArr[k] = arr[k-1];
    }else if(k==(flag1+1)){
    endArr[k] =arr[flag1 +1] -1;
    }
    else{
    endArr[k] = arr[k];
    }

    }
    System.out.print("最终结果");
    for(int j=length-1;j>=0;j--){
    System.out.print(endArr[j]);
    }

    }

    }
    }

    }


       

  • 相关阅读:
    [POJ1151]Atlantis
    [POJ1177]Picture
    [POJ1765]November Rain
    Adaptively handling remote atomic execution based upon contention prediction
    Webpack 2.0 的文档
    PAT乙级 1025. 反转链表 (25)
    PAT乙级 1024. 科学计数法 (20)(未通过全部测试,得分18)
    PAT乙级 1023. 组个最小数 (20)
    PAT乙级 1022. D进制的A+B (20)
    PAT乙级 1021. 个位数统计 (15)
  • 原文地址:https://www.cnblogs.com/xunmengyoufeng/p/2712103.html
Copyright © 2011-2022 走看看