题目

  • 打印沙漏
  • 素数对猜想
  • 数组元素循环右移问题
  • Have Fun with Numbers
  • Shuffling Machine

题源

打印沙漏

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

************
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

************
*****
2

思路:(倒三角形)每行个数满足高中所学的等差数列的规律(样例):5,3,1;由求和公式得Sn=n2,下面那一部分刚好为n2-1;所以给定符号使用个数为(2n2-1),做题时沙漏的上半部分(倒三角形)和下半部分(梯形)分开输出就很好写了

#include <bits/stdc++.h>
using namespace std;
char c;
int n;
int main() {scanf("%d %c",&n,&c);int x=1;while(x++){//x:行 if(2*x*x-1>n){//如果大于,减一 x--;break;}else if(2*x*x-1==n){//如果刚好等于就不需要 break;}}int ans=n-(2*x*x-1);//未输出的字符数 int k=0;for(int i=x;i>0;i--){//上半部分 for(int j=k;j>0;j--)printf(" ");for(int ii=(2*i-1);ii>0;ii--)printf("%c",c);printf("\n");k++;}k-=2;for(int i=2;i<=x;i++){//下半部分 for(int j=k;j>0;j--)printf(" ");for(int ii=(2*i-1);ii>0;ii--)printf("%c",c);printf("\n");k--;}printf("%d",ans);return 0;
}

素数对猜想

让我们定义d​n为:d​n=p​n+1−p​n,其中p​i是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N(<10​5),请计算不超过N的满足猜想的素数对的个数。

输入格式:
输入在一行给出正整数N。

输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。

输入样例:
20
输出样例:
4

#include <bits/stdc++.h>
using namespace std;
//设0为素数  1为非素数
int visit[100005]={0};//访问每个位置,判断
int prime[100005]={0};//储存
int Prime(int x){int n=0;for(int i=2;i<=x;i++){if(!visit[i])prime[n++]=i;for(int j=0;j<n&&i*prime[j]<=x;j++){visit[i*prime[j]]=1;if(i%prime[j]==0) break;}}return n; //记录找到了多少个素数 +1
}
int main() {int n,sum,ans=0;scanf("%d",&n);sum=Prime(n);for(int i=0;i<sum-1;i++){if(prime[i+1]-prime[i]==2) ans++;}printf("%d",ans);return 0;
}

此查找素数的方法法详情见欧拉筛法

数组元素循环右移问题

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0 A1⋯AN−1)变换为(A​N−M⋯A​N−1 A​0 A1⋯AN−M−1​​ )(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
注意:题目没说m的范围是否大于n所以还要考虑m>n的情况
之前有提到过j=(j+1)%n;是一种循环数组的写法,很好用,在1748:约瑟夫问题里面

#include <bits/stdc++.h>
using namespace std;
int a[110],n,m;
int main() {cin>>n>>m;for(int i=0;i<n;i++){cin>>a[i];}if(m>n) m%=n; int j=n-m;j=j%n;for(int i=0;i<n;i++){if(i!=(n-1)) printf("%d ",a[j]);else printf("%d",a[j]);j=(j+1)%n;}return 0;
}

Have Fun with Numbers

Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, with no duplication. Double it we will obtain 246913578, which happens to be another 9-digit number consisting exactly the numbers from 1 to 9, only in a different permutation. Check to see the result if we double it again!

Now you are suppose to check if there are more numbers with this property. That is, double a given number with k digits, you are to tell if the resulting number consists of only a permutation of the digits in the original number.

Input Specification:
Each input contains one test case. Each case contains one positive integer with no more than 20 digits.

Output Specification:
For each test case, first print in a line “Yes” if doubling the input number gives a number that consists of only a permutation of the digits in the original number, or “No” if not. Then in the next line, print the doubled number.

Sample Input:
1234567899
Sample Output:
Yes
2469135798
大致翻译:请注意,数字123456789是一个9位数字,完全由1到9的数字组成,没有重复。加倍后我们将得到246913578,这恰好是另一个9位数字,正好由1到9的数字组成,只是排列不同。如果我们再加倍的话,检查一下结果!现在假设您要检查是否有更多具有此属性的数字。也就是说,用k个数字把给定的数字加倍,你要知道结果数字是否只由原来数字中的数字排列组成。输入规范:每个输入包含一个测试用例。每个大小写包含一个不超过20位的正整数。输出规格:对于每个测试用例,如果输入的数字加倍,则首先打印一行“是”,给出一个仅由原始数字中的数字排列组成的数字,如果不是,则打印“否”。然后在下一行中,打印加倍的数字。

#include <bits/stdc++.h>
using namespace std;
int a[25],ch[25],ans[25]={0};
char c[25];
int main() {scanf("%s",c);int len=strlen(c);//字符串长度 for(int i=0;i<len;i++)a[len-i-1]=c[i]-'0';//将字符串里的数字分别存放在数组中 for(int i=0;i<len;i++){//输入数字*2后的结果用ans数组存起来 ans[i]+=a[i]*2;ans[i+1]=ans[i]/10;ans[i]%=10;}int flag=1;//标记判断结果,假设成立,1:yes,0:no if(ans[len]){//长度不匹配直接判断错误 flag=0;len++;}else{memcpy(ch,ans,sizeof(ans));sort(a,a+len);//将数组从小到大排列这样就可以判断拥有元素是否一致 sort(ch,ch+len);for(int i=0;i<len;i++)if(a[i]!=ch[i]){flag=0;break;}}if(flag){cout<<"Yes"<<endl;for(int i=len-1;i>=0;i--) cout<<ans[i];}else{cout<<"No"<<endl;for(int i=len-1;i>=0;i--) cout<<ans[i];} return 0;
}

Shuffling Machine

Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffling techniques are seen as weak, and in order to avoid “inside jobs” where employees collaborate with gamblers by performing inadequate shuffles, many casinos employ automatic shuffling machines. Your task is to simulate a shuffling machine.

The machine shuffles a deck of 54 cards according to a given random order and repeats for a given number of times. It is assumed that the initial status of a card deck is in the following order:

S1, S2, …, S13,
H1, H2, …, H13,
C1, C2, …, C13,
D1, D2, …, D13,
J1, J2
where “S” stands for “Spade”, “H” for “Heart”, “C” for “Club”, “D” for “Diamond”, and “J” for “Joker”. A given order is a permutation of distinct integers in [1, 54]. If the number at the i-th position is j, it means to move the card from position i to position j. For example, suppose we only have 5 cards: S3, H5, C1, D13 and J2. Given a shuffling order {4, 2, 5, 3, 1}, the result will be: J2, H5, D13, S3, C1. If we are to repeat the shuffling again, the result will be: C1, H5, S3, J2, D13.

Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer K (≤20) which is the number of repeat times. Then the next line contains the given order. All the numbers in a line are separated by a space.

Output Specification:
For each test case, print the shuffling results in one line. All the cards are separated by a space, and there must be no extra space at the end of the line.

Sample Input:
2
36 52 37 38 3 39 40 53 54 41 11 12 13 42 43 44 2 4 23 24 25 26 27 6 7 8 48 49 50 51 9 10 14 15 16 5 17 18 19 1 20 21 22 28 29 30 31 32 33 34 35 45 46 47
Sample Output:
S7 C11 C10 C12 S1 H7 H8 H9 D8 D9 S11 S12 S13 D10 D11 D12 S3 S4 S6 S10 H1 H2 C13 D2 D3 D4 H6 H3 D13 J1 J2 C1 C2 C3 C4 D1 S5 H5 H11 H12 C6 C7 C8 C9 S2 S8 S9 H10 D5 D6 D7 H4 H13 C5
大致翻译:洗牌是一个程序,用于随机一副扑克牌。由于标准洗牌技术被视为薄弱环节,而且为了避免员工通过执行不适当的洗牌来与赌徒合作的“内部工作”,许多赌场采用自动洗牌机。你的任务是模拟洗牌机。这台机器根据给定的随机顺序洗牌一副54张牌,并重复给定的次数。假设卡片组的初始状态按以下顺序排列:S1、S2、…、S13、H1、H2、…、H13、C1、C2、…、C13、D1、D2、…、D13、J1、J2,其中“S”表示“黑桃”,“H”表示“心脏”,“C”表示“俱乐部”,“D”表示“钻石”,“J”表示“小丑”。给定的顺序是[1,54]中不同整数的排列。如果第i个位置的数字是j,则表示将卡从位置i移动到位置j。例如,假设我们只有5张卡:S3、H5、C1、D13和J2。给定洗牌顺序{4,2,5,3,1},结果将是:J2,H5,D13,S3,C1。如果我们再次重复洗牌,结果将是:C1,H5,S3,J2,D13。输入规范:每个输入文件包含一个测试用例。对于每种情况,第一行包含一个正整数K(≤20),即重复次数。下一行包含给定的顺序。一行中的所有数字都用空格隔开。输出规格:对于每个测试用例,在一行中打印洗牌结果。所有的牌都用空格隔开,行尾不能有多余的空格。
思路:首先寻找摆放牌的规律:
用一个数组存花色这样输出的时候会方便许多,牌的数字前面几组都是从1–13,所以可以用mod13的方法得到相对应的花色和数字;
注意:(i-1)%13+1这步不能写成i%13因为牌的数字是从1–13,不存在0的可能
数组从1开始到54会方便一些,因为输出的牌序号是从1–54
行尾不要有多余的空格

#include <bits/stdc++.h>
using namespace std;
char c[5]={'S','H','C','D','J'};//存花色,注意这里数组下标从0开始
int s[60],then[60],e[60];
int main() {int k;cin>>k;for(int i=1;i<=54;i++) s[i]=i;//初始顺序 for(int i=1;i<=54;i++){cin>>then[i];}while(k--){fill(e,e+60,0);//清空数组 更合理一些for(int i=1;i<=54;i++)e[then[i]]=s[i];memcpy(s,e,sizeof(e));//为了下次牌的排序做准备}for(int i=1;i<=54;i++){char ans=c[(e[i]-1)/13];//对应花色printf("%c%d",ans,(e[i]-1)%13+1);if(i<54) printf(" ");}return 0;
}

PTA:起步能力自测题~相关推荐

  1. 5008.工程师职场能力自测评估

    5008.工程师职场能力自测评估 本套自测评估题目共30题,没有标准答案. 通过自测评估会让你发现自己的优点,通过 有些评估会让你发现自己的不足,有些评估 结果你需要自己保密-- 祝愿:希望在做过这套 ...

  2. 《软件方法》第六章 自测题

    UMLChina软件方法各章练习题自测(六) 关于UMLChina 前言 温习回顾 <软件方法>第六章自测题 自测题1 关于UMLChina 前言 笔者为在校大三生,初次接触UML建模语言 ...

  3. 赛码行测题库_行测题库

    热文推荐 歩知公考资讯网整理了国家公务员考试历年真题及答案汇总,还原试卷内容,并附以经典解析,帮助考生快速了解国家公务员考试题型及考察要点.[全文] 行测题库提供2016年新疆公务员考试图形推理每日精 ...

  4. 证券期货业必须利用计算机系统,继续教育——创新课程学习自测题及参考答案(单项选择及判断题)...

    继续教育(公需科目) "专业技术人员创新能力"学习自测题及参考答案 一.单项选择题 1.桌子上放着12枚钱币,每边摆四个刚好摆完,现要将他们重新摆放,使每边摆5个硬币,你以为能吗? ...

  5. 【计算机网络自顶向下】计算机网络期末自测题(一)答案

    2019-2020 学年第2 学期自测题答案及评分标准 (卷 1) 计算机网络 一. 填空题: 参考答案: 1 .  01000101 .11100111 3 .  100Mbps.双绞线.基带.全双 ...

  6. 计算机基础知识-自测题

    自测题 自计算机问世至今已经经历了四个时代,划分时代的主要依据是计算机的( ). A.规模 B.功能 C.性能 D.构成元件 一般认为,世界上第一台电子数字计算机诞生于( ). A.1946年 B.1 ...

  7. 2020辽宁国家公务员考试行测题库:行测片段阅读模拟题8.14

    行测题库:行测片段阅读模拟题 1.长期以来,食品安全问题之所以屡打屡犯,层出不穷,以至于民众人心惶惶,甚至惊呼 "找不到可以放心吃的东西",重要原因之一,在于法律发力不够,惩处力度 ...

  8. 2013河北省职称计算机应用能力考试操作题答案,2013河北省职称计算机应用能力考试操作题步骤详解(部分).doc...

    2013河北省职称计算机应用能力考试操作题步骤详解(部分) 2013河北省职称计算机应用能力考试操作题步骤详解PAGE PAGE - 11 - 共 NUMPAGES 11页操作题PPT 1-5PPT操 ...

  9. 2019计算机原理及应用期末自测题,微机原理期末自测题答案.ppt

    微机原理期末自测题答案.ppt 一.基本概念与术语 1.8086是( )位计算机.8086地址线有( )条,可直接寻址的空间最大为( ). 2.总线周期是指( ).基本总线周期有( )T状态.Tw状态 ...

最新文章

  1. C语言回溯算法解决N皇后问题
  2. 1080Ti 就搞定最新 SOTA 模型?一个普通研究生勇敢发毕业论文引起热议
  3. 华为OJ 名字美丽度
  4. tableau可视化函数使用案例(四十六)-数字函数的使用方法
  5. openstack rocky 安装_北京暖气安装费用-上海装修报价
  6. php post请求后端拿不到值_PHP Post获取不到非表单数据的问题解决办法
  7. phaser java_死磕 java同步系列之Phaser源码解析
  8. android手机可以设置屏幕锁定,安卓手机屏幕锁设置方法(九个点图案)
  9. 听我讲完GET、POST原理,面试官给我倒了杯卡布奇诺
  10. siteminder sso agent 初探
  11. 网络数据校验随笔(1)
  12. 从氨基酸到大分子(蛋白质、核酸)
  13. const char *p;和char * const p的区别
  14. 数字化是实现“跨界打劫”的超级武器
  15. 如何用matlab求解多变量非线性回归,matlab多元非线性回归教程
  16. Android 插件化换肤方案
  17. 视频教程-新版华为HCIA数通(路由与交换)课程-华为认证
  18. delphi 整理的常用函数
  19. vbs和java有关系吗_Java程序员所需的批处理和VBS脚本 (转载)
  20. OA协同办公系统存在的意义是什么?

热门文章

  1. stun检查nat类型
  2. CSDN设置“关注博主即可阅读全文”方法
  3. Flash存储芯片如何存储数据的?
  4. arcgis中央经线怎么变成109.5度
  5. android人脸检测开发——百度大脑离线识别SDK
  6. 奥升德 (Ascend) 宣布在中国的首次收购
  7. qt repaint 用法_Qt重绘之update,repaint详解
  8. 51单片机之点亮第一个LED
  9. PostgreSQL编写记录删除表格信息的Extension扩展
  10. python 读写ini文件