链表数值计算(C语言)

需要考虑到如下问题:

(1)由链表存储的数怎么转化为可以进行运算的数值

(2)数值的存储采用哪种数据类型,考虑运算过程中数值可能会超过定义的数据类型值的范围,采用数组形式存储解决溢出问题

(3)数组形式的数值怎么进行加法运算

(4)数值结果如何转化为可用链表存储的形式

#include <stdio.h>
#include <math.h>
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode *L,*p,*q,*r;
    int num1[200]={0},num2[200]={0};
    L = (struct ListNode *)malloc(sizeof(struct ListNode));
    L->next = NULL;
    p = l1;
    q = l2;
    int i = 0;
    while (p !=NULL){
        num1[i]=p->val;
        //printf("%d",num1[i]);
        p = p->next;       
        i+=1;
    }
    //printf("\n");
    int j = 0;
    while (q!=NULL){
        num2[j]=q->val;
        //printf("%d",num2[j]);
        q = q->next;
        j+=1;
    }
    printf("\n");
    int max = i>j?i:j,k=0;
    for(k=0;k<max;k++){
        num1[k] = num1[k]+num2[k];
        if (num1[k]>9){
            num1[k]=num1[k]-10;
            num1[k+1]++;
        }
         //printf("%d",num1[k]);
    }
    //printf("\n");
    int s;
    for(s=max;num1[s]==0&&s>0;s--);        
    for(int t=s;t>=0;t--){
        r = (struct ListNode *)malloc(sizeof(struct ListNode));   
        r->val = num1[t];
        r->next = L->next;     
        L->next = r;
    }   
    
    return r;
            
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链表高精度计算π值的基本思路是模拟手算过程,将π值每一位存储在链表的节点中,通过链表的逆序输出得到π的近似值。 以下是使用链表实现高精度计算π值的C语言代码: ``` #include <stdio.h> #include <stdlib.h> #define PRECISION 10000 // 精度,表示小数点后位数 #define BASE 10000 // 基数,用于表示一个节点存储的数值的最大值 typedef struct node { int value; // 节点的值 struct node *next; // 下一个节点的指针 } Node; void add(Node *head, int value) { Node *p = head; while (p->next != NULL) { p = p->next; } p->next = (Node *)malloc(sizeof(Node)); p->next->value = value; p->next->next = NULL; } void free_list(Node *head) { Node *p = head; while (p != NULL) { Node *q = p->next; free(p); p = q; } } void print_list(Node *head) { Node *p = head->next; while (p != NULL) { printf("%04d", p->value); p = p->next; } printf("\n"); } void calc_pi(int n) { Node *head = (Node *)malloc(sizeof(Node)); head->value = 2; head->next = NULL; int a = 2, b = 1, c = 1, d = 0; for (int i = 1; i <= n; i++) { int m = a * i + b, t = c * i + d; b = a; d = c; a = m; c = t; while (a >= b * BASE) { int q = a / b, r = a % b; head->value += q; add(head, r); a = r; } } print_list(head); free_list(head); } int main() { calc_pi(PRECISION); return 0; } ``` 在上面的代码中,我们定义了一个Node结构体表示链表的节点,其中value表示节点的值,next表示下一个节点的指针。add函数用于向链表中添加一个节点,free_list函数用于释放链表的内存,print_list函数用于输出链表中的值。calc_pi函数是计算π值的核心函数,它根据公式计算π的每一位,并将每一位存储在链表的一个节点中,最后逆序输出链表中的值,得到π的近似值。 在以上代码中,我们使用了10000的进制,所以每个节点存储的数值的最大值为9999,即BASE-1。因为使用了链表,所以可以处理非常大的精度,例如可以计算出1000000位以上的π值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值