提交记录 12313
| 提交时间 |
评测时间 |
| 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;
}
| Compilation | N/A | N/A | Compile Error | Score: N/A | 显示更多 |
Judge Duck Online | 评测鸭在线
Server Time: 2026-03-26 07:23:27 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠