zoukankan      html  css  js  c++  java
  • 高精度1--加法

    高精度1--加法

    一、心得

    自己写的东西才是自己的,看一百遍都不一定看得会

    //没有考虑到输出的时候a[0]是0的情况
    //边界情况多多考虑

    二、题目及分析

    计算12345678987755+4324324324

    /*
    高精度加法:
    模拟手算
    1、初始化:数组和倒序
    2、加:相加和进位
    3、输出:倒序
    */

    三、代码及结果

    自己的:

     1 /*
     2 高精度加法:
     3 模拟手算 
     4 1、初始化:数组和倒序
     5 2、加:相加和进位
     6 3、输出:倒序 
     7 */ 
     8 #include <iostream>
     9 #include <string>
    10 #define Max 105
    11 using namespace std;
    12 /*
    13 s=12345
    14 length=5
    15 a[5] 0-4
    16 1 s4
    17 2 s3
    18 3 s2
    19 4 s1
    20 5 s0
    21 */
    22 //初始化字符串:变为int数组和倒序 
    23 void init(string &s,int (&a)[Max]){
    24     int length=s.length();
    25     a[0]=length;
    26     for(int i=1;i<=length;i++){
    27         a[i]=s[a[0]-i]-'0';//a[0]这里注意下 
    28     }
    29     
    30     return ;
    31 }
    32 //显示数组 
    33 void printArray(int (&a)[Max]){
    34     //print
    35     for(int i=1;i<=a[0];i++){
    36         //cout<<a[i]<<" ";
    37         printf("%3d  ",a[i]);
    38     } 
    39     cout<<endl;
    40 }
    41 //加操作 
    42 void add(int (&a)[Max],int (&b)[Max]){
    43     if(a[0]<b[0]) a[0]=b[0];
    44     //逐位相加
    45     for(int i=1;i<=a[0];i++){
    46         a[i]+=b[i];
    47     } 
    48     printArray(a);
    49     //处理进位
    50     for(int i=1;i<=a[0];i++){
    51         a[i+1]+=a[i]/10;
    52         a[i]=a[i]%10;
    53     }  
    54     printArray(a);
    55     //看最高位是否进位,看相加之后是否边长 
    56     if(a[a[0]+1]>0) a[0]++; //修正a的位数(a+b最多只能进一位)    
    57 }
    58 //输出结果
    59 void outputAns(int (&a)[Max]){
    60     //没有考虑到输出的时候a[0]是0的情况 
    61     //边界情况多多考虑 
    62     if(a[0]==0){cout<<0<<endl;return;}
    63     for(int i=a[0];i>=1;i--){
    64         cout<<a[i];
    65     }
    66     cout<<endl;
    67 } 
    68 
    69 int main(){
    70     freopen("in.txt","r",stdin);
    71     string s1,s2;
    72     cin>>s1>>s2;
    73     cout<<s1<<"  "<<s2<<endl; 
    74     //初始化数字串s1 
    75     int a[Max]={0};//要初始化为0 
    76     init(s1,a);
    77     printArray(a);
    78     //初始化数字串s2 
    79     int b[Max]={0};//要初始化为0 
    80     init(s2,b);
    81     printArray(b);
    82     //a和b数组相加
    83     add(a,b); 
    84     //输出结果
    85     outputAns(a); 
    86     return 0;
    87 } 

    书上的:

     1 /*
     2 高精度就是在模拟手算
     3 用计算机模拟手算的方法就可以得到各种高精度 
     4 */
     5 #include <iostream>
     6 using namespace std;
     7 //初始化字符数组,
     8 //将数串s转换为数组a,并倒序存储. 
     9 void init(int a[]){
    10     string s;
    11     cin>>s;//读入字符串
    12     a[0]=s.length();  //用a[0]计算字符串s的位数    
    13     for(int i=1;i<=a[0];i++){
    14         a[i]=s[a[0]-i]-'0';//将数串s转换为数组a,并倒序存储.
    15     }
    16 } 
    17 //高精度加法
    18 void jia(){
    19     int i,k;
    20     if(a[0]<b[0]) a[0]=b[0];//确定加法最大位数 
    21     for(i=1;i<=a[0];i++)a[i]+=b[i]; //逐位相加
    22     for(i=1;i<=a[0];i++)
    23     {   
    24         a[i+1]+=a[i]/10;
    25         a[i]%=10;
    26     } //处理进位
    27     if(a[a[0]+1]>0)a[0]++;//修正a的位数(a+b最多只能进一位)    
    28 } 
    29 //输出
    30 void print(int a[])  //打印输出
    31 {    
    32     int i;
    33     if(a[0]==0){cout<<0<<endl;return;}
    34     for(i=a[0];i>=1;i--)cout<<a[i];
    35     cout<<endl;
    36 } 
    37  
    38 int main(){
    39     return 0;
    40 } 
  • 相关阅读:
    STM32时钟配置方法详解
    STM32 入门之 GPIO
    arm可以干什么
    四两拨千斤,ARM是如何运作、靠什么赚钱的
    ARM内核全解析,从ARM7,ARM9到Cortex-A7,A8,A9,A12,A15到Cortex-A53,A57
    ARM与单片机到底有啥区别
    实得打印机色带芯更换
    IE浏览器不能上传图片
    IE FANS
    win8,win10里面内置的IE浏览器网银无法输入密码
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/6992451.html
Copyright © 2011-2022 走看看