高精度乘法运算1

 #include "iostream.h"

#include "minmax.h"

#include "string.h"

typedef struct Data

{

   int digit;

   struct Data *next;

 } node; 

typedef node* pnode;

bool InputData(pnode head);

void PrintData(pnode head);

int StandardChange(char *s);

booll Multiplication(pnode a, pnode b, pnode &head);

int CutTailZero(char *s);

void  CutFirstZero(char *s);

void CutAllSpace(char *s);

void main()

{

   pnode heada, headb, head;

   heada=new node;

   if (!heada) return;

   headb=new node;

   if (!heada)

   { 

      delete heada; return;

    }

    head=new node;

   if (!head)

   {

      delete heada;

      delete headb;

      return;

    }

    cout << "请输出被乘数(正数):";

    if (!InputData(heada)) return;

    cout<<"请输出乘数(正数):";

    if (!InputData(headb)) return;

    PrintData(heada);

    PrintData(headb);

    if (Multiplication(heada, headb, head)) PrintData(head);

}

 

// 输入信息

bool InputData(pnode head)

{

   char s[100];

   int i, DecimalNum, length;

   pnode p, p1;

   cin.getline(s, 1000);

   DecimalNum=StandardChange(s);

   if (DecimalNum==-1) return false;

   length=strlen(s);

   p=head;

   p->digit=DecimalNum+100*length;

   for (i=length-1; i>=0; i--)

   {

      p1=new node;

      if (!p1) return false;

      p1->digit=s[i]-48;

      p->next=p1;

      p=p1;

    }

   p->next=0;

   return true;

}

 

int StandardChange(char *s)

{

   int i, Pointi, length, point;

   CutAllSpace(s);

   point=false;

   length=strlen(s);

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

   {

      if (s[i]=='.')

      {

         if (point) break;

         point=true;

         continue;

      }

      if (s[i]<'0' || s[i]>'9') break;

    }

    s[i]=0;

    CutFirstZero(s);

    point=CutTailzero(s);

    length=strlen(s);

    PointNum=length-pointi-1;

    if (PointNum<0)  PointNum=0;

    for(i=pointi; i<length; i++)

      s[i]=s[i+1];

    CutFirstZero(s);

    if (!s[0]) return -1;

    return PointNum;

}

 

// 高精度乘法运算(支持:99位小数及总位数2亿位)

bool Multiplication(pnode a, pnode b, pnode &head)

{

   pnode pa, pb, p, p1;

   int n, nb, xb, x;

   pa=a->next;

   pb=b->next;

   if (!pa || !pb) return false;

   n=a->digit/100+b->digit/100;

   p=head;

   while(n)

   {

      p1=new node;

      p1->digit=0;

      p->next=p1;

      p=p1;

      n--;

    }

    p->next=NULL;

    nb=0;

    p1=b->next;

    pb=b->next;

    while(pb)

    {

       nb++;

       p1=p1->next;

       p=p1;

       xb=pb->digit;

       pa=a->next;

       while(pa)

       {

          x=xb*pa->digit;

          p->digit+=x;

          p=p->next;

          pa=pa->next;

         }

      pb=head->next;

      while(p)

      {

         x=p->digit;

         if (x<9) p->digit=x%10;

         p=p->next;

         if (x/10) p->digit+=x/10;

       }

       p=head;

       n=0;

       while(p->next)

       {

          if (!p->next->next && !p->next->digit)

          {

             p->next=NULL;

             break;

           }

           p=p->next;

           n++;

         }

         x=a->digit%100+b->digit%100;

         head->digit=100*n+x;

         return true;

     }

 

// 输出信息

void PrintData(pnode head)

{

   pnode p;

   int Decimal, n, pos, i;

   char *s;

   p=head;

   n=p->digit/100;

   Decimal=p->digit%100;

   s=new char[n+3];

   if (!s) return;

   pos=max(n, Decimal);

   if (Decimal)

     if (Decimal<n) pos++;

        else  pos+=2;

   s[pos]=0;

   p=head->next;

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

   if (p)

   {

      s[--pos]=p->digit+48;

      p=p->next;

    }

    else s[--pos]='0';

    if (Decimal) s[--pos]='.';

    while(p)

    {

       s[--pos]=p->digit+48;

       p=p->next;

     }

     if (Decimal>=n) s[--pos]='0';

     CutTailZero(s);

     cout<<s<<endl;

  }

 

// 截掉小数点后末尾无效的0, 如12,300

int CutTailZero(char *s)

{

   int length, pointi, i;

   length=strlen(s);

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

   if (s[i]=='.') break;

   pointi=i;

   for(i=length-1;i>pointi; i--)

      if (s[i]!='0' break;

      s[i+1]=0;

    length=strlen(s);

    if (s[length-1]=='.') s[length-1]=0;

    return pointi;

}

 

// 截掉前面无效的0,如0012.3变换成12.3

void CutFirstZero(char *s)

{

   int length, start, i;

   length=strlen(s);

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

   if (s[i]!='0') break;

   start=i;

   for(i=start; i<=length; i++)

   s[i-start]=s[i];

}

 

// 去掉字符串中的所有空格

void CutAllSpace(char *s)

{

   int i, n, length;

   n=0;

   length=strlen(s);

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

      if (s[i]!=' ') s[n++]=s[i];

   s[n]=0;

}

基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值