更新洛谷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]。