/* 模板 大数乘小数
*/
#include <stdio.h>
#include <string.h>
#define N 1000
char* Mul(char a[], char b[]){
int lena = strlen(a);
int lenb = strlen(b);
char ans[N];
int ni, jw = 0, start = 0;
memset(ans, '0', sizeof(ans));
for(int i = lena - 1; i >= 0; i --){ // 完全仿照平时数学乘法笔算方法
ni = start ++;
// start 为这轮计算保存结果的起始位置;如 123*43 第一轮算123 *3,起始位置为0,第二轮算123*4(其实*40),起始位置为1
// 易知,start 每轮运算后应加1
for(int j = lenb - 1; j >= 0; j --){
jw = jw + (a[i] - '0') * (b[j] - '0') + ans[ni] - '0'; // jw暂存结果
ans[ni ++] = jw % 10 + '0'; // jw % 10 后写入ans数组
jw /= 10; // jw / 10 后才是真正的进位
}
while(jw){ // 本轮计算完成后,还有进位,将其写入ans数组
ans[ni ++] = jw % 10 + '0';
jw /= 10;
}
}
ans[ni] = '\0';
for(int i = 0; i < ni / 2; i ++){ // 因为是逆序写入的,最后要反转
char temp = ans[i];
ans[i] = ans[ni - i - 1];
ans[ni - i - 1] = temp;
}
return ans;
}
int main()
{
char a[N], b[N];
while(scanf(" %s %s", a, b) != EOF){
printf("%s\n", Mul(a, b));
}
return 0;
}
/* 模板 大数乘小数
*/
#include <stdio.h>
#include <string.h>
#define N 1000
char* Mul(char a[], int b){ // 直接拿大数的每一位去乘小数,注意进位即可
int lena = strlen(a);
char ans[N] = {"\0"}; // 保存结果
int ni = 0, jw = 0; // ni为结果数组下表, jw保存进位
for(int i = lena - 1; i >= 0; i --){ // 拿大数的每一位去成小数然后加上低位进位,结果%10后保存在ans数组,结果/10 作为进位
jw = jw + (a[i] - '0') * b;
ans[ni ++] = jw % 10 + '0';
jw /= 10;
}
while(jw){ // jw不为0,仍要取余保存
ans[ni ++] = jw % 10 + '0';
jw /= 10;
}
ans[ni] = '\0';
for(int i = 0; i <= ni / 2; i ++){ // 结果数组倒置
char temp = ans[i];
ans[i] = ans[ni - i - 1];
ans[ni - i- 1] = temp;
}
return ans;
}
int main()
{
int b;
char a[N];
while(scanf(" %s %d", a, &b) != EOF){
printf("%s\n", Mul(a, b));
}
return 0;
}
/* 模板 大数加大数
*/
#include <stdio.h>
#include <string.h>
#define N 1000
char* Add(char a[], char b[]){ // 完全模拟数学运算习惯
int lena = strlen(a);
int lenb = strlen(b);
char ans[N]= {"\0"}; // 保存运算结果
int i = 0, jw = 0; // i为ans数组下标,jw 即保存低位运算后的进位
while(lena -- && lenb --){ // 从最低位开始 相加
jw = jw + a[lena] + b[lenb] - '0' * 2;
ans[i ++] = jw % 10 + '0';
jw /= 10;
}
while(lena >= 0){ // 将单独剩余高位加上
jw = jw + a[lena --] - '0';
ans[i ++] = jw % 10 + '0';
jw /= 10;
}
while(lenb >= 0){
jw = jw + b[lenb --] - '0';
ans[i ++] = jw % 10 + '0';
jw /= 10;
}
while(jw){ // 进位不为0的话,加上进位
ans[i ++] = jw % 10 + '0';
jw /= 10;
}
for(int j = 0; j <= i / 2; j ++){ // 结果数组倒置
char temp = ans[j];
ans[j] = ans[i - j - 1];
ans[i - j - 1] = temp;
}
return ans;
}
int main()
{
char a[N], b[N];
while(scanf("%s %s", a, b) != EOF){
printf("%s\n", Add(a, b));
}
return 0;
}
/* 模板 — 大数减大数
*/
#include <stdio.h>
#include <string.h>
#define N 1000
char* Mul(char a[], char b[]){
char ans[N];
int lena = strlen(a);
int lenb = strlen(b);
int ni = N - 2, ok = 0; // ni为ans数组下标,计算结果倒叙存入
ans[ni + 1] = '\0';
if(lena < lenb || lena == lenb && strcmp(a, b) < 0){ // 判断结果是不是负数
ok = -1;
char ls[N];
int temp = lena; // 交换变量
lena = lenb;
lenb = temp;
strcpy(ls, a);
strcpy(a, b);
strcpy(b, ls);
}
int i, j, ls, jw = 0; // jw 保存借位
for(i = lena - 1, j = lenb - 1; i >= 0 && j >= 0; i --, j --){ // 从最低位开始相减
ls = a[i] - b[j] - jw; // ls 临时保存结果
if(ls < 0){
ls += 10; // 借位
jw = 1;
}
else{
jw = 0;
}
ans[ni --] = ls + '0';
}
while(i >= 0){
ls = a[i --] - '0' - jw;
if(ls < 0){
ls += 10; // 借位
jw = 1;
}
else{
jw = 0;
}
ans[ni --] = ls + '0';
}
while(ans[ni + 1] == '0' && ans[ni + 2] != '\0'){ // 除去前导0
ni ++;
}
if(ok){
ans[ni --] = '-';
}
return ans + ni + 1;
}
int main()
{
char a[N], b[N];
while(scanf(" %s %s", a, b) != EOF){
printf("%s\n", Mul(a, b));
}
return 0;
}