大数乘法

xiaoxiao2021-02-28  98

题目

编写两个任意位数的大数相乘的程序,给出计算结果。

分析

3 4 5 × 6 7 8 ---------------------- 个位在左 24 32 40 (5, 4, 3) × 8 = (40, 32, 24) 21 28 35 (5, 4, 3) × 7 = (35, 28, 21) 18 24 30 (5, 4, 3) × 6 = (30, 24, 18) ---------------------- 18 45 82 67 40 结果错位相加 ---------------------- 71 0 40取0, 进4, 67 + 4 = 71 89 1 71取1, 进7, 82 + 7 = 89 53 9 89取9, 进8, 45 + 8 = 53 23 3 53取3, 进5, 18 + 5 = 23 2 3 23取3, 进2, 0 + 2 = 2 2 2取2, 不进位 ---------------------- 2 3 3 9 1 0 计算结果

代码

#include <stdio.h> #include <stdlib.h> #include <string.h> char* toChar(char* a, int len) { char* c = (char*)malloc(len - 1); for(int i = len - 2, j = 0; i >= 0; i--, j++) { c[j] = a[i] - '0'; } return c; } int main() { char a[] = "12341111"; char b[] = "56781111"; char* ap = toChar(a, sizeof(a)); char* bp = toChar(b, sizeof(b)); int ap_len = sizeof(a) - 1; int bp_len = sizeof(b) - 1; int cp_len = ap_len + bp_len; char* cp = (char*)malloc(cp_len); memset(cp, 0, ap_len + bp_len); // compute for(int i = 0; i < ap_len; i++) { for(int j = 0; j < bp_len; j++) { cp[i + j] += ap[i] * bp[j]; } } for(int i = 0, p = 0; i < cp_len; i++) { cp[i] += p; p = cp[i] > 9 ? cp[i] / 10 : 0; cp[i] %= 10; } // print out int len = cp_len - 1; while(cp[len] == 0) len--; for(int i = len; i >= 0; i--) { printf("%d", cp[i]); } //700741993554321 return 0; }
转载请注明原文地址: https://www.6miu.com/read-54865.html

最新回复(0)