中国大学MOOC-陈越、何钦铭-数据结构-起步能力自测题
自测-1 打印沙漏
思路:先判断打印层数,再通过数字规律进行打印,妥善运用绝对值正倒三角可以一起打印
代码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,b=1,c,d;
char k;
cin>>n>>k;
while(1)//该循环用于判断层数b,并得到多余的符号数d
{
c=2*b*b-1;
if(c>n)
{
b--;
break;
}
d=n-c;
b++;
}
for(int i=1;i<=2*b-1;i++)//打印沙漏
{
for(int j=1;j<=b-abs(i-b)-1;j++ )
{
cout<<" ";
}
for(int j=2*abs(i-b)+1;j>=1;j--)
{
cout<<k;
}
cout<<endl;
}
cout<<d;
return 0;
}
自测-2 素数对猜想
思路:判断相邻两数是否都为素数即可
代码:
#include<iostream>
#include<cmath>
using namespace std;
int sushu(int x)
{
for(int j=2;j<=sqrt(x);j++)
{
if(x%j==0)
return 0;
}
return 1;
}
int main()
{
int a,count=0;
cin>>a;
for(int i=2;i<=a-2;i++)
{
if(sushu(i)==1&&sushu(i+2)==1)
count++;
}
cout<<count;
return 0;
}
自测-3 数组元素循环右移问题
思路:找到右移后应该输出的的第一个数依次输出到数组尾,然后再从数组第一位开始依次输出。(话说这样利用输出是不是伪实现?其实没有移动数组里的数据)
注意右移位数大于数组长度的情况,利用求余即可。
代码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int a,b,c[101],d;
cin>>a>>b;
for(int i=1;i<=a;i++)
{
cin>>c[i];
}
d=b%a;//注意右移位数大于数组长度的情况
for(int i=a-d+1;i<=a;i++)
{
cout<<c[i]<<" ";
}
for(int i=1;i<a-d;i++)
{
cout<<c[i]<<" ";
}
cout<<c[a-d];//不要有多余空格
return 0;
}
自测-4 Have Fun with Numbers
题目大意:输入数n,若2*n的积各个位上的数字出现情况(包括出现了哪些数字和数字出现次数)和n的情况相同,则输出“Yes”,否则输出“No”。然后在下一行输出2*n。
每个输入包含一个测试用例。每种情况包含一个不超过20位的正整数。
思路:n存入字符数组(便于输入),2*n存入数组(计算时数字为整型)
代码:
#include<iostream>
using namespace std;
int main()
{
char a[100];//存放输入的数
int b[100]={0}/*存放运算后的数*/,
c[100]={0}/*存放进位,用两个变量代替也可*/,
d[10]={0},e[10]={0},/*存放数字情况*/
num1,num2=1;//分别存放两个数字总位数
bool k=1;
for(num1=1;num1<100;num1++)//输入
{
a[num1]=getchar();
if(a[num1]=='\n'){num1--;break;}
d[int(a[num1])-48]++;//每个数字出现的情况
}
for(int j=num1;j>=1;j--)//模拟手算过程
{
b[num2]=(2*(int(a[j])-48))%10+c[num2-1];//因为这里只乘2所以不会出现向前进位后加上后面的进位大于等于10的情况
e[b[num2]]++;
c[num2]=2*(int(a[j])-48)/10;
num2++;
}
if(c[num2-1]>0)
{
b[num2]=1;
e[b[num2]]++;
}
else num2--;
for(int j=0;j<=9;j++)
{
if(d[j]!=e[j])//判断情况是否相同
{
k=0;
break;
}
}
if(k==1)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
for(int j=num2;j>=1;j--)
{
cout<<b[j];
}
return 0;
}
自测-5 Shuffling Machine
思路:初始化牌面时利用数字规律。
代码:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int number,a[55]={0},num1[56]={0},num2[56]={0};
char b[56]={'k'},c[56]={'k'};
cin>>number;
for(int i=1;i<=54;i++)
{
cin>>a[i];
}
for(int i=1;i<=54;i++) //初始化牌面
{
char s[5]={'S','H','C','D','J'};
b[a[i]]=s[(i-1)/13];
num1[a[i]]=(i-1)%13+1;
}
for(int i=1;i<=number-1;i++)
{
for(int j=1;j<=54;j++)
{
c[a[j]]=b[j];
num2[a[j]]=num1[j];
}
strcpy(b,c);
memcpy(num1,num2,sizeof(num1));
}
for(int i=1;i<=53;i++)
{
cout<<b[i]<<num1[i]<<" ";
}
cout<<b[54]<<num1[54];
return 0;
}