题解

刘殷恺  •  1年前


高精度解法

include <bits/stdc++.h>

using namespace std; const int MAXN = 255+4; //根据题目的最大值。+4为了防止A+B出现进位 char s1[MAXN] = {};//存储字符串 char s2[MAXN] = {};//存储字符串 int a[MAXN] = {};//存储加数A int b[MAXN] = {};//存储加数B int c[3*MAXN] = {};//存储和B

int main() { scanf("%s %s", s1, s2);//读入字符串

//处理负数 bool flaga = false;//乘数a的符号 if ('-'==s1[0]) {

flaga = true;
strcpy(s1, &s1[1]);//删除负号

} bool flagb = false;//乘数b的符号 if ('-'==s2[0]) {

flagb = true;
strcpy(s2, &s2[1]);//删除负号

}

//处理输出的负号 if ((true==flaga && false==flagb) || (false==flaga && true==flagb)) {

printf("-");

}

//处理乘数1 int lena = strlen(s1); for (int i=0; i<lena; i++) { a[lena-i-1]=s1[i]-'0'; }

//处理乘数2 int lenb = strlen(s2); for (int i=0; i<lenb; i++) { b[lenb-i-1]=s2[i]-'0'; }

//模拟竖式乘法 int jw;//上一轮计算进位 for (int i=0; i<lena; i++) { jw=0; for (int j=0; j<lenb; j++) { //交叉乘积 c[i+j] = a[i]*b[j]+jw+c[i+j];//当前乘积+上次乘积进位+原数 jw = c[i+j]/10;//处理进位 c[i+j] %= 10; } c[i+lenb]=jw;//进位设置 }

//删除前导零 int lenc=lena+lenb; for (int i=lenc-1; i>=0; i--) {

//因为我们是从索引 0 开始,所以最高位是保存在 len-1
if (0==c[i] && lenc>1)
{
  //注意要有 lenc>1 这个条件。考虑特殊情况,加法结果为 00,我们实际要输出 0。
  lenc--;
}
else
{
  //第一个不是零的最高位,结束删除
  break;
}

}

//逆序打印输出 for (int i=lenc-1; i>=0; i--) {

printf("%d", c[i]);

} printf("\n");

return 0; }

© 编程魔法师 OJ 2022中文简体 | English


评论:

希丰展?使md。


ZZQ  •  1年前

错了吧 我试了99遍了你的程序 全部显示运行错误


魈凯KBS  •  5个月前