C 如何删除某个数字中的特定数字,以使获得的数字最小?

C 如何删除某个数字中的特定数字,以使获得的数字最小?,c,min,digit,C,Min,Digit,如何删除某个数字中的特定数字,以使获得的数字最小 具体来说,我想编写一个函数int remove\u digits(int-large,int-num\u digits\u to\u remove),这样: 任何要删除的num\u digits\u数字都将从large中删除,就像从其字符串表示中删除字符一样 返回的数字具有步骤1中删除数字后的最低可能值 例如,从69469813中删除4位数字将得到4613 我更喜欢用C写的答案。想法: char number[] = "69469813"; ch

如何删除某个数字中的特定数字,以使获得的数字最小

具体来说,我想编写一个函数
int remove\u digits(int-large,int-num\u digits\u to\u remove)
,这样:

  • 任何要删除的
    num\u digits\u
    数字都将从
    large
    中删除,就像从其字符串表示中删除字符一样
  • 返回的数字具有步骤1中删除数字后的最低可能值
  • 例如,从
    69469813
    中删除4位数字将得到
    4613

    我更喜欢用C写的答案。

    想法:

    char number[] = "69469813";
    char digits[ARRAY_SIZE(number)];
    size_t i;
    
    // sort digits; complexity O(n * log n);
    sort_digits(digits, number);   // -> digits becomes "99866431"
    
    for (i = 0; i < number_of_digits_to_be_removed; ++i) {
         size_t j;
         for (j = 0; j < ARRAY_SIZE(number); ++j) {
             if (number[j] == digits[i]) {
                 number[j] = 'X';      // invalidate it
                 break;
             }
         }
     }
    
     for (i = 0; i < ARRAY_SIZE(number); ++i)
         if (number[i] != 'X')
             printf("%c", number[i]);
    
    charnumber[]=“69469813”;
    字符数字[数组大小(数字)];
    尺寸i;
    //数字排序;复杂性O(n*logn);
    对数字(数字、数字)进行排序;//->数字变为“99866431”
    对于(i=0;i<要删除的位数;++i){
    尺寸j;
    对于(j=0;j

    整个事物的复杂性为O(n*m)

    我不懂C,但下面是我在java中的实现方法:

    String original = "69469813";
    String result = "";
    
    int numNeedToBeTaken = 4;
    int numLeft = original.length() - numNeedToBeTaken;
    
    while(result.length() < numLeft)
    {
        String temp = original.substring(0,original.length()-numNeedToBeTaken+1);
        int smallest= 9;
        int index = 0;
        for(int i = 0; i<temp.length(); i++)
        {
            int number = Integer.parseInt(Character.toString(temp.charAt(i)));
            if( number < smallest)
            {
                smallest = number;
                index = i+1;
            }
        }
        numNeedToBeTaken--;
        result = result.concat(String.valueOf(smallest));
        original = original.substring(index);
    }
    Log.d("debug","result: "+result); //tested to work with your example, returns 4613
    
    stringoriginal=“69469813”;
    字符串结果=”;
    int numneedtobetake=4;
    int numLeft=original.length()-numneedtobetake;
    while(result.length()对于(int i=0;i而言,基本思想是,如果您只能删除一个数字,那么您需要删除第一个数字(从最高有效数字开始),然后是一个较小的数字

    例如,如果您的号码是123432,您希望删除4(因为它后面跟着3),结果是12332

    然后,对要删除的数字重复此过程:

    char *num = "69469813";
    char *buf = malloc(strlen(num)+1);
    size_t to_remove = 4;
    
    while (to_remove --> 0) {
        char *src = num;
        char *dst = buf;
    
        while (*src < *(src+1)) { *dst++ = *src++; } // Advance until the next digit is less than the current digit
        src++;                                       // Skip it
        while (*dst++ = *src++);                     // Copy the rest
    
        strcpy(num, buf);
    }
    printf("%s\n", num); // Prints 4613
    
    char*num=“69469813”;
    char*buf=malloc(strlen(num)+1);
    要移除的尺寸=4;
    同时(删除-->0){
    char*src=num;
    char*dst=buf;
    而(*src<*(src+1)){*dst++=*src++;}//前进,直到下一个数字小于当前数字
    src++;//跳过它
    while(*dst++=*src++);//复制其余部分
    strcpy(num,buf);
    }
    printf(“%s\n”,num);//打印4613
    
    查看模运算符。欢迎使用StackOverflow!我编辑了您的问题,以使您的算法更清晰。我是否正确,或者您是否尝试执行其他操作?那么,您想删除数字中的最大数字吗?在C int中,除法是地板除法…因此您可以/10并反复检查%10,从右到左遍历数字,直到它为0。如何从69469813到4613?请注意,ensc的解决方案不适用于,例如,319只删除一次。在这种情况下,您希望删除3(如在我的解决方案中所做的),而不是9。