社区讨论
站外题求救,急!!!!悬2关
灌水区参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lo17xpic
- 此快照首次捕获于
- 2023/10/22 16:40 2 年前
- 此快照最后确认于
- 2023/11/02 16:30 2 年前
题意:例如 12 乘以 23,先从左上到右下画直线,因为是 12,所以先画一条线表示 1,再画两条线表示 2。
乘以 23 的时候,从右上往左下角画直线,先画两条表示 2,再画 3 条表示 3。
画直线时,左上到右下、右上到左下的直线平行且不重叠。
现在我们观察这些直线的交点,最左边有 2 个交点,中间有 7 个交点(上面 4 个下面 3 个),最右边有 6 个交点。所以 12 乘以 23 的答案是 276。在这个计算过程中总共产生了 2+7+6=15 个交点。
现在给定两个数字 a,b,问这两个数字按照如此方式相乘总共会得到多少个交点。
CPP
现在给定两个数字 a,b,问这两个数字按照如此方式相乘总共会得到多少个交点。#include<bits/stdc++.h>
using namespace std;
int len,a[1000000]={0},b[1000000]={0},c[1000000]={0};
long long sum=0;
int main()
{
string m,n;
cin>>m>>n;
len=m.size();
for(int i=0;i<len;i++)
{
a[len-i-1]=m[i]-'0';//倒序存储
}
len=n.size();
for(int i=0;i<len;i++)
{
b[len-i-1]=n[i]-'0';//倒序存储
}
for(int j=0;j<n.size();j++)//第二个数
{
for(int i=0;i<m.size();i++)//第一个数
{
c[i+j]+=b[j]*a[i];
}
}
len=n.size()+m.size();//结果的位数
for(int i=0;i<len;i++)
{
if(c[i]>=10)//进位
{
c[i+1]=c[i+1]+c[i]/10;//例:91应该进9,C++中也就是91/10=9
c[i]=c[i]%10;
}
}
while(c[len-1]==0&&len>1)//去除前导零
{
len--;
}
for(int i=len-1;i>=0;i--)
{
sum+=c[i];
}
cout<<sum;
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...