陪伴孩子成长学习的地方 ------ 扫码添加微信

高精度运算

我们在进行运算的数,范围如果超出了标准数据类型能表示的范围的话,这个运算就叫做高精度运算。例如球两个200位的数的和,就要用到高精度运算。在高精度运算中,一般用字符串读入数据,再用数组存储数据。


 

【问题描述】

  老师需要你对两个超过十一位的数进行相加;

【输入样例】

  8569742356145896

  215783669444444427

【输出样例】

  224353411800590323

 

【问题分析】

  由于这两个加数特别大,已经超出了一般数值型数据的表示范围,因此需要用字符串来接收两个数,再用字符串几区的方法取出每一位并转换为数字存放到数值型数组中。用A数组存放第一个数,用B数组存放第二个数。

 

【新的知识】

   856

+ 255    

1 1 1 1

  上面的例子中,我们利用竖式法做加法。于是,我们可以利用数组A,B来存储加数和被加数,用数组C存储结果。注意:保存加数和被加数的时候,数组中的第一位是字符串的最高位,也就是这个数的各位。因此字符串转换的时候要反向保存到数组里面。

   A2 A1 A0

+ B2 B1 B0  

C3 C2 C1 C0

 1 void add(int a[],int la,int b[],int lb,int c[],int &lc) 
 2 {
 3   memset(c,0,sizeof(c)); 
 4   lc=max(la,lb);
 5   for(int i=0;i<lc;++i)
 6   {
 7      c[i]=a[i]+b[i];
 8      if(c[i]>10) // 进位处理
 9      {
10         ++c[i+1];
11         c[i]=c[i]-10;
12      }
13   }
14   if (c[lc]) ++lc; // 特殊处理最后一次进位
15 }

memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的;

包含在<string.h>头文件中,可以用它对一片内存空间逐字节进行初始化;

原型为 :

void *memset(void *s, int v, size_t n);  

这里s可以是数组名,也可以是指向某一内在空间的指针;

v为要填充的值;

n为要填充的字节数; 

struct data
{
char num[100];
char name[100];
int  n;
};
struct data  a, b[10];
  
memset( &a, 0, sizeof(a) ); //注意第一个参数是指针类型,a不是指针变量,要加&
memset( b, 0, sizeof(b) );  //b是数组名,就是指针类型,不需要加&

 

【问题解决】

#include <string>
#include <cstring>
#include <iostream>
using namespace std;
const int maxL=20;
string s;
int a[maxL],b[maxL],c[maxL];
int la,lb,lc;
int main()
{
  cin>>s;
  la=s.length();
  for(int i=0;i<la;++i) // 字符串转为数组,注意翻转
     a[i]=s[la-1-i]-'0';
  cin>>s;
  lb=s.length();
  for(int i=0;i<lb;++i)
     b[i]=s[lb-1-i]-'0';
  add(a,la,b,lb,c,lc);
  for(int i=lc-1;i>=0;--i)
      cout<<c[i];
  return 0;       
}

 

posted @ 2019-08-02 17:11  极光编程小助手  阅读(225)  评论(0编辑  收藏  举报