任意给定一个大于等于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]);
}

}

}
}

}


   

原文地址:https://www.cnblogs.com/xunmengyoufeng/p/2712103.html