蓝桥杯练习
题目完成时间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分完成博客编写,若发现错误望指正。

472

被折叠的 条评论
为什么被折叠?



