当前位置: 首页 > news >正文

【PTA数据结构 | C语言版】大整数相乘运算

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

    • 题目
    • 代码

题目

请编写程序,求两个不超过 1000 位的大整数的乘积。

输入格式:
输入在两行中分别给出两个整数,保证不超过 1000 位。

输出格式:
在一行中输出两个整数的乘积。但如果乘积超过了 1000 位,则仅输出 错误:位数超限。。

输入样例 1:
123456789012345
987654321098765

输出样例 1:
121932631137021071359549253925

输入样例 2:
-1122375689
4998765432012345

输出样例 2:
-5610492795904238375880705

代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>#define MAX_DIGITS 1000
#define MAX_RESULT (2 * MAX_DIGITS)// 反转字符串
void reverse(char *str, int len) {for (int i = 0; i < len / 2; i++) {char temp = str[i];str[i] = str[len - i - 1];str[len - i - 1] = temp;}
}// 大整数乘法
void multiply(char *num1, char *num2, char *result) {int len1 = strlen(num1);int len2 = strlen(num2);int *res = (int *)calloc(len1 + len2, sizeof(int));// 处理符号int sign = 1;if (num1[0] == '-') {sign *= -1;num1++;len1--;}if (num2[0] == '-') {sign *= -1;num2++;len2--;}// 反转字符串以便从低位开始处理reverse(num1, len1);reverse(num2, len2);// 乘法运算for (int i = 0; i < len1; i++) {for (int j = 0; j < len2; j++) {res[i + j] += (num1[i] - '0') * (num2[j] - '0');res[i + j + 1] += res[i + j] / 10;res[i + j] %= 10;}}// 找到结果的最高位int i = len1 + len2 - 1;while (i > 0 && res[i] == 0) i--;// 转换为字符串int idx = 0;if (sign == -1 && !(i == 0 && res[0] == 0)) {result[idx++] = '-';}for (; i >= 0; i--) {result[idx++] = res[i] + '0';}result[idx] = '\0';free(res);
}int main() {char num1[MAX_DIGITS + 2];  // 包含符号和空字符char num2[MAX_DIGITS + 2];char result[MAX_RESULT + 2];  // 包含符号和空字符// 读取输入(不进行校验)fgets(num1, sizeof(num1), stdin);fgets(num2, sizeof(num2), stdin);// 去除换行符num1[strcspn(num1, "\n")] = 0;num2[strcspn(num2, "\n")] = 0;// 计算乘积multiply(num1, num2, result);// 检查结果位数int len = strlen(result);int start = (result[0] == '-') ? 1 : 0;if (len - start > 1000) {printf("错误:位数超限。\n");} else {printf("%s\n", result);}return 0;
}    
http://www.dtcms.com/a/271384.html

相关文章:

  • MySQL--DQLDCL
  • uniapp如何创建并使用组件?组件通过Props如何进行数据传递?
  • 七牛云C++开发面试题及参考答案
  • Synology Cloud Sync构建的企业级跨域数据中台
  • OpenGL 生成深度图与点云
  • Spring Boot多数据源配置详解
  • 【AI】环境——深度学习cuda+pytorch配置
  • aichat-core简化 LLM 与 MCP 集成的前端核心库(TypeScript)
  • 前端开发流程设计详解
  • 【leetcode】2235. 两整数相加
  • 【LeetCode 热题 100】21. 合并两个有序链表——(解法二)递归法
  • 仓颉语言 1.0.0 升级指南:工具链适配、collection 操作重构与 Map 遍历删除避坑
  • 深度学习12(卷积神经网络)
  • java idea 本地debug linux服务
  • Vue响应式原理四:响应式-监听属性变化
  • 国密算法(SM2/SM3/SM4)
  • 【MySQL】一些操作:修改MySQL root密码等等
  • Java 多线程编程:原理与实践
  • UI前端与数字孪生结合实践探索:智慧物流的仓储优化与管理系统
  • 供应链管理:定量分析中的无量纲化处理
  • Java 各集合接口常用方法对照表
  • 虚拟化技术,容器技术和Docker
  • Android View 绘制流程 简述 (无限递归+BitMap问题)
  • android activity生命周期温习
  • Java HashMap 的 get 和 put 方法的实现流程
  • android——热修复(补丁)
  • 微软官方C++构建工具:历史演变、核心组件与现代实践指南
  • SQL注入:现象、本质与防御详解
  • 文本标签提取与大模型理解:方法论深度指南
  • Kubernetes 集群部署、配置和验证-使用kubeadm快速部署一个K8s集群_笔记