急求用eclipse做的删数问题 键盘输入一个高精度的正整数n(n<10位),去掉任意s个数字后剩下的数字按原左右次序组成一个新的正整数,寻求一种方案,使得新的正整数最小。
问题分析
1) 贪心法求解:删k个数符的全局最优解,包含了删除1个数符的子问题的最优解。
2) 以字符串形式输入s,使用尽可能逼近目标的贪心法来逐一删去其中的k个数符,每一步总是选择一个能使剩下的数最小的数符删去
有界面最好
求高手啊 ,,,老师说这个不难 可是我就是个菜鸟啊 网上搜的都是用C做的删数问题
问题分析
1) 贪心法求解:删k个数符的全局最优解,包含了删除1个数符的子问题的最优解。
2) 以字符串形式输入s,使用尽可能逼近目标的贪心法来逐一删去其中的k个数符,每一步总是选择一个能使剩下的数最小的数符删去
有界面最好
求高手啊 ,,,老师说这个不难 可是我就是个菜鸟啊 网上搜的都是用C做的删数问题
解决方案 »
- linux下运行java出现的问题
- 如何让一个虚拟机实例里的运行的应用程序所调用的类运行在另一个虚拟机实例里???
- 怎样将role角色放到request请求信息里面去?
- layout的问题,左侧3个面板以垂直方向排列,中间俩个面板,以垂直方向排列,右侧1个面板,用什么Layout
- 如何在命令行程序下控制光标左移或右移
- 求教自动请求web服务方案!急
- java都支持那些图片格式?????
- JScrollPane 疑问? 急救!!!
- 我是一个JAVA初学者,我想做一个手机短信,请各位给点提示.
- 请问:如何得到类和方法的分析树?
- 筛选问题,只显示选中的
- java有没有办法把String放入方法函数名称中?
#include<stdio.h>
int Del(int D,int a[10],int n)//D 删除几位 a 数组 n 当前数组位数
{
int res,max,i,j,x[10];
for(i=0;i<n;i++)
x[i]=a[n-i-1]; while(1)
{
if(D==0)
break;
else
D--;
max=0;
j=0;
for(i=0;i<n;i++)
{
if(max<x[i])
{
max=x[i];
j=i;
}
}
// n=n-2;
// for(i=j;i<n;i++)
// x[i]=x[i+1];
// n++;
n--;
for(i=j;i<n;i++)
x[i]=x[i+1];
}
res=0; for(i=0;i<n;i++)
res=res*10+x[i]; return(res);
}
void main()
{
int Res,D,z,n,m,i,a[10];
//m=43252556;
i=0;
n=0;
printf("<------------------删数问题---------------------->\n");
printf("请输入一个高精度的正整数N(N<=10位):");
scanf("%d",&m);
printf("请输入要去掉数的位数S(S<=N):");
scanf("%d",&D);
while(1)
{
z=m/10;
a[i]=m-z*10;
m=z;
i++;
n++;
if(m==0)
break;
}
Res=Del(D,a,n);
printf("删除后的结果为:");
printf("%d\n",Res);
}
package com.test;public class MinInt {
/**
* 输入一个高精度的正整数n(n<10位),去掉任意s个数字后剩下的数字按原左右次序组成一个新的正整数,
* 寻求一种方案,使得新的正整数最小。
* number: 输入的正整数
* n:要去掉的数字个数
*/
public static int findMinNumber(Integer number,int n)
{
String result = "";
String numberStr = number+"";
int length = numberStr.length();
if(length<=n)
{
return number;
}
//循环length-n次,每一次找出一个数字
boolean isFirstNumber = true;
for(int i=0;i<length-n;i++)
{
int[] array = findMinDigit(numberStr,length-n-i-1,isFirstNumber);
result+=array[0];
numberStr = numberStr.substring(array[1]+1);
isFirstNumber = false;
}
return Integer.parseInt(result);
}
/**
*
* @param number 输入的正整数,字符串形式
* remind 后面要包含几个数字
* isFirstNumber 是否是第一个数字
* @return 返回这个字符串中最小的数字,这个数字后面一定要有remind个数
*
*/
public static int[] findMinDigit(String number,int remind,boolean isFirstNumber)
{
int length = number.length();
int min = number.charAt(0)-'0';
int position = 0;
for(int i=1;i<length-remind;i++)
{
int t = number.charAt(i)-'0';
//第一个数字不能是0
if(t == 0 && isFirstNumber)
{
continue;
}
if(t<min)
{
min = t;
position = i;
}
}
return new int[]{min,position};
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("result="+findMinNumber(403145983, 6));
}}界面什么的可以用Swing,装个插件windowsbuilder。加油吧学弟,只能帮你到这了。
例如:98658,要删除2位,你想,5位数,删2位还剩3位,那么,6之前的比6大的数都要删除,恰好得658。再举一例,91658,6之前比6小的数不能删了,只能删9,6得158。再举一例,90658,能删9和6吗?不能,删了得058,是个两位数(也许parseInt后会成8进制的数,出问题),只能从0之前选取2个比6大的数,但不能是前导0(或者刚好可以吧0之前包括0全删),不足的从6以后选取,这里删9,0,的658.再举一例:98058,就这样了,和前例一样,删第一个9和最后8,得805.中心意思就这样,不知你体会了没有。
removeNum(5671384, 12);
} public static void removeNum(int input, int removed){
int minValue = input;
for(int i=0;i<removed && input > 0 ; i++){
int factor = 10;
for(int j=0;j<String.valueOf(input).length();j++){
int newValue = (input/factor*factor/10)+input%(factor/10);
if (minValue > newValue){
minValue = newValue;
}
factor *= 10;
}
input = minValue;
System.out.printf("remove %d number, the minum number is %d\n", i,input);
}
}
运行结果
remove 0 number, the minum number is 561384
remove 1 number, the minum number is 51384
remove 2 number, the minum number is 1384
remove 3 number, the minum number is 134
remove 4 number, the minum number is 13
remove 5 number, the minum number is 1
remove 6 number, the minum number is 0