超级大的整数的加减用c语言怎么写?

Python010

超级大的整数的加减用c语言怎么写?,第1张

可以用数组制作。

都知道int,float,double的精度和可使用的范围都是有限的,对于大数相减,总是会产生溢出的情况。

所以对于大数相减,认为可以用数组来做。比如,定义一个数组a[100]a[1]用来保存个位数,a[2]用来保存十位数,等等。

如果a[i]的值大于或等于10,就让a[i+1]++,a[i]-10就行了。

在打印的时候就用一个for语句,再调一下输出格式就可以了。

郁闷,我用纸写了一下,写了3面纸,现在时间不够了,我不能把代码抄上来了。唉……够悲剧。

方法可以告诉你:

分别定义2个字符串数数和2个整数数,然后把字符串数组转换成整数数组,这样的转换并不麻烦,你可以声明一个中间字符串变量(这个字符串长度为1,因为只用于存放一个1个字节的字符),然后分别把这个只含有一个字符的字符串转化位整数并存入整数2维数组中,用atoi()函数把字符串转换成整数。

假设转换后的被减数组成的数组为a1[10][100],减数组成的数组为a2[10][100],然后模拟竖式运算,就是说如果a1[i][j]<a2[k][l]则a1[i][j]要加10再进行计算,当然a1[i][j-1]就要减1,因为被借了1。你可以把数出来的差放入新的整数数组中,如果a1的位数大于a2的位数,那只要把多出的部分直接放入新数组中即可。

还是这样说比较好,我把代码写出来你更难看懂。。。

#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 == 1) {//减数大于被减数

pta = (char *)malloc((len2 + 1)*sizeof(char)) // pa总是指向绝对值更大的数

ptb = (char *)malloc((len1 + 1)*sizeof(char)) // 而pb指向绝对值更小的数

strcpy(pta,subnum2)

strcpy(ptb,subnum1)

maxl = len2

minl = len1

sign = 1

}

else {//被减数大于减数

pta = (char *)malloc((len1 + 1)*sizeof(char)) // pa总是指向绝对值更大的数

ptb = (char *)malloc((len2 + 1)*sizeof(char)) // 而pb指向绝对值更小的数

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'

}

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] = "123"

char t[MAXSIZE] = "456065"

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

}