首先第一类最为经典的便是高精度问题
用人加减乘除的方式让电脑去运算这就是一种模拟;
人想出一种解决问题的思路然后让电脑去做这个苦力活 还有旋转之类的,此类题一般题容易读懂但是却需要思考如何模拟
必须要思考要模拟的每一步的细节,如找环问题,二进制转化,都是是很巧妙的操作
模拟题必须要小心思考自己做的不要出现细节上的卡死自己
for(int i=1,j=n;i<=j;i++,j--)
if(i==j) cout<<a[i]<<" ";
else cout<<a[i]<<" "<<a[j]<<" ";// 前后依次枚举
如果说两个数组的边界乘积N*M<=5000 不好具体去取值的时候直接使用定义a[n][m]
有些题甚至和数组里面的数据没有关系
首先自己手动模拟画出旋转的操作再发现普遍规律
#include <bitsdc++.h>
using namespace std;
const int N=1010;
int a[N][N],b[N][N],c[N][N];
int t,n;
bool cmp()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]!=b[i][j]) return false;
return true;
}
int main ()
{
scanf("%d",&t);
while(t--)
{
scanf("%d", &n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&b[i][j]);
int ans=0;
while(!cmp())
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][j]=a[j][n-i+1];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=c[i][j];
ans++;
if(ans>4) break;
}
printf("%d\n",min(ans,4-ans));
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
string s1,s2;
int a[N],b[N],c[N];
int main ()
{
cin>>s1>>s2;//string 只能用cin
int l1=s1.size(),l2=s2.size();
for(int i=0;i<l1;i++) a[i]=s1[l1-i-1]-'0';
for(int i=0;i<l2;i++) b[i]=s2[l2-i-1]-'0';//把每个数倒置过来存起来方便后面的进位
int jw=0;
int l=max(l1,l2)+1;//最大位数
//计算机模拟
for(int i=0;i<l;i++)
{
c[i]=a[i]+b[i]+jw;
jw=c[i]/10;
c[i]%=10;
}
for(int i=0;i<l1;
for(int i=l-1;i>0;i--)//有没有进位倒置出现前导0
if(c[i]==0&&l>1) l--;
else break;
for(int i=l-1;i>=0;i--)//注意倒置回复
printf("%d",c[i]);
return 0;
}
1.//计算机模拟加法
for(int i=0;i<l;i++)
{
c[i]=a[i]+b[i]+jw;
jw=c[i]/10;
c[i]%=10;
}
2.减法
if(l1<l2||(l1==l2&&s1<s2))//考虑到如果直接比较s1,s2会按照字典字母来会存在短的比长的还大
{//比如 123 1224
cout<<'-';
swap(s1,s2);
swap(l1,l2);//所以还是得这样
}
int l=max(l1,l2);//最大位数
for(int i=0;i<l;i++)//计算机模拟减法
{
if(a[i]<b[i])
{
a[i+1]--;
a[i]+=10;
}
c[i]=a[i]-b[i];
}
3.乘法
int l=max(l1,l2);//最大位数
for(int i=0;i<l;i++)//计算机模拟减法
{
if(a[i]<b[i])
{
a[i+1]--;
a[i]+=10;
}
c[i]=a[i]-b[i];
}
4.除法
#include <bits/stdc++.h>
using namespace std;
string a;
int b;
vector<int> A;
vector<int> div(vector<int> A,int b,int &r)//加引用可以改变这个数
{
vector<int> C;
r=0;
for(int i=A.size()-1;i>=0;i--)//两次反转模拟除法
{
r=r*10+A[i];
C.push_back(r/b);
r%=b;
}
reverse(C.begin(),C.end());
while(C.size()>1&&C.back()==0) C.pop_back();//删去前导0
return C;
}
int main ()//全部采用倒序便于记忆
{
cin>>a>>b;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
int r;
auto C=div(A,b,r);
for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
cout<<endl<<r<<endl;
return 0;
}