蓝桥杯练习

蓝桥杯练习

题目完成时间2021年3月16日

题目:
计算机真是最傻的东西;他都不能计算大于10^65-1的a*b,请你帮这个“最傻”的东西过关,否则它就真的只认识1和0了。

输入格式
共两行;
第一行输入一个整数a;
第一行输入一个整数b。
输出格式
  共一行,一个表示a*b的整数。

样例输入

2147483647
2147483647

样例输出

4611686014132420609

数据规模和约定
▲10^65-1 <a,b< 10^201-1

题解:竖式乘法怎么算的实现就好了,不过有要注意的是乘完相加的时候要机的错位,错位的位置要正确,否则始终都加不对。
假设当前要计算111*11那么竖式的结果是:
111
  111
1221
要注意的点是:竖式每多一行就是将起始的位置向后移动一位。所以我们每次计算后都要将当前值后移一位。那么怎么移动又是一个点,生硬的将字符串数组后移一定会照成不必要的麻烦。所以我们只要将字符串的起始位置定成负数就可以了,比如竖式的第二行起始位置就是-1,竖式第二行起始位置就是-2。依次类推。
还有一个点要注意。我们的到的数都是反过来的,就是我们记录乘法得到的数字是从后面开始的,所以我们最后读取数字的时候要反过来读。

以上就是这个题需要注意的点。

程序如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

// void nixu(char *num3){
//     int len = strlen(num3);
//     for(int i = 0;i <= len / 2;++i){
//         char t = num3[i];
//         num3[i] = num3[len-1 - i];
//         num3[len-1 - i] = t;
//     }
// }

void jia(char *num3,char *temp,int index2){
    int index1 = 0;
    int jin = 0;
    while(index1 < strlen(num3) || index2 < strlen(temp)){
        if(index2 >= 0 && index1 < strlen(num3)){
            char t = num3[index1];
            num3[index1] = (t-'0' + temp[index2]-'0' + jin)%10 + '0';
            jin = (t-'0' + temp[index2]-'0' + jin)/10;
        }else if(index2 >= 0){
            num3[index1] = (temp[index2]-'0' + jin)%10 + '0';
            jin = (temp[index2]-'0' + jin)/10;
        }
        ++index1;
        ++index2;
    }
    if(jin > 0){
        num3[index1++] = jin + '0';
    }
    num3[index1] = '\0';
}

int main()
{
    char num1[4000],num2[4000]; //这里的界限要大一点,本人也不知道为啥。。。有知道的可以教我一下
    char num3[4000];
    char mid[4000];
    int jin;
    int index;
    int index2 = -1;
    scanf("%s %s",num1,num2);
    if(strlen(num2) > strlen(num1)){
        strcpy(mid,num1);
        strcpy(num1,num2);
        strcpy(num2,mid);
    }
    int len1 = strlen(num1);
    int len2 = strlen(num2);
    for(int i = len2 - 1;i >= 0;--i){   // 乘数
        index = 0;
        jin = 0;
        char temp[4000];
        for(int j = len1 - 1;j >= 0;--j){
            temp[index] = ((num2[i] - '0')*(num1[j] - '0') + jin) % 10 + '0';
            jin = ((num2[i] - '0')*(num1[j] - '0') + jin) / 10;
            ++index;
        }
        if(jin > 0){
            temp[index++] = jin + '0';
        }
        temp[index] = '\0';
        if(i == len2 - 1){
            strcpy(num3,temp);
        }else{
            jia(num3,temp,index2);
            --index2;
        }
    }
    //nixu(num3);
    for(int i = strlen(num3)-1;i >= 0;--i){
        printf("%c",num3[i]);
    }
    system("pause");
    return 0;
}

于2021年3月17日15点14分完成博客编写,若发现错误望指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值