PAT 1065. A+B and C (64bit) (20) 大整数,有正负,加减。疑问已解决

1065. A+B and C (64bit) (20)

时间限制
100 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
HOU, Qiming

Given three integers A, B and C in [-263, 263], you are supposed to tell whether A+B > C.

Input Specification:

The first line of the input gives the positive number of test cases, T (<=10). Then T test cases follow, each consists of a single line containing three integers A, B and C, separated by single spaces.

Output Specification:

For each test case, output in one line "Case #X: true" if A+B>C, or "Case #X: false" otherwise, where X is the case number (starting from 1).

Sample Input:
3
1 2 3
2 3 4
9223372036854775807 -9223372036854775808 0
Sample Output:
Case #1: false
Case #2: true
Case #3: false
 
 
经验教训就是不要妄图用加法搞定一切,写的各种麻烦。不如直接再写出个减法,轻松愉快。
#include<string>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
#include<algorithm>
#include<map>
#include<set>
#include<math.h>
#include<stack>
#include<vector>
using namespace std;

struct ZZ{

  int num[1000];
  int p=0;
  int mark;       // 标记正负。1为正,-1为负

  void getnum(char x[])
   {
       p=0;
       for(int i=0;i<1000;i++)
        num[i]=0;
       int l=strlen(x)-1;
       int k=1;
       int sum=0;
       mark=1;
       if(x[0]!='-')
    {
       for(int i=l;i>=0;i--)
         {
            sum+=(x[i]-'0')*k;
            k*=10;
             if(k==10000||i==0)
             {
                 k=1;
                 num[p++]=sum;
                 sum=0;
             }
         }
    }
          else
         {
            mark=-1;
            if(strlen(x)==2&&x[1]=='0') mark=1;
           for(int i=l;i>=1;i--)
           {
             sum+=(x[i]-'0')*k;
             k*=10;
             if(k==10000||i==1)
               {
                 k=1;
                 num[p++]=sum;
                 sum=0;
               }
            }
          }
   }

    ZZ operator + (const ZZ &A) const
    {
       ZZ tmp;
       tmp.getnum("0");
         int pp=0;
         int d=0;
         while(pp<p||pp<A.p)
         {
            int sum=num[pp]+A.num[pp]+d;
              tmp.num[pp++]=sum%10000;
             d=sum/10000;
         }
           if(d!=0) tmp.num[pp++]=d;
            tmp.mark=mark;
            tmp.p=pp;
                   return tmp;
    }

      ZZ operator - (const ZZ &A) const
       {
           ZZ tmp;
          tmp.getnum("0");
          int pp=0;
          int d=0;
       while(pp<p)
       {
           int sum=num[pp]-A.num[pp]-d;
           d=0;
           if(sum<0) {
                         sum+=10000;
                          d=1;
                     }
           tmp.num[pp++]=sum;
       }
         for(int i=100;i>=0;i--)
         if(tmp.num[i]!=0) {pp=i+1;break; }
         tmp.p=pp;
         tmp.mark=mark;
         return tmp;
       }

     bool postive()    //判断是否为正数
      {
         int fla=0;
         for(int i=0;i<p;i++)
           if(num[i]!=0)
           {
              fla=1;
              break;
           }
          if(fla==1&&mark==1) return true;
          return false;
      }

    bool operator > (const ZZ &A) const   //比较绝对值大小
    {
        if(p!=A.p) return p>A.p;
        for(int i=p-1;i>=0;i--)
          if(num[i]!=A.num[i]) return num[i]>A.num[i];
           return false;
    }
};




int main()
{
     char a[70],b[70],c[70];
     int n;
     cin>>n;
     for(int i=1;i<=n;i++)
     {
       cin>>a>>b>>c;

         ZZ t1,t2,t3,t4;
         t1.getnum(a);
         t2.getnum(b);
         t3.getnum(c);
         if(t1.mark==t2.mark)
         t4=t1+t2;
         else
         {
            if(t1>t2) t4=t1-t2;
            else t4=t2-t1;
         }

         //cout<<t4.mark<<' '<<t4.num[1]<<' '<<t4.num[0]<<' '<<t4.p<<endl;
         if(t4.mark!=t3.mark)
         t4=t4+t3;
         else{
               if(t4>t3) t4=t4-t3;
                else  {t4=t3-t4;t4.mark=-t3.mark;}
             }

          //cout<<t4.mark<<' '<<t4.num[1]<<' '<<t4.num[0]<<' '<<t4.p<<endl;
         cout<<"Case #"<<i<<": ";
         if(t4.postive())
            cout<<"true";
         else cout<<"false";
         cout<<endl;

     }

     return 0;
}

看了人家的方法,羞愧
 
 
下面俩仅仅是sum的差别。居然第三个过不了,神奇

评测结果

时间结果得分题目语言用时(ms)内存(kB)用户
8月13日 11:26答案正确201065C++ (g++ 4.7.2)1384datrilla

测试点

测试点结果用时(ms)内存(kB)得分/满分
0答案正确130812/12
1答案正确13844/4
2答案正确13084/4
#include <iostream>  
using namespace std; 
int main()
{ 
  int T, index;
  long long a, b, c,sum;
  bool flag;
  cin >> T;
  for (index = 0; index < T;)
  {
    index++;
    cin >> a >> b >> c; 
    sum = a + b;
    if (a>0 && b > 0 && sum <= 0)flag = true;
    else if(a < 0 && b < 0 && sum>= 0)flag = false;
    else if (sum> c)flag = true;
    else flag = false;
    cout << "Case #" << index << ": " << (flag ? "true" : "false" )<< endl;
  }
  system("pause");
  return 0;
}

评测结果

时间结果得分题目语言用时(ms)内存(kB)用户
8月13日 11:23部分正确121065C++ (g++ 4.7.2)1436datrilla

测试点

测试点结果用时(ms)内存(kB)得分/满分
0答案正确143612/12
1答案错误13080/4
2答案错误14360/4
#include <iostream>  
using namespace std; 
int main()
{ 
  int T, index;
  long long a, b, c;
  bool flag;
  cin >> T;
  for (index = 0; index < T;)
  {
    index++;
    cin >> a >> b >> c; 
    if (a>0 && b > 0 && (a + b) <= 0)flag = true;
    else if(a < 0 && b < 0 && (a + b )>= 0)flag = false;
    else if ((a + b )> c)flag = true;
    else flag = false;
    cout << "Case #" << index << ": " << (flag ? "true" : "false" )<< endl;
  }
  system("pause");
  return 0;
}


sum过了而a+b没过是因为,当数据比较大时(即a+b > 2^63-1)
此时sum因为规定为long long了,所以会被当成负数。
而a+b在2^64和2^63-1 之间会被当做无符号长整型处理。ISO C99里这么规定的
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值