设计一个程序实现两个任意长的整数求和与差的运算

   更新日期:2024.06.01

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

//mat97

//以下是双链表的节点结构,每个节点存储一个4位的数,比如1,0031,0056存入链表后就是1,31,56三个节,输出的时候再补0输出!

typedef struct node{

    int n;

    struct node *next;

    struct node *prev;

} node;

node *p;

char num1[1024],num2[1024];

int conv(char *a)

{

    int n=0,i;

    for(i=0;a[i];++i)

    {

        n*=10;

        n+=(a[i]-'0');

    }

    return n;

}

int main()

{

    char c[2];

    int i,f;

    node *q;

    p=(node*)malloc(sizeof(node));

    p->next=p->prev=0;

    q=p;

    num1[0]=num2[0]=',';

    printf("Enter num 1:
");

    scanf("%s",num1+1);

    for(i=strlen(num1);i>=0;--i)

    {

        if(num1[i]==',')

        {

            num1[i]=0;

            q->next=(node*)malloc(sizeof(node));

            q->next->prev=q;

            q->next->next=0;

            q=q->next;

            q->n=conv(num1+i+1);

        }

    }

    q->next=p;

    p->prev=q;

    printf("Enter op:
");

    scanf("%s",c);

    *c=*c=='+'?0:1;

    printf("Enter num 2:
");

    scanf("%s",num2+1);

    q=p;f=0;

    if(!*c) //+

    {

        for(i=strlen(num2);i>=0;--i)

        {

            if(num2[i]==',')

            {

                num2[i]=0;

                if(q->next==p)

                {

                    q->next=(node*)malloc(sizeof(node));

                    q->next->next=p;

                    q->next->prev=q;

                    q->next->n=0;

                    p->prev=q->next;

                }

                q=q->next;

                q->n+=(conv(num2+i+1)+f);

                if(q->n<10000)

                    f=0;

                else

                {

                    f=1;

                    q->n-=10000;

                }

            }

        }

        if(f)

        {

            if(q->next==p)

            {

                q->next=(node*)malloc(sizeof(node));

                q->next->next=p;

                q->next->prev=q;

                q->next->n=1;

            }

            else

            {

                while(q->next!=p)

                {

                    q=q->next;

                    q->n+=1;

                    if(q->n<10000)

                    {

                        f=0;

                        break;

                    }

                    else

                    {

                        q->n=0;

                        f=1;

                    }

                }

                if(f)

                {

                    q->next=(node*)malloc(sizeof(node));

                    q->next->next=p;

                    q->next->prev=q;

                    q->next->n=1;

                }

            }

        }

        printf("%d,",p->prev->n);

        for(q=p->prev->prev;q!=p;q=q->prev)

            printf("%04d,",q->n);

    }

    else //-

    {

        for(i=strlen(num2);i>=0;--i)

        {

            if(num2[i]==',')

            {

                num2[i]=0;

                if(q->next==p)

                {

                    q->next=(node*)malloc(sizeof(node));

                    q->next->next=p;

                    q->next->prev=q;

                    q->next->n=0;

                    p->prev=q->next;

                }

                q=q->next;

                q->n-=(conv(num2+i+1)+f);

                if(q->n>=0)

                    f=0;

                else

                {

                    f=1;

                    q->n+=10000;

                }

            }

        }

        if(f)

        {

            if(q->next==p)

            {

                q->n-=10000;

            }

            else

            {

                while(q->next!=p)

                {

                    q=q->next;

                    q->n-=1;

                    if(q->n>=0)

                    {

                        f=0;

                        break;

                    }

                    else

                    {

                        q->n+=10000;

                        f=1;

                    }

                }

                if(f)

                {

                    q->n-=10000;

                }

            }

        }

        printf("%d,",p->prev->n);

        for(q=p->prev->prev;q!=p;q=q->prev)

            printf("%04d,",q->n);

    }

    return 0;

}


纯手打,已测试,楼主先看着,有不懂的再追问

加法:


减法:


编码辛苦,希望各位大神不要copy,小弟跪谢……



1.只考虑都是正数的情况,比较简单。
循环连别的节点这样定义:
struct Node{
int data;
Node * next;
Node * pre};
每个节点只保存小于10000的四位数,当两个长整数(也就是两个循环链表)相加的时候,
假设链表从低位到高位每四位保存到一个节点,那么就模拟加法的进位过程,两个链表的
对应节点相加,如果超过10000就向下一个节点进位,本节点只保留余数。
需要注意的是如果最后相加超过了最长链表的长度,加法的结果链表需要增加一个节点。

2.如果考虑加法的操作数有负数,设计要麻烦一些。
这个时候头结点要另外设计:
struct SNode{
char symbol;
Node * next;
Node * pre;}; 中间节点同上。
如果两个都是负数,可以调用1中的方法相加,但是最后结果要取负数,也就是symbol='-'。
如果一正一负,可以重新设计一个减法借位的过程,不过还有一个更好的方法。
联想到计算机中对负数加法的操作,使用了取补相加的方法。
我们可以借鉴这种思想,取(两个数中最长位数+1)为模。将负数链表每个节点取反(每个节点的模为10000,等效于9999-原值)再加一,然后把两个链表用1中的进位方法相加,如果结果中最后一个节点产生了进位,那么结果为正数,除了头结点置正无需再加额外操作。如果结果中最后一个节点没有进位,那么结果是负数,需要将头节点symbol置于负,并将链表每位取反再加一。

提供一个思路 ,就是把 长整数作为数组或者字符串做,自己 来做进位这一部分。

一定要链表?直接数组简单多了,加减乘还是蛮方便的,除法麻烦。

调代码花时间,还是不写了。。

  • 18399664437 :设计一个程序实现两个任意长的整数求和与差的运算
    祝闻卞4145 :答://以下是双链表的节点结构,每个节点存储一个4位的数,比如1,0031,0056存入链表后就是1,31,56三个节,输出的时候再补0输出! typedef struct node{ int n; struct node *next; struct node *prev; } node; node *p; char num1[1024],num2[1024]; int conv(char *a) { int n=0,i; for(i=0;a[...
  • 18399664437 :设计一个程序实现两个任意长的整数(包括正数和负数)、任意精度实数的算...
    祝闻卞4145 :答:int c1,c2,c3;shuzi *head1,*head2,*t,*p,*q;cout<<"请按每3位1组,组间用逗号隔开的方式输入两个长整数,每输入完一个请按回车表示输入完毕:"<<endl;chushi(head1,a,c1);chushi(head2,b,c2);cout<<endl<<"请选择需要进行的运算,加法请输入+,减法请输入- :";cin>>fuhao;cout...
  • 18399664437 :设计一个程序实现两个任意长的整数求和与差的运算
    祝闻卞4145 :答://以下是双链表的节点结构,每个节点存储一个4位的数,比如1,0031,0056存入链表后就是1,31,56三个节,输出的时候再补0输出!typedef struct node{ int n;struct node *next;struct node *prev;} node;node *p;char num1[1024],num2[1024];int conv(char *a){ int n=0,i;for(i=0;a...
  • 18399664437 :问题描述:设计一个程序实现两个任意长的整数的求和运算。
    祝闻卞4145 :答:1.只考虑都是正数的情况,比较简单。循环连别的节点这样定义:struct Node{ int data;Node * next;Node * pre};每个节点只保存小于10000的四位数,当两个长整数(也就是两个循环链表)相加的时候,假设链表从低位到高位每四位保存到一个节点,那么就模拟加法的进位过程,两个链表的 对应节点相加,...
  • 18399664437 :设计一个程序实现两个任意长的整数的求和运算。
    祝闻卞4145 :答:// 在这后,就肯定是a的长度比b小,所以和的位数最大就是b的位数+1。sum = new int[b.size()+1]; // 所以给和申请b的位数+1个位置。sum[0] = 0;char achar[1];char bchar[1];int carry = 0; // 记录进位 int sizeDif = b.size() - a.size(); // 记录两个数字的...
  • 18399664437 :设计一个程序实现两个任意长的证书的求和运算
    祝闻卞4145 :答:利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。要求输入和输出每四位一组,组间用逗号隔开。如:1,0000,0000,0000,0000,用C语言 / include <stdio.h> typedef struct bignumdata { int data ; /* 4 digits */ struct bignumdata * next , * prev ;} BIGNUMDATA ;t...
  • 18399664437 :编写程序实现两个超长正整数(每个最长80位数字)的加法运算。_百度知 ...
    祝闻卞4145 :答:void main() { char a[81],b[81],s[81];int n,flag;scanf("%s",s);sprintf(a,"%80s",s);scanf("%s",s);sprintf(b,"%80s",s);for(flag=0,n=79; n>=0; n--, flag/=10)s[n]=(flag=z(a[n])+z(b[n])+flag)%10;for(s[80]=flag=n=0; n<80; n++)if(flag...
  • 18399664437 :用数据结构算法实现---任意长的整数相加
    祝闻卞4145 :答:大体上是这样的,但是不太完善,输入的第一个数的组数(可以说就是逗号个数)要大于等于第二个数,测了测只要输入正确的话应该没什么问题 没时间完善了,lz根据情况自己改改吧 ps:不能计算负数 //created by onceway include<stdio.h> include<stdlib.h> include<memory.h> define MAXLEN 100 ...
  • 18399664437 :c语言编写 编写一个简单的计算器,实现两个整型数的四则运算。
    祝闻卞4145 :答:1、打开CodeBlocks,新建一个空白文件,先定义头文件和主函数,接着写程序多大的主体:2、首先定义所需要的变量,将变量定义为浮点型,定义输入函数,将刚才的x和y定义为计算的变量,将c定义为选择计算方式的变量。用switch语句,将c作为选择变量,填写计算方式的选项,最后在主函数中输入一个输出函数来...
  • 18399664437 :用Java编写 任意长的整数加法
    祝闻卞4145 :答:private char[] add2 = new char[add1Max];private int len1;private int len2;public void setAdd1() throws IOException { int i=0;String sLine1;System.out.print("请输入第一个长整数: ");//输入第一个长整数 BufferedReader in = new BufferedReader(new InputStreamReader(System.in...
  • 相关链接

    欢迎反馈与建议,请联系电邮
    2024 © 视觉网