UVA713 高精度(1)+相加+去前导0/后缀0

来源:互联网 发布:多头螺纹怎样用g92编程 编辑:程序博客网 时间:2024/06/11 00:19

1题意

假设没有前导0和后缀0,简单相加,再去除前面的和后面的0,输出。

2分析

本题好像对0要求不严格,学习一下代码一中的去前导0和后缀0,以及合理用二维数组的方式。

3

代码一

#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int maxn=1010;int num[4][maxn];   //num[0][maxn]:temp;    num[1][maxn]:num1;  num[2][maxn]:num2;  num[3][maxn]:sum;char str[maxn];void Read(int cur){    cin>>str;    int len=strlen(str);    //去前导0,char []导入int数组:    int bj=0;    num[0][0]=0;    for(int i=0;i<len;i++){        if(str[i]!='0') bj=1;        if(bj)  num[0][++num[0][0]]=str[i]-'0';    }    bj=0;    //去后面的0,同时正常的反向(用于低位相加向右进位):    for(int i=num[0][0];i>=1;i--){        if(num[0][i]!=0)   bj=1;        if(bj)  num[cur][++num[cur][0]]=num[0][i];    }    //对于本题:反向转换    for(int j=num[cur][0],i=1;i<j;i++,j--){        bj=num[cur][j];        num[cur][j]=num[cur][i];        num[cur][i]=bj;    }    //for(int i=num[cur][0];i>=1;i--) cout<<num[cur][i];}void Add(){    num[3][0]=max(num[1][0],num[2][0]);    for(int i=1;i<=num[3][0];i++){        num[3][i]+=(num[1][i]+num[2][i]);        if(num[3][i]>9){            num[3][i]%=10;            num[3][i+1]++;        }    }    if(num[3][num[3][0]+1]!=0)  num[3][0]++;//因为a+b,下限是t=max(a的位数,b的位数),上限是t+1;}void Print(){    //去掉因为相加而产生的新的前导0:    int bj=0;    for(int i=1;i<=num[3][0];i++){        if(num[3][i]!=0)    bj=1;        if(bj)  cout<<num[3][i];    }    cout<<endl;}int main(){    int kk;    scanf("%d",&kk);    while(kk--){        memset(num,0,sizeof(num));        Read(1);        Read(2);        Add();        Print();    }}

代码二

#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int   maxn=1010;char str1[maxn];char str2[maxn];int num1[maxn];int num2[maxn];int sum[maxn];int len1,len2,len3;void Add(){    int i;    for(i=0;i<(len1<len2?len2:len1);i++){        sum[i]+=(num1[i]+num2[i]);        if(sum[i]>9){            sum[i]=sum[i]-10;            sum[i+1]++;        }    }    if(sum[i]!=0)   len3=i+1;    else    len3=i;}int main(){    int kk;    scanf("%d",&kk);    while(kk--){        cin>>str1>>str2;        len1=strlen(str1);        len2=strlen(str2);        memset(num1,0,sizeof(num1));        memset(num2,0,sizeof(num2));        memset(sum,0,sizeof(sum));        for(int i=0;i<len1;i++) num1[i]=str1[i]-'0';        for(int i=0;i<len2;i++) num2[i]=str2[i]-'0';        Add();        int bj=0;        int endd=len3;        for(int j=len3-1;j>=0;j--){            if(sum[j]!=0)   bj=1;            if(bj){                endd=j+1;                break;            }        }        bj=0;        for(int i=0;i<endd;i++){            if(sum[i]!=0)   bj=1;            if(bj)  cout<<sum[i];        }        cout<<endl;    }    return 0;}


0 0
原创粉丝点击