119.超长正整数的加法

简介: 119.超长正整数的加法
#include<stdio.h>
#include<stdlib.h>
#define HUNTHOU 10000
typedef struct node{ int data;
                     struct node *next;
                  }NODE;                 /*定义链表结构*/
NODE *insert_after(NODE *u,int num);     /*在u结点后插入一个新的NODE,其值为num*/
NODE *addint(NODE *p,NODE *q);           /*完成加法操作返回指向*p+*q结果的指针*/
void printint(NODE *s);
NODE *inputint(void);
void main()
{
   NODE *s1,*s2,*s;
   NODE *inputint(), *addint(), *insert_after();
   clrscr();
   puts("*********************************************************");
   puts("*              This program is to calculate             *");
   puts("*       the addition of king sized positive integer.    *");
   puts("*********************************************************");
   printf(" >> Input S1= ");
   s1=inputint();            /*输入被加数*/
   printf(" >> Input S2= ");
   s2=inputint();            /*输入加数*/
   printf(" >> The addition result is as follows.\n\n");
   printf("    S1= "); printint(s1); putchar('\n');     /*显示被加数*/
   printf("    S2= "); printint(s2); putchar('\n');     /*显示加数*/
   s=addint(s1,s2);                                 /*求和*/
   printf(" S1+S2="); printint(s); putchar('\n');    /*输出结果*/
   printf("\n\n Press any key to quit...");
   getch();
}
NODE *insert_after(NODE *u,int num)
{
   NODE *v;
   v=(NODE *)malloc(sizeof(NODE));      /*申请一个NODE*/
   v->data=num;                         /*赋值*/
   u->next=v;                           /*在u结点后插入一个NODE*/
   return v;
}
NODE *addint(NODE *p,NODE *q)         /*完成加法操作返回指向*p+*q结果的指针*/
{
   NODE *pp,*qq,*r,*s,*t;
   int total,number,carry;
   pp=p->next; qq=q->next;
   s=(NODE *)malloc(sizeof(NODE));     /*建立存放和的链表表头*/
   s->data=-1;
   t=s; carry=0;                      /*carry:进位*/
   while(pp->data!=-1&&qq->data!=-1)    /*均不是表头*/
   {
      total=pp->data+qq->data+carry;     /*对应位与前次的进位求和*/
      number=total%HUNTHOU;             /*求出存入链中部分的数值 */
      carry=total/HUNTHOU;              /*算出进位*/
      t=insert_after(t,number);         /*将部分和存入s向的链中*/
      pp=pp->next;                         /*分别取后面的加数*/
      qq=qq->next;
   }
   r=(pp->data!=-1)?pp:qq;          /*取尚未自理完毕的链指针*/
   while(r->data!=-1)              /*处理加数中较大的数*/
   {
      total=r->data+carry;         /*与进位相加*/
      number=total%HUNTHOU;        /*求出存入链中部分的数值*/
      carry=total/HUNTHOU;         /*算出进位*/
      t=insert_after(t,number);     /*将部分和存入s指向的链中*/
      r=r->next;                   /*取后面的值*/
   }
   if(carry) t=insert_after(t,1);     /*处理最后一次进位*/
   t->next=s;                   /*完成和的链表*/
   return s;                     /*返回指向和的结构指针*/
}
NODE *inputint(void)     /*输入超长正整数*/
{
   NODE *s,*ps,*qs;
   struct number {int num;
                  struct number *np;
               }*p,*q;
   int i,j,k;
   long sum;
   char c;
   p=NULL;     /*指向输入的整数,链道为整数的最低的个位,链尾为整数的最高位*/
   while((c=getchar())!='\n')     /*输入整数,按字符接收数字*/
      if(c>='0'&&c<='9')           /*若为数字则存入*/
      {
         q=(struct number *)malloc(sizeof(struct number));    /*申请空间*/
         q->num=c-'0';           /*存入一位整数*/
         q->np=p;                /*建立指针*/
         p=q;
      }
   s=(NODE *)malloc(sizeof(NODE));
   s->data=-1;                  /*建立表求超长正整数的链头*/
   ps=s;
   while(p!=NULL)        /*将接收的临时数据链中的数据转换为所要求的标准形式*/
   {
      sum=0;i=0;k=1;
      while(i<4&&p!=NULL)          /*取出低四位*/
      {
         sum=sum+k*(p->num);   
         i++; p=p->np; k=k*10;
      }
      qs=(NODE *)malloc(sizeof(NODE));          /*申请空间*/
      qs->data=sum;                     /*赋值,建立链表*/
      ps->next=qs;
      ps=qs;
   }
   ps->next=s;
   return s;
}
void printint(NODE *s)
{
   if(s->next->data!=-1)         /*若不是表头,则输出*/
   {
      printint(s->next);             /*递归输出*/
      if(s->next->next->data==-1)
         printf("%d",s->next->data);
      else{
         int i,k=HUNTHOU;
         for(i=1;i<=4;i++,k/=10)
            putchar('0'+s->next->data%(k)/(k/10));
      }
   }
}
相关文章
|
3月前
|
SQL 人工智能 数据可视化
高校迎新管理系统:基于 smardaten AI + 无代码开发实践
针对高校迎新痛点,基于smardaten无代码平台构建全流程数字化管理系统,集成信息采集、绿色通道、宿舍管理等七大模块,通过AI生成框架、可视化配置审批流与权限,实现高效、精准、可扩展的迎新服务,大幅提升管理效率与新生体验。
|
编解码 开发工具 Android开发
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)2
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)2
942 2
|
10月前
|
人工智能 算法 Java
零门槛、百万token免费用,即刻拥有DeepSeek-R1满血版,还有实践落地调用场景等你来看
DeepSeek 是热门的推理模型,能在少量标注数据下显著提升推理能力,尤其擅长数学、代码和自然语言等复杂任务。本文涵盖四种部署方案,可以让你快速体验云上调用 DeepSeek-R1 满血版的 API 及部署各尺寸模型的方式,无需编码,最快 5 分钟、最低 0 元即可实现
|
Rust 安全 Java
探索Rust在系统编程中的崛起
Rust 是一种由 Mozilla 研究院开发的现代系统编程语言,以其在安全性、并发性和内存管理方面的优势,逐渐成为开发者的新宠。Rust 提供内存安全保证且性能媲美 C/C++,支持跨平台开发,并具备强大的并发编程工具。本文将介绍 Rust 的核心优势、工作原理及实施方法,探讨其在系统编程中的崛起及其面临的挑战。尽管 Rust 学习曲线较陡,但其广泛的应用场景和不断壮大的社区使其成为构建高性能、安全应用的理想选择。
|
API 网络安全
天气查询
【10月更文挑战第02天】
578 1
|
9月前
|
传感器 算法 数据安全/隐私保护
基于PI控制算法的pwm直流电机控制系统Simulink建模与仿真
本课题基于PI控制算法的PWM直流电机控制系统在Simulink中建模与仿真,对比了传统PI控制器的效果。结果显示,基于PI控制算法的PWM系统在控制性能上更优,具有更好的动态响应和稳态精度。系统通过实时调整PWM信号占空比,实现对电机转速的精确控制。核心程序使用MATLAB 2022a编写,仿真结果无水印展示。系统包括传感器、PI控制器和PWM发生器三大部分,通过合理整定PI参数,可优化系统性能,减少超调量并加快响应速度。
|
消息中间件 存储 人工智能
《AI 大模型助力客户对话分析》解决方案评测
一文带你了解《AI 大模型助力客户对话分析》解决方案的优与劣
449 11
|
存储 数据安全/隐私保护 索引
SV39多级页表的硬件机制
【10月更文挑战第26天】SV39多级页表机制包括三级页表结构,每个页表项64位,通过SATP寄存器控制地址转换。地址转换过程涉及三级页表查找,最终生成物理地址。页表项包含有效位和访问权限位等标志,用于内存管理和访问控制。物理页帧的分配和回收确保内存的有效利用。
557 4
|
供应链 区块链 数据安全/隐私保护
智能合约技术在供应链管理中的应用与挑战####
智能合约,作为区块链技术的重要组成部分,正逐步渗透至供应链管理领域,以其自动化执行协议、增强透明度与效率的特性,重塑着传统供应链的运作模式。本文旨在探讨智能合约如何在供应链中发挥作用,解决现有问题,并分析面临的挑战及可能的解决方案。通过具体案例分析,揭示其在提高供应链透明度、降低成本、加速交易速度等方面的潜力。 ####