C语言两个特别大的整数类型相加超出范围使用两个技巧

技巧1:用long (%ld)或者long long(%lld)类型存取

技巧2:当两个同号的数字相加,放到等号的另一边,变成减号

问题:

给定区间[-2的31次方, 2的31次方]内的3个整数A、B和C,请判断A+B是否大于C

 

我的代码:

 1 #include<stdio.h>
 2 
 3 int main(){
 4     long  array[10][3];
 5     int num,i,j;
 6     scanf("%d",&num);
 7     for(i=0;i<num;i++){
 8         for(j=0;j<3;j++){
 9            scanf("%ld",&array[i][j]);
10         }
11     }
12 
13     for(i=0;i<num;i++){
14         if((array[i][0]>=0&&array[i][1]>=0)||(array[i][0]<0&&array[i][1]<0)){
15             printf("Case #%d: %s\n",i+1,array[i][0]>array[i][2]-array[i][1]?"true":"false");
16         }else{
17             printf("Case #%d: %s\n",i+1,array[i][0]+array[i][1]>array[i][2]?"true":"false");
18         }
19     }
20 
21 }

 

转载于:https://www.cnblogs.com/lyxcode/p/11109008.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目比较细节,需要注意一些特殊情况,以下是一种可能的实现方法: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> // 定义双向循环链表节点 typedef struct Node { int value; struct Node *prev; struct Node *next; } Node; // 创建一个新节点 Node *newNode(int value) { Node *node = (Node *)malloc(sizeof(Node)); node->value = value; node->prev = NULL; node->next = NULL; return node; } // 释放一个节点及其后继节点 void freeNode(Node *node) { while (node != NULL) { Node *next = node->next; free(node); node = next; } } // 将一个整数转换成双向循环链表表示 Node *intToList(int n) { Node *head = newNode(0); // 头节点 Node *tail = head; // 尾节点,头尾相连 if (n == 0) { tail->next = newNode(0); } else { while (n != 0) { int digit = n % 10; tail->next = newNode(digit); tail->next->prev = tail; tail = tail->next; n /= 10; } } return head; } // 将一个双向循环链表表示的整数转换成一个int类型的值 int listToInt(Node *head) { int n = 0; int factor = 1; Node *node = head->next; while (node != NULL) { n += factor * node->value; factor *= 10; node = node->next; } return n; } // 反转一个双向循环链表 void reverseList(Node *head) { Node *node = head->next; while (node != NULL) { Node *temp = node->prev; node->prev = node->next; node->next = temp; node = node->prev; } Node *temp = head->prev; head->prev = head->next; head->next = temp; } // 计算两个双向循环链表表示的整数的和 Node *addList(Node *a, Node *b) { Node *head = newNode(0); // 头节点,结果链表从头开始存储 Node *tail = head; // 尾节点,头尾相连 int carry = 0; // 进位 Node *na = a->prev; // 从低位到高位依次相加 Node *nb = b->prev; while (na != NULL || nb != NULL) { int sum = carry; if (na != NULL) { sum += na->value; na = na->prev; } if (nb != NULL) { sum += nb->value; nb = nb->prev; } carry = sum / 10; sum %= 10; tail->next = newNode(sum); tail->next->prev = tail; tail = tail->next; } if (carry != 0) { tail->next = newNode(carry); tail->next->prev = tail; tail = tail->next; } reverseList(head); // 翻转结果链表,使其符合正常的整数表示形式 return head; } int main() { char s1[10000], s2[10000]; if (scanf("%s%s", s1, s2) != 2) { printf("Error: invalid input.\n"); return 1; } // 验证输入合法性 for (int i = 0; i < strlen(s1); i++) { if (!isdigit(s1[i])) { printf("Error: invalid input.\n"); return 1; } } for (int i = 0; i < strlen(s2); i++) { if (!isdigit(s2[i])) { printf("Error: invalid input.\n"); return 1; } } // 将输入的字符数组转换成双向循环链表 Node *a = intToList(atoi(s1)); Node *b = intToList(atoi(s2)); // 计算两数之和 Node *c = addList(a, b); // 将结果链表转换成整数输出 printf("%d\n", listToInt(c)); // 释放内存 freeNode(a); freeNode(b); freeNode(c); return 0; } ``` 注意:本代码中忽略了输入长度和结果长度超出限制的情况,需要根据具体要求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值