中国大学MOOC-陈越、何钦铭-数据结构-起步能力自测题(c++实现)

自测-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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值