提交记录 12313


用户 题目 状态 得分 用时 内存 语言 代码长度
lbb1993 1004a. 【模板题】高精度乘法2 Compile Error 0 0 ns 0 KB C++ 1.18 KB
提交时间 评测时间
2020-03-22 15:22:12 2020-08-01 02:53:41
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
 
//定义常量,常量值根据需要修改,此算法为完全根据乘法竖式模拟算法,没有优化
//并且浪费了a[0]、b[0]、c[0](因为这三个数组的第一个元素就没用到) 
#define LENGTH 1001
int main(){
	//准备,以字符串形式读入乘数 
	char a1[LENGTH],b1[LENGTH];
	//准备,转换读入的乘数,逆序存放到数字数组 
	int a[LENGTH],b[LENGTH],c[LENGTH];
	int lena,lenb,lenc,i,j,x;
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	//读取乘数 
	gets(a1);
	gets(b1);
	lena = strlen(a1);
	lenb = strlen(b1);
	//把刚才读取进来的乘数,逆序转换成int类型数字保存到int数组里
 	for (i = 0;i < lena;i++){
 		a[lena - i] = a1[i] - 48;
		//0的ASCII码是48,这里char类型和int类型是不一样的,需要减去差值转换成实际的int,这一局其实相当于
		//a[lena - i] = a1[i] - '0';
	}
	for (i = 0;i < lenb; i++){
		b[lenb - i] = b1[i] - 48;
	}
 
	for (i = 1; i <= lena; i++){
		x = 0;//初始化进位
		for (j = 1; j <= lenb; j++){
			//模拟乘法竖式,进位、错位相加
			c[i + j - 1] = a[i] * b[j] + x + c[i + j - 1];
			x = c[i + j - 1] / 10;//乘法进位
			c[i + j - 1] %= 10;//进位后保留个位 
		} 
		c[lenb + i] = x; //错位相加高位进位(先把进位加到高位) 
	}
	lenc = lena + lenb;//两个非零因数相乘,积的位数要么是两个因数位数之和,要么是两个因数位数之和-1 
	//检查最高位是否为0,如果为0,退一位,while循环可以保证即使因数是0也能输出正确的结果而不输出多余前导0 
	while (c[lenc] == 0 && lenc > 1){
		lenc--; 
	}
	for (i = lenc; i >= 1; i--){
		cout<<c[i];
	}
	return 0;
} 

CompilationN/AN/ACompile ErrorScore: N/A


Judge Duck Online | 评测鸭在线
Server Time: 2026-03-26 07:23:27 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠