中国大学MOOC-陈越、何钦铭-数据结构-起步能力自测题
作者:互联网
中国大学MOOC-陈越、何钦铭-数据结构-起步能力自测题
文章目录
- 中国大学MOOC-陈越、何钦铭-数据结构-起步能力自测题
- 前言
- 一、自测-1 打印沙漏 (20 分)
- 二、自测-2 素数对猜想 (20 分)
- 三、自测-3 数组元素循环右移问题 (20 分)
- 四、自测-4 Have Fun with Numbers (20 分)
- 五、自测-5 Shuffling Machine (20 分)
- 总结
前言
打算参加最新的一次MOOC上的数据结构课程,所以趁正式开课前把能力测试题给做了。做都做了想着就写一下总结吧,有任何问题都可以留言讨论~一、自测-1 打印沙漏 (20 分)
这道题没什么难度主要是要注意下细节。先计算出实际打印出字符的个数,这里在实现上有两种思路:
- 先用循环直接计算出可以打印出的符号个数
- 计算出沙漏的行数
以金字塔型计算,第n行中字符的个数为: 2 ∗ n − 1 2*n-1 2∗n−1,所以根据等差数列求和得一个金字塔所需总的字符数为 n 2 n^2 n2,那么沙漏的字符数为 2 ∗ n 2 − 1 2*n^2-1 2∗n2−1。
以第一种思路为例:
#include <iostream>
using namespace std;
int main()
{
int num =0;
char character ='\0';
cin>>num>>character;
int numblank =0; //空格数
int tempnum =num-1;
int temp =tempnum;
int i = 1;
for(i =1;true;i++)
{
tempnum=tempnum - (i*2+1)*2;
if(tempnum<0)
{
break;
}
temp = tempnum;
}
i--;
for(int index =i;index>0;index--)
{
int h = index *2+1;
int blanktemp =numblank;
while(blanktemp--)
cout<<' ';
while(h--)
{
cout<<character;
}
cout<<endl;
numblank ++;
}
int blanktemp =numblank;
while(blanktemp--)
cout<<' ';
cout<<character<<endl;
for(int index =1;index<=i;index++)
{
int h = index *2+1;
int blanktemp =numblank;
while(--blanktemp)
cout<<' ';
while(h--)
cout<<character;
cout<<endl;
numblank --;
}
cout << temp<< endl;
return 0;
}
二、自测-2 素数对猜想 (20 分)
这道题是5到题中最简单的,关键是判断一个数是否是素数,素数判断中,只要判断数是否能被比它自身开方还要小的数整除就可以了:
#include <iostream>
#include <math.h>
using namespace std;
bool IsSushu(int a)
{
if (a == 1)
return true;
for (int i = 2; i <= sqrt(a); i++)
{
if (a % i == 0)
{
return false;
break;
}
}
return true;
}
int main()
{
int N = 0;
cin >> N;
int temp = 1;
int temp2 = 0;
int num = 0;
for (int i = 1; i <= N; i++)
{
if (IsSushu(i))
{
temp2 = i;
if (temp2 - temp == 2)
{
num++;
temp = temp2;
}
temp = temp2;
}
}
cout << num;
return 0;
}
三、自测-3 数组元素循环右移问题 (20 分)
循环右移,可以将数列看作一个首位相接的环,因此只要使用双链表的思想,将每一个元素的前一个元素和后一个元素的位置记录下来,剩下的工作只是寻找链表的头节点:
#include <iostream>
using namespace std;
int main()
{
int N = 0; int M = 0;
cin >> N >> M;
int* value = new int[N];
int* pre = new int[N];
int* ne = new int[N];
//int value[100];
for (int i = 0; i < N; i++)
{
cin >> value[i];
pre[i] = i - 1;
ne[i] = i + 1;
if (pre[i] < 0)
pre[i] = N-1;
if (ne[i] > N - 1)
ne[i] = 0;
}
int index =0;
if(M%N !=0)
index = N-(M%N);
for (int i = 0; i < N; i++)
{
cout << value[index];
if(i!=N-1)
cout<<' ';
index = ne[index];
}
delete[] value;
delete[] pre;
delete[] ne;
return 0;
}
四、自测-4 Have Fun with Numbers (20 分)
这道题目要求给出一个小于20位的数字,并将它乘以2,再判断前后两个数字是否是相同的数字组合出的不同数字。
这道题的关键在于20位的数字超出了整数基本类型的长度限制,因此要么设计新的数据结构,要么使用数组。这里我是用了字符串,并用排序来判断两个数字是否满足要求。
#include <iostream>
using namespace std;
string sort(string str)
{
int length = str.length();
for (int i = 0; i < length; i++)
{
for (int j = i; j < length; j++)
{
if (str[i] > str[j])
{
char temp = str[j];
str[j] = str[i];
str[i] = temp;
}
}
}
return str;
}
int main()
{
string origin;
int i = 0;
cin >> origin;
int length = origin.length();
string doubled;
if (origin[0] >= '5')
doubled = string(length + 1,'0');
else
doubled = string(length, '0');
bool Carrying = false;
for (int i =length -1;i>=0;i--)
{
int temp = int(origin[i]-'0') * 2;
temp = temp + Carrying;
doubled[i] = (temp%10 + '0');
Carrying = temp / 10;
}
if (Carrying)
{
for (int i = length; i > 0; i--)
{
doubled[i] = doubled[i - 1];
}
doubled[0] = '1';
}
string o = sort(origin);
string d = sort(doubled);
if (d == o)
cout << "Yes" << endl;
else
cout << "No" << endl;
cout << doubled;
return 0;
}
五、自测-5 Shuffling Machine (20 分)
发牌机,将54张扑克牌机型了编号,S1···J2编号为1~54,并给出一组数字,个数为54,{a1,a2,a3,a4,···,ai,···a54},数字的含义是将第i张牌移动到第ai个位置。并给出了循环次数。
// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <memory.h>
#include <iostream>
using namespace std;
int main()
{
int times;
int number1[54];
int cards[54];//存牌
int number2[54] = {0};//存牌
cin >> times;
int i = 0;
while (i!=54)
{
cards[i] = i + 1;
cin >> number1[i++];
}
for (int t = 0; t < times; t++)
{
int j = 0;
for (auto i : number1)
{
number2[i-1] = cards[j++];
}
int len = sizeof(number2) / sizeof(number2[0]);
memcpy(cards, number2, len * sizeof(int));
j = 0;
}
int count = 0;
int choose = 0;
for (auto i : number2)
{
count++;
choose = i % 13 ? i / 13 : (i / 13) - 1;
if (choose < 0)
choose = 0;
switch (choose)
{
case 0:
cout << 'S';
cout << i-choose*13;
break;
case 1:
cout << 'H';
cout << i - choose * 13;
break;
case 2:
cout << 'C';
cout << i - choose * 13;
break;
case 3:
cout << 'D';
cout << i - choose * 13;
break;
default:
cout << 'J';
cout << i - choose * 13;
break;
}
if(count!= 54)
cout << ' ';
}
return 0;
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
总结
欢迎讨论!标签:MOOC,自测题,temp,int,陈越,++,length,自测,20 来源: https://blog.csdn.net/Mr_Linzn/article/details/113837076