加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

【模版】大数乘法、加法模版

发布时间:2020-12-14 03:52:58 所属栏目:大数据 来源:网络整理
导读:啦啦啦,模版终于写出来了,以后大数的乘加法再也不担心了。 介于只对自己的个别数据进行了测试,所以还是把模版晒出来吧,大家一起试试,有问题一定要第一时间反馈啊!! 还有,那些逃避指针的小伙伴们,咳咳,我就不说什么了,反正打死你们也不相信我没用

啦啦啦,模版终于写出来了,以后大数的乘加法再也不担心了。

介于只对自己的个别数据进行了测试,所以还是把模版晒出来吧,大家一起试试,有问题一定要第一时间反馈啊!!

还有,那些逃避指针的小伙伴们,咳咳,我就不说什么了,反正打死你们也不相信我没用指针。

?

//大数问题之大数(250位)乘法、加法模版
#include<stdio.h>
#include<string.h>

void hs(char *s,long long *n); //由字符串变为整形数组
void pr(long long *n,int num); //打印整形数组(大数)

char sn1[260];     //输入第一个大数
char sn2[260];     //输入第二个大数
long long n1[70];  //保存第一个大数
long long n2[70];  //保存第二个大数
long long en[150]; //保存最后结果

int main()
{
    int i,k;

    while (~scanf ("%s%s",sn1,sn2))
    {
        //乘法特殊情况
        if (sn1[0] == '0' || sn2[0] == '0')
        {
            printf ("0n");
            continue;
        }

        //初始化
        memset (n1,sizeof n1);
        memset (n2,sizeof n2);
        memset (en,sizeof en);
        //把字符串转化为整形数组
        hs (sn1,n1);
        hs (sn2,n2);

        //计算
        //乘法
        for (i = 69;i >= 0;i--)
            for (k = 69;k  >= 0;k--)
            {
                en[i + k + 1] += n1[i] * n2[k];
            }

        //加法
        for(i = 69;i >= 0;i--)
            en[i + 70] = n1[i] + n2[i];


        //把结果标准化
        //乘法&加法
        for (i = 139;i >= 0;i--)
        {
            if (en[i] >= 10000)
            {
                en[i - 1] += (long long)(en[i] / 10000);
                en[i] = en[i] % 10000;
            }
        }

        //打印结果
        pr(en,140);
    }

    return 0;
}

void hs(char *s,long long *n)
{
    char *ps = s + strlen(s) - 1;
    char *tmp = NULL;
    long long *pn = &n[69];
    long long tim = 3;

    while (ps >= s)
    {
        if ((ps - 3) >= s)
        {
            while(tim >= 0)
            {
                *pn = (*pn) * 10 + (*(ps - tim) - '0');
                tim--;
            }
            pn--;
            tim = 3;
        }else
        {
            tmp = s;
            while (tmp <= ps)
            {
                *pn = *pn * 10 + (*tmp - '0');
                tmp++;
            }
        }

        ps -= 4;
    }
}

void pr(long long *n,int num)
{
    long long *p = n;

    while (*p == 0)
        p++;
    //第一个数一定要特殊处理
    if (p > &n[num - 1])
    {
        printf ("0n");
    }
    else
    {
        printf ("%lld",*p);
        p++;
        while (p <= &n[num - 1])
        {
            printf ("%04lld",*p);
            p++;
        }
        printf ("n");
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读