急求用eclipse做的删数问题  键盘输入一个高精度的正整数n(n<10位),去掉任意s个数字后剩下的数字按原左右次序组成一个新的正整数,寻求一种方案,使得新的正整数最小。
问题分析
1) 贪心法求解:删k个数符的全局最优解,包含了删除1个数符的子问题的最优解。
2) 以字符串形式输入s,使用尽可能逼近目标的贪心法来逐一删去其中的k个数符,每一步总是选择一个能使剩下的数最小的数符删去
有界面最好   
求高手啊 ,,,老师说这个不难 可是我就是个菜鸟啊  网上搜的都是用C做的删数问题   

解决方案 »

  1.   

    用js写啊,有c语言的例子还不会???
      

  2.   

    我有一个C的程序  能编译出来   你看看   能不能改成JAVA的  最好能用ECLIPSE做个界面   的  
    #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);
    }
      

  3.   

    虽然不喜欢那些张口就要代码的问题,但是,节假日还要上班的人蛋疼的还是写了一遍。
    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。加油吧学弟,只能帮你到这了。
      

  4.   

    大致了解了下题意,不知道是不是这样:
    例如: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.中心意思就这样,不知你体会了没有。
      

  5.   

    这个貌似就直接一个一个的删,然后每次取最小的就好了    public static void main(String[] args) {
            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