博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
任意给定一个大于等于10的整数A,请写一程序,以最小的时间复杂度找出比A小并且最接近A的一个整数B。要求:A的每位之和与B的每位之和相等 例:如果A=123 那么B=114...
阅读量:4618 次
发布时间:2019-06-09

本文共 2108 字,大约阅读时间需要 7 分钟。

自己所写没有凭据,但自己想到的测试没错,若有错希望大家指出。(类似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/archive/2012/10/05/2712103.html

你可能感兴趣的文章
LeetCode 19. Remove Nth Node From End of List
查看>>
Python标准库09 当前进程信息 (os包)
查看>>
关于用好Android资料的一些总结和反思
查看>>
负数,傅里叶变换,反傅里叶变换
查看>>
下一代搜索下一代移动互联网
查看>>
1.3 Quick Start中 Step 6: Setting up a multi-broker cluster官网剖析(博主推荐)
查看>>
设计模式之工厂模式(包含三种模式)
查看>>
jmeter测试元件--测试计划
查看>>
【BZOJ-2597】剪刀石头布 最小费用最大流
查看>>
Mac下安装zshell
查看>>
Applese 涂颜色(欧拉降幂)
查看>>
DUI总结
查看>>
Matplotlib基础
查看>>
51Nod 博弈模板题
查看>>
css float 使用
查看>>
linux下ARM交叉编译器的安装
查看>>
将Eclipse代码导入到AndroidStudio的两种方式
查看>>
【文档管理系统】【转】什么是元数据
查看>>
python
查看>>
oracle 创建用户模板
查看>>