2022秋 | PTA编程训练(一)
目录
1.素数对猜想
2.数组元素循环右移问题
3.水仙花数
4.找出不是两个数组共有的元素
5.找鞍点
6.验证“哥德巴赫猜想”
7.黑洞数
8.装箱问题
9.IP地址转换
10.龟兔赛跑
1.素数对猜想
题目详情:
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数
N(<105),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数
N。
输出格式:
在一行中输出不超过
N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
代码及解析如下:
#include
#define P 100000
int isprime(int ); //判断一个数是否为素数
int a[P]; //存放N以内的素数
int main(){int count=0; //计数器,计算素数对的个数int i=0,j=0; int N=0;scanf("%d",&N);for(i=0;i<=N;i++){if(isprime(i)){ //a[j++]=i; //将N以内的素数放到数组里}}for(i=0;i
2.数组元素循环右移问题
题目详情:
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯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
代码及解析如下:
#include
#define P 100
int main(){int N=0,M=0; //N数组元素个数,M循环右移次数scanf("%d %d",&N,&M);int a[P];int i=0;for(i=0;i=0;j--){ a[j+1]=a[j]; }//上面的循环结束后,j=-1,+1后把临时拷贝的a[n-1]赋进去,完成该次循环右移a[j+1]=temp; }for(i=0;i
3.水仙花数
题目详情:
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
代码及解析如下:
#include
int p(int ,int ); //定义函数计算N次幂
int main(){int N; //输入N位数scanf("%d",&N);int mask=1;//定义mask变量,可以算出N位数的起始区间for(int i=0;i
4.找出不是两个数组共有的元素
题目详情:
给定两个整型数组,本题要求找出不是两者共有的元素。
输入格式:
输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。
输出格式:
在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。
输入样例:
10 3 -5 2 8 0 3 5 -15 9 100
11 6 4 8 2 6 -5 9 0 100 8 1
输出样例:
3 5 -15 6 4 1
代码及解析如下:
#include
#define P 100
int main(){int a[P],b[P];int N,M,i,j;scanf("%d",&N);for(i=0;i
5.找鞍点
题目详情:
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
输入样例:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
输出样例 :
2 1
代码及解析如下:
#include
#define P 100
int main(){int a[P][P];int n;scanf("%d",&n);int i,j;for(i=0;i=a[i][b]){ //先找到每行上最大的数a[i][b]b=j;}}temp=1;for(k=0;k
6.验证“哥德巴赫猜想”
题目详情:
数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。
输入格式:
输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。
输出格式:
在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。
输入样例:
24
输出样例:
24 = 5 + 19
代码及解析如下:
#include
int p(int );
int main(){long long n; //题目说20亿以内,所以整数要定义的足够大scanf("%d",&n);int i;for(i=2;i
补:long/int型的范围 -2147483648()~~~2147483647(
)
long long型的范围-9223372036854775808()~~~9223372036854775807(
)
7.黑洞数
题目详情:
黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。
任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。)
例如,对三位数207:
- 第1次重排求差得:720 - 27 = 693;
- 第2次重排求差得:963 - 369 = 594;
- 第3次重排求差得:954 - 459 = 495;
以后会停留在495这一黑洞数。如果三位数的3个数字全相同,一次转换后即为0。
任意输入一个三位数,编程给出重排求差的过程。
输入格式:
输入在一行中给出一个三位数。
输出格式:
按照以下格式输出重排求差的过程:
序号: 数字重排后的最大数 - 重排后的最小数 = 差值
输入样例:
123
输出格式:
1: 321 - 123 = 198
2: 981 - 189 = 792
3: 972 - 279 = 693
4: 963 - 369 = 594
5: 954 - 459 = 495
代码及解析如下:
#include
int p(int );
int q(int );
int main(){int n,p=1;scanf("%d",&n); //输入某一个三位数数int n1,n2;while(1){int i,j,k,t;i=n%10; j=n/10%10;k=n/100; //把该三位数的各位数分别取出来if(i
8.装箱问题
题目详情:
假设有N项物品,大小分别为s1、s2、…、si、…、sN,其中si为满足1≤si≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。装箱方法是:对每项物品, 顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。
输入格式:
输入第一行给出物品个数N(≤1000);第二行给出N个正整数si(1≤si≤100,表示第i项物品的大小)。
输出格式:
按照输入顺序输出每个物品的大小及其所在的箱子序号,每个物品占1行,最后一行输出所需的箱子数目。
输入样例:
8
60 70 80 90 30 40 10 20
输出样例:
60 1
70 2
80 3
90 4
30 1
40 5
10 1
20 2
5
代码及解析如下:
#include
#define P 1001
int main(){int n;scanf("%d",&n); //输入物品个数int a[P],b[P]; //数组a用力存放物品的大小,数组b用来表示每个箱子存了多大的东西int i,j;for(i=0;i
9.IP地址转换
题目详情:
一个IP地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。
输入格式:
输入在一行中给出32位二进制字符串。
输出格式:
在一行中输出十进制格式的IP地址,其由4个十进制数组成(分别对应4个8位的二进制数),中间用“.”分隔开。
输入样例:
11001100100101000001010101110010
输出样例:
204.148.21.114
代码及解析如下:
//题目中说是32位IP地址,远远超出整形变量的取值范围
//所以不能定义整型变量来做,应考虑数组#include
int f(char *);
int main(){char a[4][8]; //IP地址分为四节,每节8个二进制数,所以定义一个4*8的二维数组for(int i=0;i<4;i++){scanf("%s",a[i]); //输入二维数组}int n1=f(a[0]);int n2=f(a[1]);int n3=f(a[2]);int n4=f(a[3]);printf("%d.%d.%d.%d",n1,n2,n3,n4);return 0;
}
int f(char *b){ //二进制转十进制int sum=0; int n=128; //2的7次方for(int i=0;i<8;i++){sum+=(b[i]-'0')*n; //b[i]是字符型,减‘0’为当前的整形二进制n/=2; //将该位上的二进制数从高到低乘上该位的位权} //得到的就是十进制数return sum;}
10.龟兔赛跑
题目详情:
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?
输入格式:
输入在一行中给出比赛时间T(分钟)。
输出格式:
在一行中输出比赛的结果:乌龟赢输出
@_@,兔子赢输出^_^,平局则输出-_-;后跟1空格,再输出胜利者跑完的距离。
输入样例:
242
输出样例:
@_@ 726
代码及解析如下:
#include
int main(){int t,n=0,m=0; //n乌龟前进米数,m兔子前进米数scanf("%d",&t);int i;int count=0; //计算兔子休息的时间for(i=0;in&&count<30){ //如果兔子跑了10分钟且超过乌龟且兔子不处于休息状态count++; //兔子开始休息}else if(count==0||count==30){ //如果兔子一直在跑或兔子刚休息结束m+=9;count=0; //休息时间从0开始计数}else count++; //兔子处于休息状态}if(n>m){printf("@_@ %d",n);}else if(m>n){printf("^_^ %d",m);}else{printf("-_- %d",m);}return 0;
}
注: 本栏目所有的题目均来自于学校程序设计课程的平时作业,如果对您有帮助的话,请点赞加关注,有任何不理解的地方也可以在评论区中留言或者私信我哦!
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
