问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

超级大的整数加减法,输入时要有正负号。希望能写一下代码。c语言

发布网友 发布时间:2022-05-30 19:00

我来回答

1个回答

热心网友 时间:2023-11-01 10:40

#include <stdio.h>
#include <string.h>
#include <malloc.h>

const int MAXSIZE = 122;

// 完成以字符串形式的两个大数相加。返回字符串形式的和。
// tatol ← addnum1 + addnum2
char *LargeNumberAdd(char const *addnum1,char const *addnum2, char *total) {
int i,j,k = 0,len,result,carry = 0;
int len1 = strlen(addnum1);
int len2 = strlen(addnum2);
for(i = len1 - 1,j = len2 - 1; i >= 0 && j >= 0; --i,--j) {
result = addnum1[i] - '0' + addnum2[j] - '0' + carry;
carry = result/10;
total[k++] = result%10 + '0';
}
while(i >= 0) {
result = addnum1[i--] - '0' + carry;
carry = result/10;
total[k++] = result%10 + '0';
}
while(j >= 0) {
result = addnum2[j--] - '0' + carry;
carry = result/10;
total[k++] = result%10 + '0';
}
if(carry) total[k++] = carry + '0';
total[k] = '\0';
len = strlen(total);
for(i = 0; i < len/2; ++i) {
k = total[i];
total[i] = total[len - 1 - i];
total[len - 1 - i] = k;
}
return total;
}

// 完成以字符串形式的两个大数相减。返回字符串形式的差。
// difference ← subnum1 - subnum2
char *LargeNumberSub(char *subnum1,char *subnum2, char *difference) {
int i,j,k,result,borrow = 0;
int sign = 0,swap = 0;
int maxl,minl;
char *pta,*ptb;
int len1 = strlen(subnum1);
int len2 = strlen(subnum2);
if(len1 == len2) {//两数位数相等时
for(i = 0; i < len1; ++i) {//从高位开始比较,某位大时,这个数就大,相等时继续比较,某位小时,这个数就小
if(subnum1[i] == subnum2[i]) continue;
else if(subnum1[i] < subnum2[i]) {
swap = 1;
break;
}
else {
swap = 0;
break;
}
}
}
if(len2 > len1 || swap) {//减数大于被减数
pta = (char *)malloc((len2 + 1)*sizeof(char)); // pta总是指向绝对值更大的数
ptb = (char *)malloc((len1 + 1)*sizeof(char)); // 而ptb指向绝对值更小的数
strcpy(pta,subnum2);
strcpy(ptb,subnum1);
maxl = len2;
minl = len1;
sign = 1;
}
else {//被减数大于减数
pta = (char *)malloc((len1 + 1)*sizeof(char)); // pta总是指向绝对值更大的数
ptb = (char *)malloc((len2 + 1)*sizeof(char)); // 而ptb指向绝对值更小的数
strcpy(pta,subnum1);
strcpy(ptb,subnum2);
maxl = len1;
minl = len2;
sign = 0;
}
for(i = maxl - 1,j = minl - 1,k = 0; j >= 0; --i,--j) {//从个位开始减
result = pta[i] - ptb[j] - borrow;
if(result < 0) {
result += 10;
borrow = 1;
}
else borrow = 0;
difference[k++] = result + '0';
}
while(i >= 0) {
result = pta[i--] - '0' - borrow;
if(result < 0) {
result += 10;
borrow = 1;
}
else borrow = 0;
difference[k++] = result + '0';
}
--k;
while(difference[k] == '0' && k > 0) --k;//去除差数前端冗余的'0'
if(sign) difference[++k] = '-';
difference[++k] = '\0';
for(i = 0; i < k/2; ++i) {
result = difference[i];
difference[i] = difference[k - 1 - i];
difference[k - 1 - i] = result;
}
free(pta);
free(ptb);
return difference;
}

int main() {
char s[MAXSIZE] = "4561239986547";
char t[MAXSIZE] = "4560658897546";
char result[MAXSIZE + 1];
printf("%s + %s = %s\n",s,t,LargeNumberAdd(s,t,result));
printf("%s - %s = %s\n",s,t,LargeNumberSub(s,t,result));
printf("%s - %s = %s\n",t,s,LargeNumberSub(t,s,result));
return 0;
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
形容手表很舒服的句子 情侣手表的对话句子 租门面和房东鉴了十年合同,房东要退店面,我可以不退吗,继续经 ...一篇朝花夕拾里十篇小短文的主要内容及作者的情感和主要人物的... 什么叫狼狗 狼狗的生活习性有哪些? 起个姓罗好听的宝宝名字 野火的近义词 个是词语解释 请旌词语解释 VB实现大整数的加减法计算器 宣城市,市树和市花是什么 如果要开发一套数字校园软件,怎么样招募组建研发团队,有没有可能外包 电信数字校园适合哪些客户? 大整数减法 C语言 大整数减法 数字校园的服务商有哪些,谁家的功能好一些? c语言 大整数减法 怎样用C语言做超大整数的减法运算? 解释一下这个大数的加减法具体算法 26岁读研值得么,我刚考上211,985,可身边邻居,以前的同学都说我虚度人生,我动摇了给点建议! 《马说》每一自然段然用一句话概括。 几篇文言文的中心思想和主要内容 (马说)概括全文主旨的句子是: 刀客家族的女人杨烁唱的那首黄河水怎么下载 马说一课文章三个段分别写了什么内容?有怎样的情感脉络? 《马说》概括段意 oppo手机怎么下载两个? 北京千足金黄金价格?(首饰) 我前两天在北京菜百买了一块30克的千足金的兔年纪念金条,现在想卖,可我383元&#47;克买的,怎么卖才不亏啊 您好,请问下你们安徽宣城水东镇这边有3G信号覆盖吗 谁有opengl 4.0以后的版本吗?包含gl.h glu.h 宣城职业技术学院校园一卡通是不是就是宣城职业技术学院校园一点通 宣城市国家税务局的负责辖区 大整数加法的 宣城有那家修手机病毒 安徽省宣城市玉荷路坐几路公交车 宣城的契税收取标准是多少 哪里能下载破解的(非学生版)的flexsim,或者witness软件? 疯狂牧场 肥老鼠说唱那段音乐 埃文·威廉姆斯的人物生平 拉贝日记 插曲 有名的慢摇 超市照明用什么节能灯比较好? 啦的组词,,啊的组词 什么品牌节能灯好卖? 节能灯那种好? 酒糟鼻初期做了激光后,鼻子感觉鼻尖那有点小鼓,细看的话还有几个黑点,请问还需要治疗吗? 8的倍数有什么? 写简历,可以写word2003为熟悉软件吗