都知道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
}