算法竞赛第二天

本文解析了三个编程挑战,涉及高精度计算、字符数组边界处理和乘法模拟。第一部分讲解了如何利用数组巧妙解决边界问题,第二部分展示了字符串转换为数字并进行高精度运算的方法,第三部分则聚焦于模拟乘法的算法步骤。
摘要由CSDN通过智能技术生成

更新洛谷p2670和p1601和p1303题解

#include<bits/stdc++.h>
using namespace std;
int m,n;
char a[105][105];
int main(){
	cin>>n>>m;
	for(int i=0;i<n;i++)
	  for(int j=0;j<m;j++)
	      cin>>a[i][j];
	for(int i=0;i<n;i++)
	{
	 for(int j=0;j<m;j++){
	 	if(a[i][j]=='*') cout<<a[i][j];
	 	else if(a[i][j]=='?'){
	 		int count=0;
	 		for(int b=i-1;b<i+2;b++)
	 		  for(int c=j-1;c<j+2;c++){
	 		  	if(b==i&&c==j) continue;
	 		  	if(a[b][c]=='*') count++; 
			   }
			   cout<<count;
		 }
	 }
     cout<<endl;
}
     return 0;
}
        新手小白总结一下,利用dx[],dy[]数组存放8个要判断的点。
        const int maxn扩大数组边界,提高容错率。
        g[][]数组在main外声明,默认值是0,不影响解题。
      从而巧妙的解决了本题的边界问题。例如:虽然对于左上角的点也判断了8个但是不影响结果。
#include<bits/stdc++.h>
using namespace std;
const int maxn=520;
int a[maxn],b[maxn],c[maxn];
int main(){
	string A,B;
	cin>>A>>B;
	int len=max(A.length(),B.length());
	for(int i=A.length()-1,j=1;i>=0;i--,j++)
	  a[j]=A[i]-'0';
	for(int i=B.length()-1,j=1;i>=0;i--,j++)
	  b[j]=B[i]-'0';
	for(int i=1;i<=len;i++){
		c[i]+=a[i]+b[i];
		c[i+1]=c[i]/10;
		c[i]%=10;
	}
	if(c[len+1])
	 len++;
	for(int i=len;i>=1;i--)
	cout<<c[i];
	return 0;
}
  总结一下,算法属于高精度。
  (1)存储问题,我们利用字符数组的每一个字节存储数字的每一位,读入利用string去读入操作方便。
  (2)代码中的一些小技巧,因为数组下标从0开始,所以长度要减1。
        接着,将字符数组中的数字字符转化为对应的数字,代码实现也就是减去'0'。
 (3)接着,进位的模拟和细节别忘了最高位的进位。
#include<bits/stdc++.h>
using namespace std;
const int maxn=4020;
int c[maxn],a[maxn],b[maxn];;
int main(){
	string A,B;
	cin>>A>>B;
	for(int i=A.length()-1,j=1;i>=0;j++,i--)
	 a[j]=A[i]-'0';
	for(int i=B.length()-1,j=1;i>=0;j++,i--)
	 b[j]=B[i]-'0';
	for(int i=1;i<=A.length();i++)
	  for(int j=1;j<=B.length();j++)
	   c[i+j-1]+=a[i]*b[j];
	int len=A.length()+B.length();
	for(int i=1;i<=len;i++){
		c[i+1]+=c[i]/10;
		c[i]%=10;
	}
	for(;!c[len];)
	 len--;
	for(int i=max(1,len);i>=1;i--)
	 cout<<c[i];
	 return 0;
}

题目考查的是高精度,并且模拟乘法,要点归纳如下。
(1)数据预处理过程,同加法过程一样,不多解释。
(2)接着的两层for循环是问题的核心,原理实际上是将a[i]*b[j]的结果先放到位置a[i+j-1]上,再处理进位。
(3)接着for循环进行进位的处理,同加法一样,不多解释。
(4)接着是格式的输出,首先,先除去前面的0,在for循环中体现的是,找到第一个非0的位置,接着输出每一位的c[i]。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值