• 465 Overflow


    这题没做,直接在网上看了别人的代码,对数字的一些问题不是很了解

    学习一下istringstream的用法:

    #include <iostream>
    #include <string>
    #include <sstream>//使用istringstream()需要调入的头文件
    
    using namespace std;
    
    string getMaxStr()
    {
        int n=0x7fffffff;
        string s="";
        while(n!=0)
        {
            s=(char)(n%10+'0')+s;
            n=n/10;
        }
        return s;
    }
    
    bool cmp(const string &a,const string &b)
    {
        int alen=a.size();
        int blen=b.size();
        if(alen==blen)
        {
            for(int i=0;i<alen;i++)
                if(a[i]!=b[i])
                    return a[i]>b[i];
        }
        else
        {
            return alen>blen;
        }
        return false;
    }
    
    int main()
    {
        string a,op,b;
        string max_str=getMaxStr();
        while(cin>>a>>op>>b)
        {
            bool over=false;
            cout<<a<<" "<<op<<" "<<b<<endl;
            while(a.size()>1 && a[0]=='0')//###,wa n多次,大整数问题记着清除前置零,判断为‘0’而不是0.
                a.erase(0,1);
            while(b.size()>1 && b[0]=='0')
                b.erase(0,1);
            if(cmp(a,max_str))
            {
                cout<<"first number too big"<<endl;
                over=true;
            }
            if(cmp(b,max_str))
            {
                cout<<"second number too big"<<endl;
                over=true;
            }
            if(over)
            {
                if(op=="+")
                    cout<<"result too big"<<endl;
                else if(op=="*" && a!="0" && b!="0")
                    cout<<"result too big"<<endl;
            }
            else
            {
                long long aa,bb,cc;
                istringstream(a)>>aa;
                istringstream(b)>>bb;
                if(op=="+")
                    cc=aa+bb;
                else if(op=="*")
                    cc=aa*bb;
                if(cc>0x7fffffff)
                    cout<<"result too big"<<endl;
            }
        }
        return 0;
    }
    

    学习一下sscanf的使用:

    #include<stdio.h>
    #include<string.h>
    #define MAXN 20000
    char a[MAXN], b[MAXN],s[MAXN],y[2];
    int A[MAXN], B[MAXN], S[MAXN];
    void decide()
    {
    long long a1, b1, s1;    
    sscanf(a,"%lld",&a1);
    sscanf(b,"%lld",&b1);
    sscanf(s,"%lld",&s1);
    printf("%s %s %s\n",a,y,b);
    if(a1 > 0x7fffffff) printf("first number too big\n");
    if(b1 > 0x7fffffff) printf("second number too big\n");
    if(s1 > 0x7fffffff) printf("result too big\n");
    }
    void a_b_mult()
    {
        memset(A, 0, sizeof(A));
        memset(B, 0, sizeof(B));
        memset(S, 0, sizeof(S));
        int len1 = strlen(a);
        for(int i = 0; i < len1; i ++)
            A[len1-1-i] = a[i] - '0';
        int len2 = strlen(b);
        for(int j = 0; j < len2; j ++)
            B[len2-1-j] = b[j] - '0';
        for(int i = 0; i <= len2; i ++)
        {
            int c = 0;
            for(int j = 0; j <= len1; j ++)
            {
                S[i + j] += B[i] * A[j] +c;
                c = S[i + j] / 10;
                S[i + j] %= 10;
            }
        }    
        int i;
        for(i = MAXN; i > 0; i --)
        if(S[i]) break;
        for(int j = 0; j <= i; j ++)
        s[j] = S[i - j] + '0';
        s[i+1] = '\0';
        decide();
    }
    void a_b_sum()
    {
        memset(A, 0, sizeof(A));
        memset(B, 0, sizeof(B));
        memset(S, 0, sizeof(S));
        int len1 = strlen(a);
        for(int i = 0; i < len1; i ++)
            A[len1-1-i] = a[i] - '0';
        int len2 = strlen(b);
        for(int j = 0; j < len2; j ++)
            B[len2-1-j] = b[j] - '0';
        int t;
        if(len1>len2) t = len1;
        else t = len2;
        int c = 0;
        for(int k = 0; k <= t; k ++)
        {
            S[k] = A[k] + B[k] + c;
            c = S[k] / 10;
            S[k] %= 10; 
        }
        int i;
        for(i = MAXN; i > 0; i --)
            if(S[i]) break;
        for(int j = 0; j <= i; j ++)
        s[j] = S[i - j] + '0';
        s[i+1] = '\0';
        decide();
    }
    void input()
    {
        while(scanf("%s%s%s",a,y,b) == 3)
        {
            if(y[0] == '+') a_b_sum();
            else     a_b_mult();
        }
    }
    int main()
    {
        input();
        return 0;
    }
    

    别人的,代码好短哦!
     

    #include<stdio.h>
     #include<stdlib.h>
     int main()
     {
         char str1[1001],str2[1001],c;
         double a,b;
         while(scanf("%s %c %s",str1,&c,str2)!=EOF)
         {
             a=atof(str1);
             b=atof(str2);
             printf("%s %c %s\n",str1,c,str2);
             if(a>2147483647)
             printf("first number too big\n");
             if(b>2147483647)
             printf("second number too big\n");
             if(c=='+')
             {
                 if(a+b>2147483647)
                 printf("result too big\n");
             }
             if(c=='*')
             {
                 if(a*b>2147483647)
                 printf("result too big\n");
             }
         }
         return 0;
     }
    
  • 相关阅读:
    [读书笔记]黑客与画家[Hackers.and.Painters]
    android电池充电以及电量检测驱动分析
    LV在系统重启后不能自动激活(boot.lvm&after.loca)
    线段树菜鸟一题+归并排序【求逆序数】POJ2299
    【PAT】1035. Password (20)
    Android应用开发学习笔记之ContentProvider
    UVAlive 2322 Wooden Sticks(贪心)
    卸载QTP
    线段树模板
    2013 CSU校队选拔赛(1) 部分题解
  • 原文地址:https://www.cnblogs.com/UnGeek/p/2566495.html
Copyright © 2020-2023  润新知