<1>大数相加
#include<stdio.h> #include<string.h> char a[10001],b[10001],sum[10002]; int BigIntegerAdd(){ //两个数的长度 int lena = strlen(a); int lenb = strlen(b); //进位标记 int c = 0; int i,j,k; //初始化数组sum memset(sum,0,10001); //倒序相加 k = 0; for(i = lena-1,j = lenb-1;i >= 0 && j >= 0;i--,j--){ sum[k] = a[i] + b[j] - '0' + c; c = 0; //如果相加大于等于10 if(sum[k] > '9'){ sum[k] -= 10; c = 1; } k++; } //a > b while(i >= 0){ sum[k] = a[i] + c; c = 0; //如果相加大于等于10 if(sum[k] > '9'){ sum[k] -= 10; c = 1; } k++; i--; } //b > a while(j >= 0){ sum[k] = b[j] + c; c = 0; //如果相加大于等于10 if(sum[k] > '9'){ sum[k] -= 10; c = 1; } k++; j--; } //如果最后两个数相加有进位的情况 //例如:67 + 51:5+6有进位 if(c == 1){ sum[k++] = '1'; } //翻转 char temp; for(i = 0,j = k-1;i < j;i++,j--){ temp = sum[i]; sum[i] = sum[j]; sum[j] = temp; } return 0; } int main(){ while(scanf("%s %s",a,b) != EOF){ BigIntegerAdd(); puts(sum); } }
<2>大数相减
/* 1.比较减数与被减数的长度,确定正负号 2.模拟减法运算 (1)a[i] == b[j] (2)a[i] < b[j] //借位 (3)a[i] > b[j] */ #include<stdio.h> #include<string.h> char a[10001],b[10001],sum[10001],temp[10001]; int BigIntegerMinus(){ //两个数的长度 int lena = strlen(a); int lenb = strlen(b); //借位标记 int c = 0; int i,j,k,positive = 1; //判断正负号 if(lena < lenb || (lena == lenb && strcmp(a,b) < 0) ){ strcpy(temp,a); strcpy(a,b); strcpy(b,temp); positive = -1;//负号 lena = strlen(a); lenb = strlen(b); } //倒序相减 k = 0; for(i = lena-1,j = lenb-1;i >= 0 && j >= 0;i--,j--){ sum[k] = a[i] - b[j] + '0' + c; c = 0; //如果相减小于0 if(sum[k] < '0'){ sum[k] += 10; c = -1; } k++; } //a > b while(i >= 0){ sum[k] = a[i] + c; c = 0; //如果相减小于0 if(sum[k] < '0'){ sum[k] += 10; c = -1; } k++; i--; } //b > a while(j >= 0){ sum[k] = b[j] + c; c = 0; //如果相减小于0 if(sum[k] < '0'){ sum[k] += 10; c = -1; } k++; j--; } int index = k - 1; //检索高位,有可能相减为0 while(sum[index] == '0' && index > 0){ index--; } //正号 if(positive == 1){ sum[index+1] = '\0'; } //负号 else{ sum[++index] = '-'; sum[index+1] = '\0'; } //翻转 char t; for(i = 0,j = index;i < j;i++,j--){ t = sum[i]; sum[i] = sum[j]; sum[j] = t; } return 0; } int main(){ while(scanf("%s %s",a,b) != EOF){ BigIntegerMinus(); puts(sum); } }
<3>大数乘法
#include<stdio.h> #include<string.h> char a[10001],b[10001],c[20002]; int BigIntegerMulti() { int i,j,lena,lenb,lenc; //初始化 memset(c,'0',20002); //两个数的长度 lena = strlen(a); lenb = strlen(b); //乘积最大位数 lenc = lena + lenb - 1; //翻转 char temp; for(i = 0,j = lena-1;i < j;i++,j--){ temp = a[i]; a[i] = a[j]; a[j] = temp; } for(i = 0,j = lenb-1;i < j;i++,j--){ temp = b[i]; b[i] = b[j]; b[j] = temp; } //倒序相乘 /* 123 * 54 ------ 492 615 ----- 6642 */ int t; for(i = 0;i < lena;i++){ for(j = 0;j < lenb;j++){ /* c[i+j] = (a[i] - '0') * (b[j] - '0') + c[i+j]; 9 * 9 + '0' 超出char范围越界所以设置一个int临时变量t */ t = (a[i] - '0') * (b[j] - '0') + c[i+j] - '0'; //进位 c[i+j+1] = t / 10 + c[i+j+1]; c[i+j] = t % 10 + '0'; } } //确定乘积的位数 while(c[lenc] == '0' && lenc >0){ lenc--; } //注意:加'\0' c[lenc+1] = '\0'; //翻转 for(i = 0,j = lenc;i < j;i++,j--){ temp = c[i]; c[i] = c[j]; c[j] = temp; } return 0; } int main(){ while(scanf("%s %s",a,b) != EOF){ BigIntegerMulti(); puts(c); } return 0; }
自己写的如有问题,请告知一下。