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

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

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

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

zcube的博客   强烈建议去看   http://blog.csdn.net/zcube/article/details/8458888

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

#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,0,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]='\0';
    //计算出结果后顺序存在t数组中
    t_len = 0;
    for(int i = str_len-1; i >= 0; i--)
        t[t_len++]=str[i];
    t[t_len]='\0';
    return Compare(t);
}

int  multi(char *a,int a_len,char *b,int b_len)
{
    int  str[10005];
    memset(str,0,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]='\0';
    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,0,sizeof(q));
        memset(p,0,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 %s\n",p,c,q);
        memset(m,0,sizeof(m));
        memset(n,0,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]='\0';
        for(int i = p_len-1; i >= 0; i--)
            n[n_len++]=p[i];
            n[n_len]='\0';
        if(c=='+')result = Count(m,m_len,n,n_len);
            else result = multi(m,m_len,n,n_len);
        if(ok[0]) printf("first number too big\n");
        if(ok[1]) printf("second number too big\n");
        if(result) printf("result too big\n");
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值