• 题解 P1601 【A+B Problem(高精)】


    P1601 A+B Problem(高精)

    题目描述

    高精度加法,x相当于a+b problem,b不用考虑负数。

    输入输出格式

    输入格式:

    分两行输入a,b<=10^500

    输出格式:

    输出只有一行,代表A+B的值

    输入输出样例

    输入样例: 
    1
    1
    输出样例: 
    2

    比较简单的高精度。

    高精度。顾名思义,就是在很大的位数情况下进行运算。(炸int)

    其基本思想就是用数组进行模拟加法。

    模拟近位。

    最后遍历数组输出。

    附代码:

     1 #include <cstdio>
     2 #include <iostream>
     3 using namespace std;
     4 
     5 struct diff{
     6     int len;short x[3005];
     7 
     8     void read(){
     9         int len_read;
    10         string read;
    11         cin>>read;
    12         len=0;len_read=read.size();
    13         for(int i=len_read-1;i>=0;i--)x[++len]=read[i]-48;
    14     }
    15 
    16     void write(){
    17         for(int i=len;i>=1;i--)printf("%d",x[i]);
    18         printf("
    ");
    19         return ;
    20     }
    21 
    22     struct diff operator+(struct diff tmp){
    23         int c=0;
    24         struct diff ans;
    25         ans.len=tmp.len;if(len>ans.len)ans.len=len;
    26         for(int i=1;i<=ans.len;i++)
    27         {
    28             ans.x[i]=x[i]+tmp.x[i]+c;
    29             c=ans.x[i]/10;ans.x[i]%=10;
    30         }
    31         if(c>0)ans.x[++ans.len]=c;
    32         return ans;
    33     }
    34 }a,b;
    35 
    36 int main(){
    37     a.read();b.read();a=a+b;a.write();
    38     return 0;
    39 }
    View Code

    我们每个人都应该做到精益求精,所以还可以将普通高精度升华一下

    那就是传说中的万进制高精度:

     1 #include <iostream>
     2 #include <cstdio>
     3 using namespace std;
     4 string s1,s2;
     5 int c,len,len1,a[100005],len2,b[100005];
     6 
     7 void turn()
     8 {
     9     int x,y,lx=s1.size(),ly=s2.size(),l,r;
    10     int c[100005],d[100005];
    11     l=lx/4;r=ly/4;
    12     x=lx-l*4;y=ly-r*4;
    13     for(int i=0;i<x;i++)c[1]=c[1]*10+s1[i]-48;
    14     for(int i=0;i<y;i++)d[1]=d[1]*10+s2[i]-48;
    15     for(int i=2;i<=l+1;i++)c[i-(x==0)]=(s1[4*(i-2)+x]-48)*1000+(s1[4*(i-2)+x+1]-48)*100+(s1[4*(i-2)+x+2]-48)*10+(s1[4*(i-2)+x+3]-48);
    16     for(int i=2;i<=r+1;i++)d[i-(y==0)]=(s2[4*(i-2)+y]-48)*1000+(s2[4*(i-2)+y+1]-48)*100+(s2[4*(i-2)+y+2]-48)*10+(s2[4*(i-2)+y+3]-48);
    17     len1=l+(x>0);len2=r+(y>0);
    18     for(int i=1;i<=len1;i++)a[i]=c[len1-i+1];
    19     for(int i=1;i<=len2;i++)b[i]=d[len2-i+1];
    20 
    21 }
    22 
    23 int main()
    24 {
    25     cin>>s1>>s2;
    26     turn();
    27     len=len1;if(len2>len)len=len2;
    28     for(int i=1;i<=len;i++)
    29     {
    30         a[i]=a[i]+b[i]+c;
    31         c=a[i]/10000;
    32         a[i]%=10000;
    33     }
    34     if(c>0)a[++len]=c;
    35     printf("%d",a[len]);
    36     for(int i=len-1;i>=1;i--)printf("%04d",a[i]);
    37     return 0;/*万进制高精加*/
    38 }
    View Code

    万进制高精加要注意输出“printf("%04d",a[i]);”

    点个赞吧↓

     

  • 相关阅读:
    Oracle学习笔记:使用replace、regexp_replace实现字符替换、姓名脱敏
    Oracle学习笔记:外连接(+)的用法
    Oracle学习笔记:with as子查询用法
    Oracle学习笔记:a inner join b与from a,b where a.x=b.x的差异
    oracle查看表,索引,视图,存储过程的定义
    oracle查看监听状态
    由sock引起的感想
    xargs
    oracle知识点小结1
    Oracle系统权限列表
  • 原文地址:https://www.cnblogs.com/lzxzy-blog/p/10319248.html
Copyright © 2020-2023  润新知