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

uva 465 - Overflow 大数加法 大数乘法

发布时间:2020-12-14 04:03:18 所属栏目:大数据 来源:网络整理
导读:需要的知识就是大数加法和乘法 ? ? ? 做了后才知道模版的正确性很重要啊 ? ?适用性也很重要 ? 所以自己也下定决心写一写大数的四则运算的模版 ? 还有一点也很重要 ? 就是最大的数是多少 ? ?刚开始把以为是无符号的最大数 ? 弄了一会才发现是整形的最大值 ? ?

需要的知识就是大数加法和乘法 ? ? ? 做了后才知道模版的正确性很重要啊 ? ?适用性也很重要 ? 所以自己也下定决心写一写大数的四则运算的模版 ?

还有一点也很重要 ? 就是最大的数是多少 ? ?刚开始把以为是无符号的最大数 ? 弄了一会才发现是整形的最大值 ? ?在这Wrong 了一次 ? 再次提醒注意审题

看了别人的代码和解题思想 ?才知道自己还是太嫩了 ? ?努力学吧 ?

zcube的博客 ? 强烈建议去看 ??http://www.voidcn.com/article/p-szdwpuqh-vp.html

下面看我的代码 ? ?写得非常的搓

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

char  t[10005];
char s[11]="2147483647";//无符号整形的最大数
int t_len,s_len = 10;

int  zero(char *l)//去掉前导零
{
    int i;
    for(i = 0; l[i]=='0' ;i++);
    return i;
}

/*返回1这个数比无符号整形大 返回0这个数比无符号整形小*/
int Compare(char *q)
{
    int zero_len = zero(q);
    int q_len = strlen(q);
    if(q_len-zero_len > s_len)return 1;
    if(s_len > q_len-zero_len)return 0;
    //长度相等比较每位数
    for(int i = zero_len; i < q_len; i++)
        if(s[i]<q[i])return 1;
        else if(s[i]>q[i])return 0;
    return 0;
}

int Count(char *a,int a_len,char *b,int b_len )
{
    char str[10005];
    memset(str,sizeof(str));
    int str_len = 0;
    int sum = 0,i;
    if(a_len == b_len)
    {
        for(i = 0; i < a_len; i++ )
        {
        sum += (a[i]-'0')+b[i]-'0';
        str[str_len++] = sum%10+'0';
        sum /= 10;
        }
    }
    else if(a_len > b_len)
    {
        for(i = 0; i < b_len; i++ )
        {
        sum += (a[i]-'0')+b[i]-'0';
        str[str_len++] = sum%10+'0';
        sum /= 10;
        }
        for(;i < a_len; i++)
        {
            sum += (a[i]-'0');
            str[str_len++] = sum%10+'0';
            sum /= 10;
        }
    }
    else
    {
        for(i = 0; i < a_len; i++ )
        {
        sum += (a[i]-'0')+b[i]-'0';
        str[str_len++] = sum%10+'0';
        sum =sum / 10;
        }
        for(;i < b_len; i++)
        {
            sum += b[i]-'0';
            str[str_len++] = sum%10+'0';
            sum /= 10;
        }
    }
    if(sum)
        str[str_len++] = sum+'0';
    str[str_len]='';
    //计算出结果后顺序存在t数组中
    t_len = 0;
    for(int i = str_len-1; i >= 0; i--)
        t[t_len++]=str[i];
    t[t_len]='';
    return Compare(t);
}

int  multi(char *a,int b_len)
{
    int  str[10005];
    memset(str,sizeof(str));
    int str_len = 0,i,j;
    for(i = 0; i < a_len; i++)
        for(j = 0; j < b_len; j++)
            str[i+j] += (a[i]-'0')*(b[j]-'0');
    int sum = 0;
    for(i = 0; i < a_len+b_len; i++)
    {
        sum += str[i];
        str[i] = sum%10;
        sum /= 10;
    }
    for(i = a_len+b_len; i >=0&&str[i]==0;i--);
    str_len = i+1;
    //计算出结果后顺序存在t数组中
    t_len = 0;
    for(int i = str_len-1; i >= 0; i--)
        t[t_len++]=str[i]+'0';
    if(i == -1)t[t_len++] = '0';
    t[t_len]='';
    return Compare(t);
}

int main()
{
    #ifdef LOCAL
    freopen("in.txt","r",stdin);
    #endif // LOCAL
    char p[10005],q[10005],m[10005],n[10005],c;
    int ok[2],result =0,y = 1;
    while(y)
    {
        memset(q,sizeof(q));
        memset(p,sizeof(p));
        if(scanf("%s %c %s",p,&c,q)==EOF)break;
        getchar();
        result = 0;
        ok[0] = Compare(p);
        ok[1] = Compare(q);
        printf("%s %c %sn",c,q);
        memset(m,sizeof(m));
        memset(n,sizeof(n));
        int q_len = strlen(q),p_len = strlen(p);
        int m_len = 0,n_len = 0;
        for(int i = q_len-1; i >= 0; i--)
            m[m_len++]=q[i];
            m[m_len]='';
        for(int i = p_len-1; i >= 0; i--)
            n[n_len++]=p[i];
            n[n_len]='';
        if(c=='+')result = Count(m,m_len,n,n_len);
            else result = multi(m,n_len);
        if(ok[0]) printf("first number too bign");
        if(ok[1]) printf("second number too bign");
        if(result) printf("result too bign");
    }
}

(编辑:李大同)

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

    推荐文章
      热点阅读