在C

时间:2018-01-14 05:03:04

标签: c algorithm list linked-list singly-linked-list

我试图表示一个包含任何数字到无穷大的字符串。此数字必须是整数,并返回其值。现在,我的目标是做这个代表,但仅限于分工。因此,假设我们有125作为分子,5作为分母。答案应该是25对吗?但是,我需要将此数字表示为字符串的链接列表。目前解决这个问题的方法是通过减去"因为我可以一遍又一遍地重复这个数字,而不用担心它的余数和数字的大小。迭代必须使用10的基数,这意味着它必须读取' 0' 0到' 9'。

我的除法包括操作数A和B,以及递增计数器(将是最终结果),并减去这些操作数。这是我从Wikipedia和我的伙伴那里找到的逻辑/伪代码:

while N >= D do
    then  N := N - D
    counter++
end
return N

在前面的例子中,125/5将得到一个25的计数器,因为我们每次迭代我们的N并用5减去它。一旦N不大于或等于D,那么我们终于可以完成并返回我们的结果根据柜台。此计数器将被放置在一个新列表中,并添加到我们当前列表中以返回其最终值。

我必须使用逻辑来制作单独的函数,但我认为某些东西的结构不正确。

关联列表

typedef struct      s_list
{
    void            *content;
    size_t          content_size;
    struct s_list   *next;
}                   t_list;

typedef struct  s_BigNumber
{
    char        *base;
    int         base_size;
    char        *exp;
    int         exp_size;
}               t_BigNumber;

列出添加功能

void    lstadd(t_list **alst, t_list *new)
{
    if (new)
    {
        new->next = *alst;
        *alst = new;
    }
}

增量器

t_list  *increment(t_bistro *bistro, t_list *oper)
{
    t_list  *incr;
    t_list  *counter;

    incr = NULL;
    lstadd(&incr, ft_lstnew(&(bistro->base[1]), 1));
    counter = addition(bistro, oper, incr);
    del_num(oper);
    free(incr->content);
    free(incr);
    return (counter);
}

我的减法功能很大,需要其他功能才能工作,所以我会跳过它的代码。

这是我的实际代码,其中包含上述所有内容:

t_list      *division(t_list *big, t_list *oper1, t_list *oper2)
{
    t_list  *result;
    t_list  *tmp;

    result = NULL;
    lstadd(&result, lstnew(&(big->base[0]), 1)); //Creates a new list with the result to the first index of the new list
    while (oper2->content >= oper1->content)
    {
        tmp = result;
        result = subtract(big, result, oper1);
        del_num(tmp);
        oper2 = increment(big, oper2);
    }
    return (result);
}

打印值

void    digit_printer(char *num)
{
    char c;

    c = *num;
    putchar(c);
}

void    digitizer(t_list *num)
{
    if (num->next)
        digitizer(num->next);
    digit_printer(num->content);
}

主要

int main()
{
    t_list  *op1;
    t_list  *op2;
    t_list  *result;
    t_BigNumber *big;
    char *str = "125";
    char *str1 = "5";

    op1 = NULL;
    op2 = NULL;
    while (*str)
    {
        lstadd(&op1, lstnew(str, 1));
        str++;
    }
    while (*str1)
    {
        lstadd(&op2, lstnew(str1, 1));
        str1++;
    }

    big = malloc(sizeof(t_BigNumber));
    big->base = "0123456789";
    big->base_size = 10;

    result = division(big, op1, op2);
    digitizer(result);
    printf("\n");
}

预期产出:25

我正在寻找公开讨论,并愿意提出建议。您可以选择解决方案。一些指导和示例将帮助我:)。对不起我的整体英语。

0 个答案:

没有答案