挑战大数乘法,菜鸟的愤怒!
大数乘法是高手的必经之路#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
voidbigNum(char * str1, char *str2,char * res) {
int length1 = strlen(str1);//求str1长度
int length2 = strlen(str2);//求str2长度
charjieguo = { 0 };//缓冲区
for (int i = length2 - 1,m=0; i >= 0; i--,m++) {//将str2每一位分别与str1每一位相乘,关键是相乘后的数,从后往前计数str2的第m位与str1的第n位相乘后加上jieguo之前的数并存放在jieguo中,判断jieguo是否进位。
for (int j = length1 - 1,n = 0; j >= 0; j--,n++) {
int temp = jieguo+(str2 - '0') * (str1 - '0');
jieguo+= temp / 10;
jieguo = temp % 10;
}
}
//对调缓冲区,存入res字符串数组中。
int i = 2047;
while (jieguo == 0) {
i--;
}
for (int k = i,r=0; k >= 0; k--,r++) {
res = (char)jieguo + 48;
}
}
void maintt() {
char str1;
char str2;
scanf("%s", str1);
scanf("%s", str2);
char res = { 0 };
bigNum(str1, str2, res);
printf("%s", res);
system("pause");
}
////方法二,递归
void bignum2(char * str1, char *str2,char * arr, int length) {//arr为结果数组
if (length == 0) {
int i = 2047;
while (arr == 0) {
i--;
}
for (int j = 0; j <= i / 2; j++) {
char temp = arr+'0';
arr = arr+'0';
arr = temp;
}
return;
}
else {
int length1 = strlen(str1);
int length2 = strlen(str2);
for (int i = length1 - 1, m = 0; i >= 0; i--, m++) {
int temp = arr + (str2 - '0')*(str1 - '0');
arr = temp % 10;
arr += temp / 10;
}
bignum3(str1, str2,arr, length - 1);
}
}
void main() {
char str1;
char str2;
char arr = { 0 };
scanf("%s", str1);
scanf("%s", str2);
char res = { 0 };
bignum3(str1, str2, res, strlen(str2));
printf("%s", res);
system("pause");
} 51ai 发表于 2017-11-17 14:45
66行、78行的bignum3是不是应该是 bignum2?
哈哈哈,这都被你发现了 不错不错,支持支持下。 应该没有比这个写法更简单的了吧 感谢分享 本帖最后由 51ai 于 2017-11-17 14:46 编辑
66行、78行的bignum3是不是应该是 bignum2? 66666,社会,社会。。。。。短短几十行代码,让我深深感受到了浓重的社会气息。 天道法海 发表于 2017-11-17 19:11
66666,社会,社会。。。。。短短几十行代码,让我深深感受到了浓重的社会气息。
错,这是菜鸟的愤怒
页:
[1]