31 条题解
-
16
这道题我依然给出两种方法(嘿嘿,没想到吧~)
方法①(评论区中最多答案的 long long 解题)
- 可以定义 long long 型变量 a 和 b
- 输入 a 和 b
- 输出 a 乘 b 的积
上代码!(UP AC过,请放心食用)
#include <bits/stdc++.h> using namespace std; int main() { long long a, b; cin >> a >> b; cout << a * b; return 0; }
方法②(大师级玩家观看,高精度乘法计算)
- 进行高精度计算,此处不进行太多介绍
- 可以列一道竖式来进行解决
- 每一次都是 a 乘 b 的各个位
以下为高精度 AC 代码~
#include <bits/stdc++.h> using namespace std; const int MAXN = 200 + 4;//根据题目的最大值,+4为了防止A+B出现进位 char s1[MAXN] = {};//存储字符串 char s2[MAXN] = {};//存储字符串 int a[MAXN] = {};//存储加数A int b[MAXN] = {};//存储加数B int c[2 * MAXN] = {};//存储A和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 ('-' == s1[0]) { flaga = true; strcpy(s1, &s1[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--; else //第一个不是零的最高位,结束删除 break; } //逆序打印输出 for (int i = lenc - 1; i >= 0; i--) printf("%d", c[i]); return 0; }
制作不易,点个赞吧,看到最后的都是大佬~
-
9
"简洁"的AC代码:
#include <bits/stdc++.h> using namespace std; const int N=10010; const int M=2*N; int c[M],a[N],b[N],len1,len2; char s1[N],s2[N]; int main() { cin>>s1+1>>s2+1; len1=strlen(s1+1); len2=strlen(s2+1); for(int i=1;i<=len1;i++) a[len1-i+1]=s1[i]-'0'; for(int i=1;i<=len2;i++) b[len2-i+1]=s2[i]-'0'; for(int i=1;i<=len1;i++) for(int j=1;j<=len2;j++) { c[i+j-1]+=a[i]*b[j]; c[i+j]+=c[i+j-1]/10; c[i+j-1]%=10; } int len=len1+len2-1;//也是非常巧妙的地方,记住就ok,而且也不难理解,自己比划比划就知道了 if(c[len+1]!=0) len++;//判断一下,要是还有进位保留在len+1的位置,说明len+1位置也有数,就让len++ for(int i=len;i>=1;i--)//因为高索引是高位,输出的时候要先输出高位,因此先输出高索引。 cout<<c[i]; return 0; }
更"简洁"的AC代码:
#include <bits/stdc++.h> using namespace std; const int N=10010; const int M=2*N; int c[M],a[N],b[N]; char s1[N],s2[N]; int alen,blen,tmp; int main() { cin>>s1+1>>s2+1; int len1=strlen(s1+1); int len2=strlen(s2+1); for(int i=len1;i>=1;i--,tmp*=10) if((len1-i)%4==0) a[++alen]=s1[i]-'0',tmp=1; else a[alen]=(s1[i]-'0')*tmp+a[alen]; for(int i=len2;i>=1;i--,tmp*=10) if((len2-i)%4==0) b[++blen]=s2[i]-'0',tmp=1; else b[blen]=(s2[i]-'0')*tmp+b[blen]; for(int i=1;i<=alen;i++) for(int j=1;j<=blen;j++) { c[i+j-1]+=a[i]*b[j]; c[i+j]+=c[i+j-1]/10000; c[i+j-1]%=10000; } int len=alen+blen-1; if(c[len+1]!=0) len++; for(int i=1;i<=len;i++) if(i!=1) printf("%04d",c[len-i+1]);//重点!当遍历到非最高四位时,要保证输出4位,不足4位前面补零 else cout<<c[len];//最高四位,直接输出,不带0 return 0; }
注意!注意!史无前例的"简洁"AC代码即将来袭!
#include <iostream> #include <cstring> #define MAXSIZE 20 #define MAXOUTSIZE MAXSIZE * 2 + 1 using namespace std; int main() { char a[MAXSIZE] = {'0'}, b[MAXSIZE] = {'0'}, c[MAXOUTSIZE] = {'\0'}; int a_int[MAXSIZE] = {0}, b_int[MAXSIZE] = {0}, c_int[MAXOUTSIZE] = {0}; cin >> a; cin >> b; int len_a = strlen(a), len_b = strlen(b); memset(a_int, 0, sizeof a_int); memset(b_int, 0, sizeof b_int); memset(c_int, 0, sizeof c_int); //末位对齐 for (int i = len_a - 1, j = 0; i >= 0; i--, j++) { a_int[j] = a[i] - '0'; } for (int i = len_b - 1, j = 0; i >= 0; i--, j++) { b_int[j] = b[i] - '0'; } //计算每一位,但是不处理进位 for (int i = 0; i < len_a; i++) { for (int j = 0; j < len_b; j++) { c_int[i + j] += a_int[i] * b_int[j]; } } //处理进位 int ans_len = 0; for (int i = 0; i < 2 * MAXSIZE; i++) { c_int[i + 1] += c_int[i] / 10; c_int[i] %= 10; ans_len = i; } //移除序列高位的0,实际上是统计非0位数 while (c_int[ans_len] == 0) { ans_len--; } if (ans_len < 0) { cout << "0"; return 0; } for (int i = ans_len; i >= 0; i--) { c[i] = c_int[i] + '0'; } for (int i = MAXOUTSIZE - 1; i >= 0; i--) { if ('\0' != c[i]) { cout << c[i]; } } return 0; }
-
2
#include <bits/stdc++.h> using namespace std; const int MAXN = 200 + 4; char s1[MAXN] = {}; char s2[MAXN] = {}; int a[MAXN] = {}; int b[MAXN] = {}; int c[2 * MAXN] = {}; int main() { scanf("%s %s", s1, s2); bool flaga = false; if ('-' == s1[0]) { flaga = true; strcpy(s1, &s1[1]); } bool flagb = false; if ('-' == s1[0]) { flaga = true; strcpy(s1, &s1[1]); } if ((true == flaga && false == flagb) || (false == flaga && true == flagb)) printf("-"); int lena = strlen(s1); for (int i = 0; i < lena; i++) { a[lena - i - 1] = s1[i] - '0'; } 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--) { if (0 == c[i] && lenc > 1) lenc--; else{ break; } } for (int i = lenc - 1; i >= 0; i--) printf("%d", c[i]); return 0; }
信息
- ID
- 1295
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 2424
- 已通过
- 1430
- 上传者