整数分块知识(转载)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
整数分块乘法是一种优化乘法的算法,适用于大整数的乘法运算。它的思想是将大整数按照一定大小分块,每个块内进行乘法运算,最后将所有块的结果相加得到最终的结果。下面是用C语言实现的一个分块乘法的函数: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define BLOCK_SIZE 8 // 每个块的大小 // 将字符串转换成整数数组 void str_to_int(char* str, int* num, int len) { for (int i = 0; i < len; i++) { num[i] = str[len - 1 - i] - '0'; } } // 将整数数组转换成字符串 char* int_to_str(int* num, int len) { char* str = (char*) malloc((len + 1) * sizeof(char)); for (int i = 0; i < len; i++) { str[i] = num[len - 1 - i] + '0'; } str[len] = '\0'; return str; } // 分块乘法 char* block_multiply(char* num1, char* num2) { int len1 = strlen(num1); int len2 = strlen(num2); int n = (len1 + BLOCK_SIZE - 1) / BLOCK_SIZE; // 块的个数 int m = (len2 + BLOCK_SIZE - 1) / BLOCK_SIZE; int* a = (int*) calloc(n, sizeof(int)); // 存放 num1 的块 int* b = (int*) calloc(m, sizeof(int)); // 存放 num2 的块 str_to_int(num1, a, n * BLOCK_SIZE); str_to_int(num2, b, m * BLOCK_SIZE); int* c = (int*) calloc(n + m, sizeof(int)); // 存放结果的数组 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { long long t = 0; for (int k = 0; k < BLOCK_SIZE; k++) { t += (long long) a[i * BLOCK_SIZE + k] * b[j * BLOCK_SIZE + k]; } t += c[i + j]; c[i + j] = t % 10; c[i + j + 1] += t / 10; } } // 去掉前导零 int len = n + m; while (len > 0 && c[len - 1] == 0) { len--; } char* str = int_to_str(c, len); free(a); free(b); free(c); return str; } int main() { char num1[] = "123456789"; char num2[] = "987654321"; char* result = block_multiply(num1, num2); printf("%s\n", result); // 输出结果:121932631137021795 free(result); return 0; } ``` 这个函数首先将输入的两个大整数按照块的大小(这里取8)分块,然后用三重循环遍历所有块,进行乘法运算,并将结果存放在结果数组中。最后,将结果数组转换成字符串并返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值