预备役2(2021-11-24)

今日学习内容:1.回顾了大数乘法,复习了队列和栈的基础及思想。另外在刷题网站上刷了五道字符串的题目,在acm刷题上刷了两道菜鸟杯题组,还没来的急给代码增添注释。

首先对于大数运算(不限于乘法)我觉得大致可以分为四个步骤:首先就是给数组置零,说到置零,今天受到tzy学姐的指导,让我彻底了解了memset函数的用法(虽然我以前就知道)。,这是一个非常好用的函数,但是需要引入头函数“string.h”,以memset(数组名,赋值,sizeof(数组名))来体现。回归正题,置空了用来存储字符串的数组和用于求和的数组之后,我们就要对其中的两个字符串进行存储,因为我只学习了大数加减乘,这三个都是需要反向存储的,也就是把‘123’以‘321’的形式存储到一个新数组中。第三步就是进行运算及进位,对于乘法来说,关键点也就在于怎么样进行运算,进位大家都能依据例子进行编码,但是运算却有很多种方式,这里我采用了另一位答主的方法,详情请移步到:C语言实现大数运算(长整数的加、减、乘、除)_混z的博客-CSDN博客

最后一步,对于已经处理好的求和数组,我们需要对他们消除前导0并反向输出。下面是代码实现:

//2121.11.24

#include <stdio.h>

#include <string.h>

int a[1000], b[1000], c[1000];

char arr[1000], brr[1000], car = 0;

int main()

{

    gets(arr);

    gets(brr);

    memset(a, 0, sizeof(a));//置空数组

    memset(b, 0, sizeof(b));

    memset(c, 0, sizeof(c));

    int i, j, k = 0, t, len1, len2;

    len1 = strlen(arr), len2 = strlen(brr);

    for (i = 0; i < len1; i++)//反向存储字符串

        a[i] = arr[len1 - 1 - i] - '0';

    for (i = 0; i < len2; i++)

        b[i] = brr[len2 - 1 - i] - '0';

    for (i = 0; i < len1; i++)//进行运算

        for (j = 0, k = i; j < len2; k++, j++)

            c[k] += a[i] * b[j];

    for (i = 0; i <= k; i++)//进行进位

    {

        c[i] += car;

        t = c[i];

        c[i] = t % 10;

        car = t / 10;

    }

    for (i = k; c[i] == 0; i--);//利用空语句消除前导0

    for (; i >= 0; i--)//反向输出

        printf("%d", c[i]);

    printf("\n");

}

2.第二就是栈和队列了,这两个我只是在啊哈算法里边学习过,所以只了解他们的基础思想,对于队列来说,就是先进先出,用书上的比喻来说,就是一群人在排队买东西,先排队的人先买到,先买到东西的人就能先出队,即先进先出。对于栈来说就是先进后出,他就相当于往一个动力边丢东西,每样东西恰好占满整个横截面积,所以只能往上叠加,如果我们要把第一个东西拿出来,那我就得把它上面的东西依次拿出来,这就是栈的思想。

接下来附上相关代码,以便我自己后续复习能更加简便。

队列:

 

 栈:

 

 最后,今天是真的很忙,处理了一些琐碎的事情,导致占用了很多时间,再加上做题效率有点低,导致今天的学习成果较少,希望以后自己能认真规划好时间,合理分配,把时间最大化利用起来。

Guess you like

Origin blog.csdn.net/qq_33302352/article/details/121527542