站外题求救,急!!!!悬2关
  • 板块灌水区
  • 楼主Starry_dream
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/10/2 18:40
  • 上次更新2023/11/2 16:30:23
查看原帖
站外题求救,急!!!!悬2关
818820
Starry_dream楼主2023/10/2 18:40

题意:例如 12 乘以 23,先从左上到右下画直线,因为是 12,所以先画一条线表示 1,再画两条线表示 2。 乘以 23 的时候,从右上往左下角画直线,先画两条表示 2,再画 3 条表示 3。 画直线时,左上到右下、右上到左下的直线平行且不重叠。 现在我们观察这些直线的交点,最左边有 2 个交点,中间有 7 个交点(上面 4 个下面 3 个),最右边有 6 个交点。所以 12 乘以 23 的答案是 276。在这个计算过程中总共产生了 2+7+6=15 个交点。 现在给定两个数字 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;	
} 
2023/10/2 18:40
加载中...