追梦少年_66 发表于 2017-11-16 12:16

挑战大数乘法,菜鸟的愤怒!

大数乘法是高手的必经之路

#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");

}

追梦少年_66 发表于 2017-11-18 23:13

51ai 发表于 2017-11-17 14:45
66行、78行的bignum3是不是应该是 bignum2?

哈哈哈,这都被你发现了

yuehanoo 发表于 2017-11-16 12:35

不错不错,支持支持下。

追梦少年_66 发表于 2017-11-16 12:47

应该没有比这个写法更简单的了吧

liubian 发表于 2017-11-17 09:39

感谢分享

51ai 发表于 2017-11-17 14:45

本帖最后由 51ai 于 2017-11-17 14:46 编辑

66行、78行的bignum3是不是应该是 bignum2?

天道法海 发表于 2017-11-17 19:11

66666,社会,社会。。。。。短短几十行代码,让我深深感受到了浓重的社会气息。

追梦少年_66 发表于 2017-11-17 20:24

天道法海 发表于 2017-11-17 19:11
66666,社会,社会。。。。。短短几十行代码,让我深深感受到了浓重的社会气息。

错,这是菜鸟的愤怒
页: [1]
查看完整版本: 挑战大数乘法,菜鸟的愤怒!