大数加法
void Add(char s1[], char s2[])//参数为两个字符串数组 { int num1[M], num2[M]; int i, j; int len1, len2; len1 = strlen(s1); len2 = strlen(s2); for (i = len1 - 1, j = 0; i >= 0; i--) { //num1[0]保存的是低位 num1[j++] = s1[i] - '0'; } for (i = len2 - 1, j = 0; i >= 0; i--) { num2[j++] = s2[i] - '0'; } for (i = 0; i < M; i++) { num1[i] += num2[i]; if (num1[i] > 9) { num1[i] -= 10; num1[i + 1] ++; } } for (i = M - 1; (i >= 0) && (num1[i] == 0); i--);//找到第一个不是0的数的位置 if (i >= 0) { //从高位到低位输出每个数 for (; i >= 0; i--) { printf("%d", num1[i]); } } else { printf("0 "); } }
大数乘法
void Multi(char str1[], char str2[]) { int len1, len2, i, j; int a[MAX + 10], b[MAX + 10], c[MAX * 2 + 10]; memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); len1 = strlen(str1); for (j = 0, i = len1 - 1; i >= 0; i--) {//把数字倒过来 a[j++] = str1[i] - '0'; } len2 = strlen(str2); for (j = 0, i = len2 - 1; i >= 0; i--) {//倒转第二个整数 b[j++] = str2[i] - '0'; } for (i = 0; i < len2; i++) {//用第二个数乘以第一个数,每次一位 for (j = 0; j < len1; j++) { c[i + j] += b[i] * a[j]; } }//先乘起来,后面统一进位 for (i = 0; i < MAX * 2; i++) {//循环统一处理进位问题 if (c[i] >= 10) { c[i + 1] += c[i] / 10; c[i] %= 10; } } for (i = MAX * 2; (c[i] == 0) && (i >= 0); i--);//跳过高位的0 if (i >= 0) { for (; i >= 0; i--) { printf("%d", c[i]); } } else { printf("0"); } printf(" "); }
另一个好理解一点的乘法
#include <stdio.h> #define MAX 10 int main() { //这个数组是事先定义好的 这是两个乘数之一 把数字拆开 保存到数组中 int num[MAX] = { 0, 3, 0, 0, 0, 0, 0, 0, 0, 0 }; int s; int i; int c = 0; for (i = 0; i < MAX; i++) { //30是第二个乘数 也是直接写出来的 s = num[i] * 30 + c; num[i] = s % 10; c = s / 10; } return 0; }