1. 程式人生 > 實用技巧 >2020.11.04

2020.11.04

修改前

#include<stdio.h>
int main()
{long long a,b;
unsigned long long c;
scanf("%lld%lld",&a,&b);
 c=(unsigned long long)(a+b);
if(a>0&&b>0)
{
    c=(unsigned long long)(a+b);
    if(c>9223372036854775807)
    {printf("PO!");}
    else{printf("%lld",c);}

}
if(a<0&&b<0&&(a!=-9223372036854775808&&b!=-9223372036854775808))
{a=-a;
b=-b;
    c=(unsigned long long)a+(unsigned long long)b;
if(c>9223372036854775808){printf("NO!");}
else{printf("%lld",c);}
}
if((a>0&&b<0)||(a<0&&b>0))
{
    c=a+b;
    printf("%lld",c);
}
if((a==-9223372036854775808||b==-9223372036854775808)&&(a<0&&b<0)&&!(a==-9223372036854775808&&b==-9223372036854775808))
    {a=(unsigned long long)(-a);b=(unsigned long long)(-b);
c=a+b;
     if(c>9223372036854775807)
    {printf("NO!");}
    else{printf("%lld",c);}}
if(a==-9223372036854775808&&b==-9223372036854775808){printf("NO!");}
return 0;
}

  修改後

 1 #include <stdio.h>
 2 #define INF 9223372036854775807ull // long long 的最大值(型別為 unsigned long long)
 3 #define NINF -9223372036854775808  // long long 的最小值
 4 #define ULL unsigned long long     // 合理運用巨集定義可以簡化程式
 5 
 6 int main()
 7 {
 8     long long a, b;
 9     
10     scanf("%lld%lld", &a, &b);
11 12 if (a == NINF && b == NINF) 13 printf("NO!\n"); // 特判一下特殊情況 14 else if (a > 0 && b > 0 && (ULL)a + b > INF) 15 printf("PO!\n"); // 正溢位 16 else if (a < 0 && b < 0 && (ULL)(-a) + (-b) > INF + 1) 17 printf("NO!\n
"); // 負溢位 18 else 19 printf("%lld\n", a + b); 20 21 return 0; 22 }