本次测试难度中等,细节仍需多注意
第一题 打印沙漏
要点
- 确定打印行数(打表法或数学方法)
- 注意格式
#include<bits/stdc++.h>
using namespace std;
int a[25]={0,1,7,17,31,49,71,97,127,161,199,241,287,337,391,449,511,577,647,721,799,881,967};
int n;
char x;
int main()
{
cin>>n>>x;
for(int i=22;i>=0;i--)
{
if(n>=a[i])
{
for(int j=1;j<=i;j++)
{
for(int k=1;k<j;k++)
printf(" ");
for(int k=1;k<=(i-j)*2+1;k++)
printf("%c",x);
printf("\n");
}
for(int j=i-1;j>0;j--)
{
for(int k=1;k<=j-1;k++)
printf(" ");
for(int k=1;k<=(i-j)*2+1;k++)
printf("%c",x);
printf("\n");
}
printf("%d",n-a[i]);
break;
}
}
return 0;
}
第二题 素数对猜想
要点
- 筛出素数(线性筛或欧式筛)
#include<bits/stdc++.h>
using namespace std;
int n,sum;
int isprime(int x)
{
int ans=0;
for(int i=2;i*i<=x;i++)
{
if(x%i==0)
ans++;
}
if(ans==0) return 1;
else return 0;
}
int main()
{
cin>>n;
if(n%2!=0)
{for(int i=n;i>=5;i-=2)
{
if(isprime(i)==1&&isprime(i-2)==1)
sum++;
}}
else
{
for(int i=n-1;i>=5;i-=2)
{
if(isprime(i)==1&&isprime(i-2)==1)
sum++;
}
}
cout<<sum;
return 0;
}
素数判断函数注意限制条件 “ i*i<=n ”否则超时!!!
第三题 数组元素循环右移问题
思路
- 讨巧:直接分两段输出
- 反转数组 通过三次反转实现
#include<bits/stdc++.h>
using namespace std;
int n,m,t;
int a[105];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n/2;i++)
{
t=a[i];
a[i]=a[n+1-i];
a[n+1-i]=t;
}
for(int i=1;i<=m/2;i++)
{
t=a[i];
a[i]=a[m+1-i];
a[m+1-i]=t;
}
for(int i=m+1;i<=m+(n-m)/2;i++)
{
t=a[i];
a[i]=a[n+m+1-i];
a[n+m+1-i]=t;
}
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
第四题 Have Fun with Numbers
要点
- 大数存储用数组 以及进位问题
- 新建数组用来表示不同位上的数字
- 如出现×2后位数增多 需要另外讨论
#include<bits/stdc++.h>
using namespace std;
string x;
int len;
int a[25],b[25],c[10],ans;
int main()
{
cin>>x;
len=x.size();
for(int i=0;i<len;i++)
{
a[len-i-1]=x[i]-'0';
}
for(int i=0;i<len;i++)
{
b[i]=a[i]*2;
}
for(int i=0;i<len;i++)
{
b[i+1]+=b[i]/10;
b[i]%=10;
}
for(int i=0;i<len;i++)
{
c[a[i]]++;
c[b[i]]--; //一种方法
}
for(int i=1;i<=9;i++)
{
if(c[i]!=0) ans++;
}
if(b[len]!=0)
{cout<<"No"<<endl;
for(int i=len;i>=0;i--)
cout<<b[i];}
else
{if(ans==0) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
for(int i=len-1;i>=0;i--)
cout<<b[i];}
return 0;
}
第五题 Shuffling Machine
要点
- 打表
- 数组内部变换
#include<bits/stdc++.h>
using namespace std;
const int n=54;
int main()
{
string b[n]={"S1","S2","S3","S4","S5","S6","S7","S8","S9","S10","S11","S12","S13","H1","H2","H3","H4","H5","H6","H7","H8","H9","H10","H11","H12","H13","C1","C2","C3","C4","C5","C6","C7","C8","C9","C10","C11","C12","C13","D1","D2","D3","D4","D5","D6","D7","D8","D9","D10","D11","D12","D13","J1","J2"};
int k;
cin>>k;
int a[n];
string c[n];
for(int i=0;i<n;i++)
cin>>a[i];
while(k--)
{
for(int i=0;i<n;i++)
c[a[i]-1]=b[i];
for(int i=0;i<n;i++)
b[i]=c[i];
}
for(int i=0;i<n;i++)
cout<<b[i]<<" ";
还有一种思路避免多次移动:直接定位变换最终位置
for(int i=1;i<=54;i++)
{
for(int j=1;j<=k;j++)
{
t=order[t];
}
}
总结
自测时多考虑临界,避免出现小问题。