每日一练问题:最大数(语言-c语言)

救命,第一此做题就难住了。这是 7.24 每日一练的题目,自己试着写了很久,感觉没有错,但一直通过不了,自己能想到的例子都试过了没问题。请大家帮忙看一下,写的代码不太规范,还请见谅
题目描述:
给定任意一个数字 m,然后给出数字 n,则需在 m 中去掉 n 位数,保持各位顺序不变的情况下,得到最大数。

输入描述:
输入整数n,m.(1<=n<=1e100,1<=m<=100)

输出描述:
输出删除后的最大数。

**示例 **
输入:1234 2
输出:34


void solution(int arr[2])
{
    int i=0;
    int b[10];
    while(arr[0]%10)
    {
        b[i]=arr[0]%10;
        i++;
        arr[0]=arr[0]/10;
    }
    i--;
    int temp = i;
    int max = 0;
    int flag = 0;
    int sum = 0;
    int n=i;
    while(flag<i+1 - arr[1] && i>0)
    {
        for(int j=temp;j>=i-arr[1]-flag;j--)
        {
            if(j == i){
                if(b[j]>max && j<=temp )
                {
                    max = b[j];
                    temp = j-1;
                    n=j;
                }
            }
                
            else{
                if(b[j]>max && j<=temp )
                {
                    max = b[j];
                    temp = j;
                    if(j==n)max=0;
                    n=j;
                }
            }
        }
        sum = sum*10+max;
        max=0;
        flag++;
    }
    printf("%d",sum);
}

int main() {
    int arr[2];
    
    for (int i = 0; i < 2; i++)
    {
        scanf("%d", &arr[i]);
    }
    
    solution(arr);
    return 0;
}
#include <stdio.h>
int solution(int arr[])
{
    int a[10];
    int num = arr[0];
    int n = 0;
    while (num > 0)
    {
        a[n++] = num % 10;
        num /= 10;
    }
    for (int i = 0; i < arr[1]; i++)
    {
        int min = 0;
        for (int j = 0; j < n - i; j++)
        {
            if (a[j] < a[min]) min = j;
        }
        for (int j = min; j < n - i - 1; j++)
        {
            a[j] = a[j + 1];
        }
    }
    int sum = 0;
    for (int i = n - arr[1] - 1; i >= 0; i--)
    {
        sum *= 10;
        sum += a[i];
    }
    return sum;
}

int main() {
    int arr[2];
    
    for (int i = 0; i < 2; i++)
    {
        scanf("%d", &arr[i]);
    }
    int sum = solution(arr);
    printf("%d",sum);
    return 0;
}


不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7622115
  • 这篇博客也不错, 你可以看下C语言(基础)给定一个字母N,输出一个字母三角形,输入一个整数n,n大于0小于等于26,表示字母三角形的层数
  • 除此之外, 这篇博客: C语言练习之求质数中的 题目要求:请对于给定的一个大于1的正整数N和一个大于1的正整数M,N一定大于M(N,M均小于等于10的6次方),请按从小到大的顺序输出所有小于等于N且大于等于M的质数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    这里我们采用质数筛法(sieve method)的方式。与之前的对每一个数字依次判断是否为质数的方式不同,筛法的思想是“标记出所有非质数,输出所有没被标记的数字”。这里以“输出15以内大于1的所有质数”为例,示例代码如下:

    #include <stdio.h>
    int main() {
        int n = 15;
        int mark[16] = {
            1, 1, 0, 0,
            0, 0, 0, 0,
            0, 0, 0, 0,
            0, 0, 0, 0
        };
        int c;
        int j;
    
        for (c = 2; c * c <= n; c++) {
    		if (mark[c] != 1) {
                for (j = 2; j <= n / c; j++) {
                    mark[c * j] = 1;
                }
            }
        }
    	for (c = 2; c <= n; c++) {
            if (mark[c] != 1) {
                printf("%d\n", c);
            }
        }
        return 0;
    }
    

    这里采用此筛法,并使用string.h中的memset函数设置数组内的元素。本题代码如下:

    #include <stdio.h>
    #include <string.h>
    int n = 1000000;
    int mark[1000001];
    int main() {
        int c;
        int i, j;
        int N;
        int M;
        scanf("%d%d", &N, &M);
        memset(mark, 0, sizeof(mark));
        mark[0] = 1;
        mark[1] = 1;
        for (c = 2; c * c <= n; c++) {
            if (mark[c] != 1) {
                for (i = 2; i <= N / c; i++) {
                    mark[c * i] = 1;
                }
            }
        }
        for (j = M; j <= N; j++) {
            if (mark[j] != 1) {
                printf("%d\n",j);
            }
        }
        return 0;
    }
    
  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答:

    根据题目描述,我们需要从一个给定数字m中去掉n位数,并保持各位顺序不变,得到最大的数。

    解决这个问题的思路如下: 1. 将输入的整数m转换为字符串形式,方便进行删除操作。 2. 创建一个空字符串res,用于存储最终的结果。 3. 初始化一个变量count为n,表示还需要删除的位数。 4. 从左到右遍历字符串m的每一位: - 如果count>0且res不为空且当前位大于res的最后一位,则删除res的最后一位,并将count减1。 - 将当前位添加到res的末尾。 5. 如果count仍然大于0,则从res的末尾删除count个字符。 6. 将res转换为整数,并返回结果。

    下面是具体的代码实现:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
        int m, n;
    
        // 输入数据
        printf("请输入m和n:");
        scanf("%d %d", &m, &n);
    
        // 将m转换为字符串
        char str[101];
        sprintf(str, "%d", m);
    
        // 删除n位数
        int count = n;
        char res[101] = "";
        for (int i = 0; i < strlen(str); i++) {
            while (count > 0 && strlen(res) > 0 && str[i] > res[strlen(res) - 1]) {
                // 删除res的最后一位
                res[strlen(res) - 1] = '\0';
                count--;
            }
            // 将当前位添加到res的末尾
            char digit[2] = {str[i], '\0'};
            strcat(res, digit);
        }
        // 如果count仍然大于0,则从res的末尾删除count个字符
        while (count > 0 && strlen(res) > 0) {
            res[strlen(res) - 1] = '\0';
            count--;
        }
    
        // 输出最大的数
        int result = atoi(res);
        printf("输出:%d", result);
    
        return 0;
    }
    

    这样,我们可以通过输入m和n来得到删除数字后的最大数。请注意,输入的m和n的范围必须满足1<=m<=100和1<=n<=1e100,否则可能导致程序出错。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

输入整数n,1<=n<=1e100 ,用 int 类型不够吧。