https://pintia.cn/problem-sets/994805342720868352/problems/994805406352654336
Given three integers A, B and C in [−2^63,2^63], you are supposed to tell whether A+B>C我的测试数据如下: 8 -9223372036854775807 -9223372036854775808 3 9223372036854775807 9223372036854775808 -100000000000000 -9223372036854775807 -9223372036854775808 -3 9223372036854775807 9223372036854775808 3 -9223372036854775807 9223372036854775808 -3 -9223372036854775807 9223372036854775808 3 9223372036854775807 -9223372036854775808 -3 9223372036854775807 -9223372036854775808 3
#include<stdio.h> #include<string.h> //1065 A+B and C (64bit) int real_result(char str1[],char str2[],char str3[]){ // str表示a+b 的结果 int i = 0,j = 0; char str[30]; int carry_flags = 0; for( j = 0; str1[j] != '\0' && str2[j] != '\0';j++){ int tmpSum = (str1[j] - '0') + (str2[j] - '0'); if(carry_flags) tmpSum++; if(tmpSum > 9) carry_flags = 1; else carry_flags = 0; if(carry_flags){ str[j] = tmpSum % 10 + '0'; }else{ str[j] = tmpSum + '0'; } } str[j] = '\0'; // for(; str1[j] != '\0'; j++){ int tmpSum = str1[j] - '0'; if(carry_flags) tmpSum++; if(tmpSum > 9) carry_flags = 1; else carry_flags = 0; if(carry_flags) str[j] = (tmpSum % 10) + '0'; else str[j] = tmpSum + '0'; } for(; str2[j] != '\0'; j++){ int tmpSum = str2[j] - '0'; if(carry_flags) tmpSum++; if(tmpSum > 9) carry_flags = 1; else carry_flags = 0; if(carry_flags) (tmpSum % 10) + '0'; else str[j] = tmpSum + '0'; } if(carry_flags){ str[j] = '1'; str[++j] = '\0'; }else{ str[j] = '\0'; } //compare two strings int len_sum = strlen(str),len_c = strlen(str3); if(len_sum > len_c) return 1; else if(len_sum < len_c) return 0; else{ // = for(i = len_sum - 1; i >= 0;i--){ if(str[i] > str3[i]) return 1; else if(str[i] == str3[i]) continue; else return 0; } return 2; } } int two_result(char str_a[],char str_b[],char str_c[]){ int flag1 = (str_a[0] == '-')? 1 : 0; int flag2 = (str_b[0] == '-')? 1 : 0; int flag3 = (str_c[0] == '-')? 1 : 0; // 反转为数字字符数组,不包括符号'-' char new_a[30],new_b[30],new_c[30]; int i = 0,j = 0; for(i = strlen(str_a) -1; i > 0;i--){ new_a[j++] = str_a[i]; } if(flag1) // a是负数 new_a[j] = '\0'; else{ new_a[j] = str_a[0]; new_a[++j] = '\0'; } j = 0; for(i = strlen(str_b) -1; i > 0;i--){ new_b[j++] = str_b[i]; } if(flag2) // b is negative new_b[j] = '\0'; else{ new_b[j] = str_b[0]; new_b[++j] = '\0'; } j = 0; for(i = strlen(str_c) - 1; i > 0;i--){ new_c[j++] = str_c[i]; } if(flag3) // b is negative new_c[j] = '\0'; else{ new_c[j] = str_c[0]; new_c[++j] = '\0'; } if(flag1 == 1 && flag2 == 1 && flag3 == 0){ // - - + return 0; } else if(flag1 ==0 && flag2 == 0 && flag3 ==1 ){ // + + - return 1; } else if(flag1 == 1 && flag2 ==1 && flag3 ==1 ){ // - - - int tmpResult = real_result(new_a,new_b,new_c); if(tmpResult == 2 || tmpResult == 1) return 0; else return 1; } else if(flag1 == 0 && flag2 ==0 && flag3 == 0 ){ // + + + int tmpResult = real_result(new_a,new_b,new_c); if(tmpResult == 2 || tmpResult == 0) return 0; else return 1; } else if(flag1 == 1 && flag2 ==0){ if(flag3 == 1){ int tmpResult = real_result(new_b,new_c,new_a); if(tmpResult == 2 || tmpResult == 0) return 0; else return 1; }else{ int tmpResult = real_result(new_c,new_a,new_b); if(tmpResult == 2 || tmpResult == 1) return 0; else return 1; } }else if(flag1 == 0 && flag2 == 1){ if(flag3 == 1){ int tmpResult = real_result(new_a,new_c,new_b); if(tmpResult == 2 || tmpResult == 0) return 0; else return 1; }else{ int tmpResult = real_result(new_c,new_b,new_a); if(tmpResult == 2 || tmpResult == 1) return 0; else return 1; } } return 0; } int main(){ char str1[30],str2[30],str3[30]; int n; scanf("%d",&n); for(int i =1; i <= n; i++){ scanf("%s%s%s",str1,str2,str3); int result = two_result(str1,str2,str3); if(result == 1) printf("Case #%d: true\n",i); else printf("Case #%d: false\n",i); } return 0; }
重点是:
1、将不等式恒等变形,不拘泥与a+b>c这个表达式。当b为负数是可以是a>c+(-b),等等。
2、情况要考虑完整,数的符号要识别正确,负数,和非负数;
3、real_result(char str1[],char str2[],char str3[]) 来比较结果大小。考虑进位;
我的测试数据如下:
8 -9223372036854775807 -9223372036854775808 3 Case #1: false 9223372036854775807 9223372036854775808 -100000000000000 Case #2: true -9223372036854775807 -9223372036854775808 -3 Case #3: false 9223372036854775807 9223372036854775808 3 Case #4: true -9223372036854775807 9223372036854775808 -3 Case #5: true -9223372036854775807 9223372036854775808 3 Case #6: false 9223372036854775807 -9223372036854775808 -3 Case #7: true 9223372036854775807 -9223372036854775808 3 Case #8: false
来源:https://www.cnblogs.com/hiwjw/p/12654389.html