首页 > 其他 > 详细

A + B Problem II HDU - 1002(高精加)(有一个超级重要的小细节※)

时间:2021-02-21 23:58:25      阅读:49      评论:0      收藏:0      [点我收藏+]

题目链接

这题有多组输入。

高精度用列竖式的方法做即可。

可以用2个字符串来得到A,B,再逆序赋值到2个整形数组当中。

最后再用一个整形数组来保存结果(当然也可以保存在之前那2个整形数组中的一个)

我写的时候遇到了一个困难,顺便涨了涨知识(敲黑板)

  • 数组被作为参数传递时会退化为指针,如果用sizeof得到的实际上只是指针占据的空间,无法得到数组的长度。

如图所示,若数组作为形参传递到函数中,sizeof得到的永远都是8(即指针所占据的空间)(不过是字符串类型的还是整形类型的数组都会这样)

技术分享图片

 

原因:

形参是实参的一份拷贝,是局部变量。但是数组的数据太多了,将其一一赋值既麻烦又浪费空间,所以数组作为参数传递给函数的只是数组首元素的地址,

数据还是在内存里的,函数在需要用到后面元素时再按照这个地址和数组下标去内存查找。

解决方案:

加上数组引用,再使用模板让参数变为完整的类型。

int数组的解决方案为

技术分享图片

 

字符串的解决方案为(即把template中的int模板改成char即可……)

技术分享图片

 

接下来就是AC代码(与前面的小细节相比感觉不值一提):

#include<cstdio>
#include<algorithm> 
#include<vector>
#include<cstring>
#define MAXN  6666
using namespace std;
typedef long long ll;
char s1[MAXN],s2[MAXN];
int a[MAXN],b[MAXN],c[MAXN]; 
template<int len>
void dh(char s[],int (&a)[len]){//将字符串数组逆序存储到整形数组当中 
    memset(a, 0, 4*MAXN);
    a[0]=strlen(s);
    for(int i=1;i<=a[0];i++)
        a[i]=s[a[0]-i]-0; 
}
void Add(int a[],int b[],int c[]){//高精加 两个正整数 令a+b=c; 
    int n=max(a[0],b[0]);
    int temp=0;
    for(int i=1;i<=n;i++){
        c[i] = (a[i]+b[i]+temp)%10;
        temp=(a[i]+b[i]+temp)/10;
    }
    if(temp)
        c[n+1]=temp;
    if(temp>0)
        c[0] = n+1;
    else
        c[0] =n;
}
int main(){
    int t,id=0;
    scanf("%d",&t);
    while(t--){
        scanf("%s%s",&s1,&s2);
        dh(s1,a);
        dh(s2,b); 
        Add(a,b,c);
        printf("Case %d:\n",++id);
        printf("%s + %s = ",s1,s2);
        for(int i=c[0];i>=1;i--)
            printf("%d",c[i]);
        printf("\n");
        if(t)
            printf("\n");
    }
}

 

A + B Problem II HDU - 1002(高精加)(有一个超级重要的小细节※)

原文:https://www.cnblogs.com/mikku39/p/14426847.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!