删数问题,贪婪算法,c语言

这学期在上算法与设计这本书,本人真的C语言非常非常菜,以至于这道题我花了4个下午和2个晚上才做出来,贪婪算法的删数问题网上有很多相关资料,不过都是要求最后组成的整数最小,但可悲我们的作业要求最后组成的整数最大(对我这个菜鸟来说一点点改动都可能给我巨大的挑战),我要在这里记录下我思考的历程!!!以便日后让我自己知道我当时脑子是怎么想的!!!

我们提交算法作业是在这个网站:清览题库 (qingline.net),真的好用,可以找出算法的很多bug,但也有一些鸡肋的地方,感兴趣的可以去体会。

题目:苦逼的小明正在面对着一个很长很长的正整数苦恼,这个正整数由n个数字组成。现在小明被要求在这n个数字中删掉s个数字,剩下的数字按原来的左右次序重新组成一个新的整数。现在小明希望这个新组成的整数尽量大

输入:由n个数字组成的正整数和s

输出:新组成的最大正整数

数据范围:1<=n<=100,0<=s<=n

输入样例:311111111111111111112 2

输出:3111111111111111112

第一阶段:我拿到这道题,我在想:我需要一个字符串数组,然后因为要索引我需要把字符串数组转换成整型数组才可以,当时我真的这么想的!!!然后本来数组没学好,是上课没听的没学好,于是花了一个下午寻找我这个字符串变成整型数组的C语言怎么写,我先char n[100]定义了一个字符串数组,关于我输入方法的寻找过程是:

scanf("%s", n);    //这种2022版的visual stdio不通过--->
fgets(n, 100, stdin);   //后来在老师了解这个fgets会读取换行符,又不行!!--->
gets_s(n);   //这个在我们要提交的清览平台上不通过!!但是在2022版的visual stdio可以通过!--->
scanf("%s", n);   //后来发现这个在我们要提交的清览平台上可以通过!!,我又又行了!!!

//最后我决定在清览平台用scanf语法,在2022版的visual stdio用gets_s调试,反正我是两边跑代码!!

我之后还找到了一篇很详细的介绍这几种方法的文章:

(54条消息) c语言常量换行符,C语言中换行符问题_weixin_39723441的博客-CSDN博客

我是在这里发现居然还有gets_s这种方法!!!看到这篇文章才发现我真的基础很薄弱!!我这些基本不知道!

接下来是重要的算法设计!我实在不理解说明是贪婪算法,我理解能力真的有点差的!我习惯在网上找代码然后改一改这种很偷懒的方法,但是浏览网上资料全部!都是!求最小值,而且大多是用C++,python写的,我有幸找到了一篇!调试无错误,但是运行不出来!!尝试改也改不对,哎终究是我不理解他得到算法的逻辑!

后来实在没办法只能自己看书写,书上也是求最小值的(有苦说不出),《算法设计与分析》这本书的算法排版比较乱,写的简单,如他只会告诉你input(n),然后两个for循环本来应该嵌套的,他会直接并列写出,所以我看的也很吃力,因为要搞懂算法的意思真的有点难,花了一个下午和一个晚上写的代码:

完整代码:


#include<stdio.h>
#include<string.h>//stlen()这些库函数在这个头文件中

int del(char n[], int b, int k) {//n为字符串数组,b为要删除的数字的数组索引,k为删除个数k=1
    int i1;
    for (i1 = b; i1 <= strlen(n) - k; i1++) {
        n[i1] = n[i1 + k];//从后面一个数字向前一个数字覆盖,最后吧要删除的数字覆盖

    }
    return 0;
}

int main()
{
    char n[100];  
    scanf("%s",n);
    //gets_s(n)
    int s, i, j,len;
    int del(char n[], int b, int k);
    scanf("%d", &s);
   
    len = strlen(n);
   
    if(s==len||s>len){    //处理要删除的个数大于等于字符串长度的情况
        printf("0");
    }
    else{
    for (i = 1; i <=s; i++) {  //循环几次即要删除几个数
        for (j = 0; j < strlen(n); j++) {
            if (n[j] < n[j + 1]) {   //如果是大于等于,回到内层for循环,j++
                del(n, j, 1);
                //j1 = j;
                break;          //跳出内层循环,回到外层for循环,
            }
            if (j == len-i-1) {    //当删掉了一些数字后,其余数字为递减序列的情况
                    del(n, j+1, 1);
                    break;
            }  
           
            


        }
    } 
    printf("%s",n);
    }
    
}

不知道这里面有没有用到贪婪算法的思想,还没理解透哎

路漫漫其修远兮,吾将上下而求索。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值