社区讨论

站外题求救,急!!!!悬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
#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 条回复,欢迎继续交流。

正在加载回复...