大数相加方法------2

大数相加的另外一种思路
1;这个思路是我一学长告诉我的,然而我因为有个语法知识没用好导致初始化0(数字零)没成功,后来还是学长帮我敲完的,原来那个归零要转化为int类型的数组来完成的,这项工作。看来我需要去问问度娘
memset函数的使用了。

memset函数的使用,原型为void *memset(void *buffer, int c, int count)
buffer:为指针或是数组,
c:是赋给buffer的值,
count:是buffer的长度.
对字符串使用,使用该函数来初始化,此时的0是空零’\0’
对int数组使用,则这里的0就是数字0了;

不说闲话了,先介绍一下这个思路。

2;我之前的博客就说过以字符串输入,那么高位就是数组前面的数,因此我们的运算都是从后面开始往前面进行运算的,然而这种方法就是从前面开始运算的,当然那必须还要一项工作就是反向也就将字符串掉
头,这里可以用一个strrev就轻松完成了,

strrev的使用情况,
头文件是#include<string.h>
功能:把字符串s的所有字符的顺序颠倒过来(不包括空字符NULL);
说明:返回指向颠倒顺序后的字符串指针。

我当时就出错,我一直以为要用一个指针去接收这个掉头了的地址,后面就要用到指针所以始终报错,然而是我没记清,其实这个函数没有必要去用新的去接收它,它其实就是原字符串的地址,也就说strrev(a);之后我们再继续使用a,这个a字符串就是已经颠倒了的;

返回指向颠倒顺序后的字符串指针。这个指针表示的也就是原来的地址;

#include<stdio.h>
#include<string.h>
int main()
{
    char a[10] = {'a','x','s'}, *aa;
    printf("%p\n",a);
    printf("%s\n",a);
    aa = strrev(a);
    printf("%p\n",aa);
    printf("%s\n",a);

    return 0;
}

输出的两个地址值是相同的。很好的解释了上面。
这些问题都解决了,再对这种方法就好敲多了。感觉都可以直接摆代码了,在代码里面去理解了。
先看一下我那个出来bug的代码吧,随后就摆出我学长打的代码;

//输入两个正的大数,输出前一个加后一个的结果;  
这个是出了问题的代码;
#include<stdio.h>
#include<string.h>
int main()
{

    int lena, lenb, max, mwh, i, n, jws, bj[1004]={0};
    char a[1004]={0},b[1004]={0};
    scanf("%d",&n);
    while(n--){
        memset(a, 0, sizeof(a));//不能按我那样初始化为0.这里的初始化为0是空字符'\0' 
        memset(b, 0, sizeof(b));
        scanf("%s",a);
        scanf("%s",b);
        strrev(a); 
        strrev(b);
    //  printf("%s\n",a);
    //  printf("%s\n",b);
        lena = strlen(a);
        lenb = strlen(b);
        max = lena;
        if(lenb > max){
            max = lenb;
        }
        jws = 0;
        for(i = 0; i < max; i++){
            printf("%c\n",b[i]);//这里输出不对,表示上方初始化0没有成功 
            mwh = (a[i]-'0')+(b[i]-'0')+jws;
            if(mwh > 9){
                mwh = mwh%10;
                jws = 1;
            }
            else jws = 0;
            bj[i] = mwh;
        //  printf("%d\n",bj[i]);
        }
        if(jws == 1){
            bj[i] = 1;
            i++;
        } 
        for(i--; i != -1; i--){
        //  printf("%d",bj[i]);
        }
        printf("\n");

    }

    return 0 ;
}

接下来的才是我学长打的代码;他用的是c++;并且我也写了一点注释;

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int n;
int maxi(int aaa,int bbb)
{
    return aaa>bbb?aaa:bbb;
 } 

int main()
{
    char a[1004],b[1004];
    int aa[1004],bb[1004],cc[1005];
    scanf("%d",&n);
    while(n--)
    {
        memset(aa, 0, sizeof(a));//这里就可以初始化为0;
    //  printf("%s\n",aa); 
        memset(bb, 0, sizeof(b));
        memset(cc,0,sizeof(cc));

        scanf("%s",a);

        scanf("%s",b);
        int rel=0,re=0;

        for(int i=strlen(a)-1;i>=0;i--)//将字符串变成整形 
        {
             aa[rel++]+=a[i]-'0';
        }

        for(int i=strlen(b)-1;i>=0;i--)
        {
              bb[re++]+=b[i]-'0';
        } 

        int maxn=maxi(re,rel);


        for(int i=0;i<maxn;i++)//相加,后面单独来同一进位; 
        {
            //printf("%d\n",aa[i]);//如果第一个数长度要小,那么计算不是公共部分时这里会是0.
                                    //我之前的那个代码也就是这里没成功; 
            cc[i]=aa[i]+bb[i];//因为已经初始化为0了,所以可以这样一直加下去。 
        }

        for(int i=0;i<maxn-1;i++)//统一来进位 ; 
        {
            if(cc[i]>9)
            {
                cc[i+1]+=cc[i]/10;
                cc[i]%=10;
            }
        }
        printf("%d",cc[maxn-1]);
        for(int i=maxn-2;i>=0;i--)
        {
           cout<<cc[i]; 
        }
    }
    return 0 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值