一、单选 十五道(部分取自pta 2023~24高级语言程序设计I客观题练习)
二、填空题 七道(部分取自pta 2023~24高级语言程序设计I客观题练习)
三、编程题 四道(下面是可能考题)
1.取数字
1.1:进制转化
将十进制整数转换成k(2≤k≤16)进制数。注意,10~15分别用字母A、B、C、D、E、F表示。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入两个整数n和k。
输出格式:
对于每组测试,先输出n,然后输出一个空格,最后输出对应的k进制数。
输入样例:
4
5 3
123 16
0 5
-12 2
输出样例:
5 12
123 7B
0 0
-12 -1100
参考代码:
#include <stdio.h>
int main(){
int n; //测试组数
scanf("%d", &n);
int arr[100];
int integer,k; //整数 进制
int count; //记录位数
for(int i=1;i<=n;i++){ //测试组数
count=0; //每组测试将位数初始化
scanf("%d %d", &integer, &k);
if(integer == 0){ //输入的整数为0时
printf("%d 0\n", integer);
continue;
}
printf("%d ", integer);
int inte;
int p=0; //数组下标
if(integer<0){
printf("-"); //输入负号
integer=-integer;
}
while(integer>0){ //拆分
count++;
inte=integer;
inte%=k; //余数
arr[p]=inte; //余数储存到数组中
integer/=k; //商
p++;
}
for(int j=count-1;j>=0;j--){ //结果输出
if(arr[j]>=10){ //10~15分别用字母A、B、C、D、E、F表示
switch(arr[j]){
case 10:
printf("A");
break;
case 11:
printf("B");
break;
case 12:
printf("C");
break;
case 13:
printf("D");
break;
case 14:
printf("E");
break;
case 15:
printf("F");
break;
}
}
else{
printf("%d", arr[j]);
}
}
printf("\n");
}
return 0;
}
1.2:水仙花数
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
参考代码:
#include<stdio.h>
#include<math.h>
int main(){
int n;
scanf("%d",&n);
for(int i=pow(10,n-1);i<=pow(10,n)-1;i++){
int sum=0;
int temp=i;
while(sum<=i && temp!=0){
int every=1;
int mod=temp % 10;
for(int j=1;j<=n;j++){
every*=mod;
}
sum+=every;
temp/=10;
}
if(sum==i){
printf("%d\n",i);
}
}
return 0;
}
1.3:字符串转换为整数
题目描述
输入一串字符“a12b345c”,将其中的数字字符转换为整数12345。
输入格式:
输入一串字符,长度小于10。
输出格式:
输出相应的整型数据。
输入样例:
在这里给出一组输入。例如:
a01c2b345c
输出样例:
在这里给出相应的输出。例如:
12345
参考代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
int main() {
char input[10];
int result = 0;
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = '\0';
int count=0,v;
for (int i = 0; i < strlen(input); ++i) {
v=isdigit(input[i]);
if (v) {
count++;
}
}
for (size_t i = 0; i < strlen(input); ++i) {
if (input[i] >= '0' && input[i] <= '9') {
result += (input[i] - '0') * pow(10,count-1);
count--;
}
}
printf("%d\n", result);
return 0;
}
2.求素数
2.1:判断素数
本题的目标很简单,就是判断一个给定的正整数是否素数。
输入格式:
输入在第一行给出一个正整数N
(≤ 10),随后N
行,每行给出一个小于231的需要判断的正整数。
输出格式:
对每个需要判断的正整数,如果它是素数,则在一行中输出Yes
,否则输出No
。
输入样例:
2
11
111
输出样例:
Yes
No
参考代码:
#include<stdio.h>
#include<math.h>
int isPrime(int n)
{
int i;
int flag=1;
if(n==1) flag=0;
else{
for(i=2;i<=sqrt(n);i++){
if(n%i==0){
flag=0;
break;
}
}
}
return flag;
}
int main()
{
int N;
int n;
int i;
scanf("%d",&N);
for(i=1;i<=N;i++){
scanf("%d",&n);
if(isPrime(n)) printf("Yes\n");
else printf("No\n");
}
return 0;
}
2.2:求素数
输入一个正整数n。判断2到n中有那些素数。输出的每一个素数占一行。
注意:请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
数据范围:
2<=n<=100000
输入格式:
输入一个正整数m。
输出格式:
输出素数,一行输出一个素数。
输入样例:
在这里给出一组输入。例如:
7
输出样例:
在这里给出相应的输出。例如:
2
3
5
7
参考代码:
#include<stdio.h>
int main(){
int m,i,j;
scanf("%d",&m);
for(i=2;i<=m;i++){
for(j=2;j<=i;j++){
if(i%j==0){
break;
}
}
if(i==j){
printf("%d\n",i);
}
}
return 0;
}
2.3:哥德巴赫猜想
哥德巴赫猜想:任何大于2的偶数可以分成两个素数之和(例如18=11+7),请验证哥德巴赫猜想。
编程提示:设偶数为n,将n分解成n1和n2且n=n1+n2,显然n1最大为n/2。
首先判断n1是否为素数,如果是,再判断n2是否为素数,如果是输出n=n1+n2。
输入格式:
输入一个偶数。
输出格式:
输出n=n1+n2的形式,如果有多个,一行输出一个。
输入样例:
在这里给出一组输入。例如:
44
输出样例:
在这里给出相应的输出。例如:
44=3+41
44=7+37
44=13+31
参考代码:
#include<stdio.h>
int main(){
int n,n1,n2,i,j,sum;
scanf("%d",&n);
for(i=2;i<=n/2;i++){
sum=0;
n1=i;
for(j=2;j<=n1;j++){
if(n1%j==0){
break;
}
}
if(n1==j){
sum+=n1;
}
else{
continue;
}
n2=n-i;
for(j=2;j<=n2;j++){
if(n2%j==0){
break;
}
}
if(n2==j){
sum+=n2;
}
else{
continue;
}
if(n==sum){
printf("%d=%d+%d\n",sum,n1,n2);
}
}
return 0;
}
3.求最值
3.1:找出最小值
本题要求编写程序,找出给定一系列整数中的最小值。
输入格式:
输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔。
输出格式:
在一行中按照“min = 最小值”的格式输出n个整数中的最小值。
输入样例:
4 -2 -123 100 0
输出样例:
min = -123
参考代码:
#include<stdio.h>
int main()
{
int n;
scanf("%d ",&n);
int a[100] = {0};
int i = 0;
for (i = 0;i < n;i++){
scanf("%d",&a[i]);
}
int min = a[0];
for (i = 0;i < n;i++){
if (a[i] < min){
min = a[i];
}
}
printf("min = %d",min);
}
3.2:求最大字符串
题目描述
输入4个字符串,求最大字符串。
输入格式:
输入4个字符串,长度小于20。
输出格式:
输出最大字符串。
输入样例:
在这里给出一组输入。例如:
apple
banana
pear
orange
输出样例:
在这里给出相应的输出。例如:
pear
参考代码:
#include<stdio.h>
#include<string.h>
int main(){
int i,j;
char name[4][20];
char temp[2][100];
for (i=1;i<=4;i++)
scanf("%s",&name[i]);
strcpy(temp[1],name[1]);
for (i = 1; i < 4; i++)
if(strcmp(temp[1],name[i])<0)
strcpy(temp[1],name[i]);
printf("%s\n",temp[1]);
return 0;
}
3.3:找最长的字符串
本题要求编写程序,针对输入的N个字符串,输出其中最长的字符串。
输入格式:
输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。
输出格式:
在一行中用以下格式输出最长的字符串:
The longest is: 最长的字符串
如果字符串的长度相同,则输出先输入的字符串。
输入样例:
5
li
wang
zhang
jin
xiang
输出样例:
The longest is: zhang
参考代码:
#include<stdio.h>
#include<string.h>
int main(){
int N,n,max=0,t=0;
scanf("%d",&N);
char num[N][100];
int num1[N]; //保存各个字符串的长度
for(int i=0;i<N;i++){
scanf("%s",num[i]);
num1[i]=strlen(num[i]);
if(max<num1[i]){
max=num1[i];
t=i;
}
}
printf("The longest is: %s",num[t]);
return 0;
}
3.4:找鞍点
题目描述
找出二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小。也有可能没有鞍点。
输入格式:
输入4行4列的整型二维数组。
输出格式:
若有鞍点,输入鞍点以及其位置;若没有鞍点,输出“It is not exist!”。
输入样例1:
在这里给出一组输入。例如:
2 3 9 5
6 7 8 3
0 5 7 5
2 1 8 3
输出样例1:
在这里给出相应的输出。例如:
a[2][2]=7
输入样例2:
在这里给出一组输入。例如:
2 3 9 5
6 7 8 3
1 5 6 7
2 1 8 3
输出样例2:
在这里给出相应的输出。例如:
It is not exist!
参考代码:
#include <stdio.h>
#define ROWS 4
#define COLS 4
int main() {
int a[ROWS][COLS];
int i, j, k;
int maxRow[ROWS], minCol[COLS];
// 输入二维数组
for (i = 0; i < ROWS; ++i) {
for (j = 0; j < COLS; ++j) {
scanf("%d", &a[i][j]);
}
}
// 找出每一行的最大值和每一列的最小值
for (i = 0; i < ROWS; ++i) {
maxRow[i] = a[i][0];
for (j = 1; j < COLS; ++j) {
if (a[i][j] > maxRow[i]) {
maxRow[i] = a[i][j];
}
}
}
for (j = 0; j < COLS; ++j) {
minCol[j] = a[0][j];
for (i = 1; i < ROWS; ++i) {
if (a[i][j] < minCol[j]) {
minCol[j] = a[i][j];
}
}
}
// 检查是否存在鞍点
int found = 0;
for (i = 0; i < ROWS && !found; ++i) {
for (j = 0; j < COLS && !found; ++j) {
if (maxRow[i] == a[i][j] && minCol[j] == a[i][j]) {
printf("a[%d][%d]=%d\n", i, j, a[i][j]);
found = 1;
}
}
}
// 如果没有找到鞍点,则输出“It is not exist!”
if (!found) {
printf("It is not exist!\n");
}
return 0;
}
4.找完数
4.1:求完数
一个数如果恰好等于它的因子之和,这个数称为“完数”。例如6的因子分别为 1、2、3,而6=1+2+3,因此6是“完数”。编程序找出制定正整数之内所有完数并输出。
编程提示:根据完数的定义可知,将一个数因式分解,所有因子之和等于该数即为完数。
输入格式:
输入一个正整数。
输出格式:
输出完数,一行输出一个完数。
输入样例:
在这里给出一组输入。例如:
1000
输出样例:
在这里给出相应的输出。例如:
6
28
496
参考代码:
#include <stdio.h>
int main() {
int n, num, sum;
scanf("%d", &n);
for (num = 1; num <= n; num++) {
sum = 0;
for (int i = 1; i < num; i++) {
if (num % i == 0) {
sum += i;
}
}
if (sum == num) {
printf("%d\n", num);
}
}
return 0;
}
4.2:找完数
所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。
输入格式:
输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。
输出格式:
逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。
输入样例:
2 30
输出样例:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
参考代码:
#include <stdio.h>
#include <math.h>
int main()
{
int m, n;
int i, j, k;
int s, p, flag = 0;
scanf("%d %d", &m, &n);
for (i = m; i <= n; i++){
s = 0;
for (j = 1; j <= i / 2; j++){
if (i % j == 0)
s += j;
}
if (s == i){
flag = 1;
printf("%d = ", i);
p = 0;
for (j = 1; j <= i / 2; j++){
if (i % j == 0){
p += j;
if (p != i)
printf("%d + ", j);
else
printf("%d\n", j);
}
}
}
}
if (flag == 0)
printf("None\n");
return 0;
}
5.斐波那契数列
斐波那契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……。在数学上,斐波纳契数列以递推的方法定义为:F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N)。计算斐波那契数列第n项的值。
输入格式:
输入一个大于等于1,小于等于60的整数n。
输出格式:
输出第n项的数列值,数列值为double类型,不输出小数位数。
输入样例:
20
输出样例:
6765
输入样例:
1
输出样例:
1
参考代码:
#include <stdio.h>
double fun(int n)
{
double a[61];
int i;
a[1]=1;a[2]=1;
for(i=3;i<=n;i++)
a[i]=a[i-1]+a[i-2];
return a[n];
}
int main()
{
int n;
scanf("%d",&n);
printf("%.0f\n",fun(n));
return 0;
}
6.序列求和
6.1:求N分之一序列前N项和
本题要求编写程序,计算序列 1 + 1/2 + 1/3 + ... 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。
输入样例:
6
输出样例:
sum = 2.450000
参考代码:
#include <stdio.h>
int main() {
int N;
double sum = 0.0;
scanf("%d", &N);
for (int i = 1; i <= N; i++) {
sum += 1.0 / i;
}
printf("sum = %f",sum);
return 0;
}
6.2:求简单交错序列前N项和
本题要求编写程序,计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后三位。题目保证计算结果不超过双精度范围。
输入样例:
10
输出样例:
sum = 0.819
参考代码:
#include<stdio.h>
int main(){
int N,S=1;
double sum = 0;
scanf("%d",&N);
for (int i = 0;i < N;i++){
sum += S * 1.0 / (3 * i + 1);
S = -S;
}
printf("sum = %.3lf",sum);
return 0;
}
6.3:求分数序列前N项和
本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例:
20
输出样例:
32.66
参考代码:
#include <stdio.h>
int main()
{
int N;
double fenzi=2;
double fenmu=1;
double sum=0.0;
scanf("%d",&N);
for(int i=1;i<=N;i++){
double item=fenzi/fenmu;
sum+=item;
fenzi=fenzi+fenmu;
fenmu=fenzi-fenmu;
}
printf("%.2lf\n",sum);
return 0;
}
6.4:求幂级数展开的部分和
已知函数ex可以展开为幂级数1+x+x*2/2!+x*3/3!+⋯+x*k/k!+⋯。现给定一个实数x,要求利用此幂级数部分和求ex的近似值,求和一直继续到最后一项的绝对值小于0.00001。
输入格式:
输入在一行中给出一个实数x∈[0,5]。
输出格式:
在一行中输出满足条件的幂级数部分和,保留小数点后四位。
输入样例:
1.2
输出样例:
3.3201
参考代码:
#include<stdio.h>
#include<math.h>
int main(){
float x,e=1.0,sum=1.0;
scanf("%f",&x);
for(int i=1;i<100;i++){
sum *= x/(float)i;
e += sum;
if(sum<0.00001)
break;
}
printf("%.4f",e);
return 0;
}
7.排序(必考)
7.1:冒泡法排序
将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。
本题要求对任意给定的K(<N),输出扫描完第K遍后的中间结果数列。
输入格式:
输入在第1行中给出N和K(1≤K<N≤100),在第2行中给出N个待排序的整数,数字间以空格分隔。
输出格式:
在一行中输出冒泡排序法扫描完第K遍后的中间结果数列,数字间以空格分隔,但末尾不得有多余空格。
输入样例:
6 2
2 3 5 1 6 4
输出样例:
2 1 3 4 5 6
参考代码:
#include<stdio.h>
void bubbling(int arr[],int k,int n){
while(k--){
for(int i=0;i<n-1;i++){
if(arr[i]>arr[i+1]){
int temp=arr[i+1];
arr[i+1]=arr[i];
arr[i]=temp;
}
}
}
return ;
}
int main(){
int n,k;
while(scanf("%d %d",&n,&k)!=2);
int arr[n];
for(int i=0;i<n;i++){
while(scanf("%d",&arr[i])!=1);
}
bubbling(arr,k,n);
for(int i=0;i<n;i++){
printf("%d",arr[i]);
if(i!=n-1){
printf(" ");
}
}
return 0;
}
7.2:利用选择法进行排序
题目描述
本题要求将给定的n个整数从大到小排序后输出。
输入格式:
输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。
输入样例:
在这里给出一组输入。例如:
5
3 5 6 1 2
输出样例:
在这里给出相应的输出。例如:
6 5 3 2 1
参考代码:
#include<stdio.h>
int main(){
int n,i,j;
int arr[100]={0};
while(scanf("%d",&n)!=1);
for(i=1;i<=n;i++){
while(scanf("%d",&arr[i])!=1);
}
for(i=1;i<=n;i++){
for(j=i+1;j<=n;j++){
int t;
if(arr[i]>arr[j]){
t=arr[j];
arr[j]=arr[i];
arr[i]=t;
}
}
}
for(j=n;j>=1;j--){
printf("%d",arr[j]);
if(j!=1){
printf(" ",arr[j]);
}
}
return 0;
}
7.3 :选看
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAXSIZE 10
//int count;
void initarr(int arr[],int length){
for(int i=0;i<length;i++){
arr[i]=rand()%10;//rand()是一个函数
}//它会返回一个在[0, RAND_MAX]之间的随机整数
}
void showarr(int arr[],int length){
for(int i=0;i<length;i++){
printf("%d ",arr[i]);
}
printf("\n-------------------------\n");
}
//冒泡排序
void bubbling(int arr[],int length){
int flag=1;
//count=0;
while(length-- && flag){
flag=0;
for(int i=0;i<length;i++){
//count++;
if(arr[i]>arr[i+1]){
flag = 1;
int temp=arr[i+1];
arr[i+1]=arr[i];
arr[i]=temp;
}
}
}
}
//选择排序
void select(int arr[],int length){
//count=0;
for(int i=0;i<length;i++){
int k=i;
for(int j=i+1;j<length;j++){
//count++;
if(arr[k]>arr[j]){
k=j;
}
}
int temp=arr[i];
arr[i]=arr[k];
arr[k]=temp;
}
}
//插入排序
void insert(int arr[],int length){
//count=0;
for(int i=1;i<length;i++){
for(int j=i;j>=1 && arr[j]<arr[j-1];j--){
//count++;
int temp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
}
}
}
int main(){
srand((unsigned)time(NULL));
//这行代码是用来设置随机数种子的
//srand 是设置种子的函数,它接受一个无符号整数作为参数
//(unsigned)time(NULL) 返回当前时间的秒数
//它被转换为一个无符号整数
//作用是将当前时间作为种子
//以确保随机数生成器的输出是随机的
int arr[MAXSIZE];
initarr(arr,MAXSIZE);
showarr(arr,MAXSIZE);//打印数组
bubbling(arr,MAXSIZE);//冒泡
showarr(arr,MAXSIZE);
//printf("count=%d\n",count);
select(arr,MAXSIZE);//选择
showarr(arr,MAXSIZE);
//printf("count=%d\n",count);
insert(arr,MAXSIZE);//插入
showarr(arr,MAXSIZE);
//printf("count=%d\n",count);
return 0;
}
8.查找
8.1:折半查找
题目描述
在一个有序的一维数组中,输入一个数,利用折半查找法找到该数是这个数组中的第几个数;如果该数不在数组中,则输出“No data!”
输入格式:
第一行输入一个整数n(1<=n<=15),表示该数组有几个数;第二行输入n个整型一维数组;第三行输入要查找的数。
输出格式:
如果找到该数,输出“It's position is 4!”;如果没有找到,输出“No data!”。
输入样例1:
在这里给出一组输入。例如:
5
-3 2 7 15 40
15
输出样例1:
在这里给出相应的输出。例如:
It's position is 4!
输入样例2:
在这里给出一组输入。例如:
4
0 3 6 9
5
输出样例2:
在这里给出相应的输出。例如:
No data!
参考代码:
#include<stdio.h>
int binary_search(int arr[],int num,int sz){
int left=0,right=sz-1;
while(left<=right){
int mid=left+(right-left)/2;
if(arr[mid]>num){
right=mid-1;
}
else if(arr[mid]<num){
left=mid+1;
}
else{
return mid;
}
}
return -1;
}
int main(){
int n,i,num;
scanf("%d",&n);
int arr[n];
for(i=0;i<n;i++){
scanf("%d",&arr[i]);
}
scanf("%d",&num);
int sz=sizeof(arr)/sizeof(arr[0]);
int ret=binary_search(arr,num,sz);
if(ret==-1){
printf("No data!");
}
else{
printf("It's position is %d!",ret+1);
}
return 0;
}
8.2:顺序查找(老师说不考
输入格式:
第一行输入一个整数n,表示顺序表的元素个数。
第二行行输入n个数字,依次为表内元素值。
第三行输入一个要查找的值。
输出格式:
输出这个值在表中的位置。如果没有找到,输出NOT FOUND。
输入样例:
5
9 5 3 7 6
7
输出样例:
4
输入样例:
5
9 5 3 7 6
8
输出样例:
NOT FOUND
参考代码:摘自PTA顺序查找_pta 顺序表的查找操作-CSDN博客
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 50
typedef int ElemType;
typedef struct
{
ElemType *R;
int length;
} SSTable;
// 初始化顺序表
void InitList(SSTable *L, int n)
{
L->R = (ElemType *)malloc((n + 1) * sizeof(ElemType));
if (!L->R)
{
exit(EXIT_FAILURE);
}
for (int i = 1; i <= n; ++i)
{
scanf("%d", &L->R[i]);
}
L->length = n;
}
// 顺序查找
int SequentialSearch(SSTable *L, ElemType key)
{
L->R[0] = key; // 设置哨兵
int i = L->length;
while (L->R[i] != key)
{
--i;
}
return i; // 如果i为0,表示查找失败
}
int main()
{
SSTable L;
int n, key, result;
// 输入元素个数
scanf("%d", &n);
// 初始化顺序表
InitList(&L, n);
// 输入要查找的值
scanf("%d", &key);
// 进行顺序查找
result = SequentialSearch(&L, key);
// 输出结果
if (result != 0)
{
printf("%d\n", result);
}
else
{
printf("NOT FOUND\n");
}
// 释放内存
free(L.R);
return 0;
}
9.约瑟夫环
9.1:猴子选大王
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:
11
输出样例:
7
参考代码:
#include<stdio.h>
int main(){
int n;
while(scanf("%d",&n)!=1);
int monkey[n],sign=0,count=1,remain=n;
for(int i=0;i<n;i++){
monkey[i]=0;
}
while(remain>1){
if(monkey[sign]==0 && count%3==0){
monkey[sign]=1;
count=1;
remain--;
}
else if(monkey[sign]==0){
count++;
}
sign++;
sign=sign%n;
}
for(int j=0;j<n;j++){
if(monkey[j]==0){
printf("%d",j+1);
}
}
return 0;
}
9.2:约瑟夫环
(选自PTA 1-3 约瑟夫环_约瑟夫环pta-CSDN博客
(不会考这么难的,反正博主我看不太懂
N个人围成一圈顺序编号,从1号开始按1、2、3......顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。
请按退出顺序输出每个退出人的原序号。
输入格式:
输入只有一行,包括一个整数N(1<=N<=3000)及一个整数p(1<=p<=5000)。
输出格式:
按退出顺序输出每个退出人的原序号,数据间以一个空格分隔,但行尾无空格。
输入样例:
在这里给出一组输入。例如:
7 3
输出样例:
3 6 2 7 5 1 4
参考代码:
#include <stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Node{
int data;
struct Node *next;
}LinkListNode;
LinkListNode* Createlist(int n)//创建链表
{
LinkListNode *head,*p,*q;
head = (LinkListNode*)malloc(sizeof(LinkListNode));
head->data = 1;
head->next = NULL;
p = head;
for(int i = 2;i <= n;i++)//从头结点开始依此赋值
{
q = (LinkListNode*)malloc(sizeof(LinkListNode));
q->data = i;
p->next = q;
p = q;
}
p->next = head;//最后指向头结点,构成循环
return head;
}
int main()
{
int n,p;
scanf("%d%d",&n,&p);
int ret[n];//vistual会报错,可换成常量
int i = 0;
LinkListNode *head,*ptr,*q;
head = Createlist(n);
ptr = head;
while(i<n)
{
for(int j = 1;j < (p-1);j++)
{
ptr = ptr->next;
}
q = ptr->next;
ret[i] = q->data;
ptr->next = q->next;
free(q);
ptr = ptr->next;
i++;
}
for(int j = 0;j<n-1;j++)
{
printf("%d ",ret[j]);//此处有空格
}
printf("%d", ret[n - 1]);//最后一个值后无空格,单独输出
return 0;
}
10.打印图形问题
10.1:打印沙漏
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
参考代码:
#include<stdio.h>
int main(){
char c;
int num,hang=1;
scanf("%d %c",&num,&c);
num--;
while(num>=2*(hang+2)){
num-=2*(hang+2);
hang+=2;
}
int row=hang;
for(int i=1;i<=hang;i++){
if(i<=hang/2){
for(int j=1;j<=i-1;j++){
printf(" ");
}
for(int j=1;j<=row;j++){
printf("%c",c);
}
row-=2;
}
else{
for(int j=1;j<=hang-i;j++){
printf(" ");
}
for(int j=1;j<row+1;j++){
printf("%c",c);
}
row+=2;
}
printf("\n");
}
printf("%d",num);
return 0;
}
10.2:打印菱形图案
本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。
输入格式:
输入在一行中给出一个正的奇数n。
输出格式:
输出由n行星号“*”组成的菱形,如样例所示。每个星号后跟一个空格。
输入样例:
7
输出样例:
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
参考代码:
#include <stdio.h>
int main() {
int n;
scanf("%d",&n);
for (int i=1;i<=(n+1)/2;i++){
for(int j=1;j<=(n+1)/2-i;j++){
printf(" ");
}
for(int j=1;j<=2*i-1;j++){
printf("* ");
}
printf("\n");
}
for (int i=1;i<=(n-1)/2;i++){
for (int j=1;j<=i;j++){
printf(" ");
}
for (int j=1;j<=n-(2*i);j++){
printf("* ");
}
printf("\n");
}
return 0;
}
10.3:输出倒三角图案
本题要求编写程序,输出指定的由“*”组成的倒三角图案。
输入格式:
本题目没有输入。
输出格式:
按照下列格式输出由“*”组成的倒三角图案。
* * * *
* * *
* *
*
参考代码:
#include<stdio.h>
int main(){
int i,j;
for(i=0;i<4;i++){
for(j=0;j<i;j++){
printf(" ");
}
for(j=i;j<4;j++){
printf("*");
if(j<3){
printf(" ");
}
}
printf("\n");
}
return 0;
}
11.转置矩阵
题目描述
已知N×N的矩阵A,将A与矩阵A的转置矩阵相加,存放在矩阵B中。
输入格式:
第一行输入整数N(2<=N<=10)表示个N×N的整型矩阵;然后输入N×N个整数,中间以空格间隔。
输出格式:
输出矩阵B。
输入样例:
在这里给出一组输入。例如:
3
2 4 6
8 10 12
14 16 18
输出样例:
在这里给出相应的输出。例如:
4 12 20
12 20 28
20 28 36
参考代码:
#include<stdio.h>
int main(){
int a[10][10],b[10][10],n,i,j,t;
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
b[i][j]=a[i][j]+a[j][i];
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf(" %2d",b[i][j]);
}
printf("\n");
}
return 0;
}
12.杨辉三角
题目描述
打印杨辉三角。
输入格式:
输入要打印的行数。0<n<14
输出格式:
输出杨辉三角。注:每个数字设置6个域宽。
输入样例:
在这里给出一组输入。例如:
5
输出样例:
在这里给出相应的输出。例如:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
参考代码:
#include<stdio.h>
#define N 14
int main(){
int n;
scanf("%d",&n);
int i,j,k,a[N][N];
for(i=1;i<=n;i++){
a[i][1]=a[i][i]=1;
}
for(i=3;i<=n;i++){
for(j=2;j<=i-1;j++){
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
for(i=1;i<=n;i++){
for(k=1;k<=n-i;k++){
printf(" ");
}
for(j=1;j<=i;j++){
printf("%6d",a[i][j]);
}
printf("\n");
}
return 0;
}
13.老师所讲的pta第五章实验题(除魔方阵
13.1:安工 pta 第五章作业与实验(C语言) 7-17 字符串转换为整数_输入一串字符“a12b345c”,将其中的数字字符转换为整数12345。输入格式:输入-CSDN博客
13.2:
安工 pta 第五章作业与实验(C语言) 7-14 统计字符出现的次数_pta输入一串字符,统计其中大写字母a-z各出现多少次,输出出现过的字母(每5个字母占-CSDN博客
13.3:
安工 pta 第五章作业与实验(C语言) 7-18 统计平均成绩_计算平均成绩c语言pta-CSDN博客