• PTA初级题目练习


    作者:~小明学编程 

    文章专栏:蓝桥杯PTA练习

    格言:目之所及皆为回忆,心之所想皆为过往
    在这里插入图片描述

    7-1 约会成功了吗?

    题目

    2021年9月9日,张三想约一直暗恋了很久的的女生小芳看电影,小芳告诉张三这天没空,可以答应在某年某月某日陪他一起看。输入一个约会的日期,请你编写程序判断最终张三是否能实现他约会的愿望,若能实现则输出yes,否则输出no。注意,约会不能穿越到2021年9月9日前。

    输入格式:

    在一行中输入年月日,用-分隔。

    输出格式:

    合法的日期输出yes,不合法的日期输出no

    输入样例1:

    2022-7-7
    

    输出样例1:

    yes
    

    输入样例2:

    2022-2-29
    

    输出样例2:

    no
    

    输入样例3:

    2021-2-28
    

    输出样例3:

    no

    代码

    1. #include
    2. //判断输入的日期是否合法
    3. int judgeLgal(int year,int month,int day)
    4. {
    5. int arr[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    6. if((year%4==0&&year%100!=0||year%400==0))
    7. {
    8. // if(month==2&&day>28)
    9. // {
    10. // return -1;
    11. // }
    12. arr[2]=29;
    13. }
    14. if(arr[month]
    15. {
    16. return -1;
    17. }
    18. if(year>2021)
    19. {
    20. return 0;
    21. }
    22. else
    23. {
    24. if(year==2021&&month>9)
    25. {
    26. return 0;
    27. }
    28. else
    29. {
    30. if(year==2021&&month==9&&day>=9)
    31. {
    32. return 0;
    33. }
    34. else
    35. {
    36. return -1;
    37. }
    38. }
    39. }
    40. }
    41. int main()
    42. {
    43. int year = 0;
    44. int month = 0;
    45. int day = 0;
    46. scanf("%d-%d-%d",&year,&month,&day);
    47. if(judgeLgal(year,month,day)==0)
    48. {
    49. printf("yes");
    50. }
    51. else
    52. {
    53. printf("no");
    54. }
    55. return 0;
    56. }

    7-2 验证回文串

    题目:

    编写程序,验证一个字符串是否为回文串:是否从前读它和从后读它都是一样的。例如,mom,dad是回文串。该程序接收用户输入的字符串,判断是否为回文串,然后将判断的结果输出。

    输入格式:

    输入在一行中给出一个字符串。

    输出格式:

    如果输入的字符串为回文串,则输出yes;否则输出no。

    输入样例:

    在这里给出一组输入。例如:

    mom
    

    输出样例:

    在这里给出相应的输出。例如:

    yes

    代码

    1. #include
    2. #include
    3. int judge(char* str)
    4. {
    5. int right = strlen(str)-1;
    6. int left = 0;
    7. while(left<=right)
    8. {
    9. if(*(str+left)==*(str+right))
    10. {
    11. left++;
    12. right--;
    13. continue;
    14. }
    15. else
    16. {
    17. return -1;
    18. }
    19. }
    20. return 0;
    21. }
    22. int main()
    23. {
    24. char str[81] = {0};
    25. scanf("%s",str);
    26. if(judge(str)==0)
    27. {
    28. printf("yes\n");
    29. }
    30. else
    31. {
    32. printf("no\n");
    33. }
    34. return 0;
    35. }

    7-3 自守数

    题目

    数学的世界有很多很漂亮的数字或者数字集合,比如梅森数,哥德巴赫猜想,水仙花数,完全数,自守数。今天我们就一起来探究一下自守数。自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 = 625,76^2 = 5776,9376^2 = 87909376。请求出n以内的自守数的个数

    输入格式:

    第一行输入n,随后输入n个数m。

    输出格式:

    在一行中输出m以内自守数的个数,所有输出在一行内完成,末尾没有多余空格。

    输入样例:

    1. 5
    2. 1
    3. 2
    4. 3
    5. 4
    6. 5

    输出样例:

    2 2 2 2 3

    代码

    1. #include
    2. #include
    3. //计算位数
    4. int number(int m)
    5. {
    6. int count = 0;
    7. while(m!=0)
    8. {
    9. count++;
    10. m = m/10;
    11. }
    12. return count;
    13. }
    14. //计算切断之后的数
    15. int cutNumber(int x,int number)
    16. {
    17. return x%(int)pow(10,number);
    18. }
    19. int main()
    20. {
    21. int n = 0;
    22. int m=0;
    23. scanf("%d",&n);
    24. while(n--)
    25. {
    26. int count = 0;
    27. scanf("%d",&m);
    28. for(int i=1;i<=m;i++)
    29. {
    30. if(i==cutNumber(i*i,number(i)))
    31. {
    32. count++;
    33. }
    34. }
    35. if(n==0)
    36. {
    37. printf("%d",count+1);
    38. }
    39. else
    40. {
    41. printf("%d ",count+1);
    42. }
    43. }
    44. return 0;
    45. }

    7-4 验证“哥德巴赫猜想”

    题目:

    数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于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

    代码

    1. #include
    2. #include
    3. int judgePrime(int number)
    4. {
    5. for(int i=2;i<=(int)sqrt(number);i++)
    6. {
    7. if(number%i==0)//不是素数
    8. {
    9. return -1;
    10. }
    11. }
    12. return 1;
    13. }
    14. int main()
    15. {
    16. int N = 0;
    17. scanf("%d",&N);
    18. for(int i=2;i
    19. {
    20. if(judgePrime(i)==1&&judgePrime(N-i)==1)
    21. {
    22. printf("%d = %d + %d",N,i,N-i);
    23. break;
    24. }
    25. }
    26. return 0;
    27. }

    7-5 逐行排序

    题目:

    给你一个n阶方阵,请你把每行数据按数据从小到大排序并输出。

    输入格式:

    输入数据首先包含一个整数T,表示测试实例的个数,然后是T组测试数据。
    每组测试数据的第一行输入1个整数n(1

    输出格式:

    对于每组测试,输出排好序后的结果。每行中各数据之间留一个空格。

    输入样例:

    1. 2
    2. 3
    3. 4 9 2
    4. 3 5 7
    5. 8 1 6
    6. 2
    7. 3 5
    8. 1 2

    输出样例:

    1. 2 4 9
    2. 3 5 7
    3. 1 6 8
    4. 3 5
    5. 1 2

    代码

    1. #include
    2. void bubbleSort(int arr[21][21], int n)
    3. {
    4. for (int k = 0; k < n; k++)
    5. {
    6. for (int i = 0; i < n - 1; i++)
    7. {
    8. for (int j = 0; j < n - i - 1; j++)
    9. {
    10. if (arr[k][j] > arr[k][j + 1])
    11. {
    12. int ret = arr[k][j];
    13. arr[k][j] = arr[k][j + 1];
    14. arr[k][j + 1] = ret;
    15. }
    16. }
    17. }
    18. }
    19. }
    20. void print(int arr[21][21], int n)
    21. {
    22. for (int i = 0; i < n; i++)
    23. {
    24. for (int j = 0; j < n; j++)
    25. {
    26. if (j == n - 1)
    27. {
    28. printf("%d", arr[i][j]);
    29. }
    30. else
    31. {
    32. printf("%d ", arr[i][j]);
    33. }
    34. }
    35. printf("\n");
    36. }
    37. }
    38. int main()
    39. {
    40. int T = 0;
    41. int n = 0;
    42. int arr[21][21] = { 0 };
    43. scanf("%d", &T);
    44. while (T--)
    45. {
    46. scanf("%d", &n);
    47. for (int i = 0; i < n; i++)
    48. {
    49. for (int j = 0; j < n; j++)
    50. {
    51. scanf("%d", &arr[i][j]);
    52. }
    53. }
    54. bubbleSort(arr, n);
    55. print(arr, n);
    56. }
    57. return 0;
    58. }

    7-6 判断双对称方阵

    题目

    对于一个n阶方阵,请判断该方阵是否双对称,即既左右对称又上下对称。若是则输出“yes”,否则输出“no”。例如,样例中,以第2列为界则左右对称,以第2行为界则上下对称,因此输出“yes”。

    输入格式:

    首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组数据的第一行输入方阵的阶n(2≤n≤50),接下来输入n行,每行n个整数,表示方阵中的元素。

    输出格式:

    对于每组测试数据,若该方阵双对称,则输出“yes”,否则输出“no”。注意,引号不必输出。

    输入样例:

    1. 2
    2. 3
    3. 1 2 1
    4. 3 5 3
    5. 1 4 1
    6. 3
    7. 1 2 1
    8. 3 5 3
    9. 1 2 1

    输出样例:

    1. no
    2. yes

    代码

    1. #include
    2. int judge(int arr[51][51],int n)
    3. {
    4. for(int i=0;i2;i++)
    5. {
    6. for(int j=0;j
    7. {
    8. if(arr[i][j]!=arr[n-1-i][j]||arr[j][i]!=arr[j][n-1-i])
    9. return -1;
    10. }
    11. }
    12. return 0;
    13. }
    14. int main()
    15. {
    16. int T = 0;
    17. int n = 0;
    18. int arr[51][51] = { 0 };
    19. scanf("%d", &T);
    20. while (T--)
    21. {
    22. scanf("%d", &n);
    23. for (int i = 0; i < n; i++)
    24. {
    25. for (int j = 0; j < n; j++)
    26. {
    27. scanf("%d", &arr[i][j]);
    28. }
    29. }
    30. if(judge(arr,n)==0)
    31. {
    32. printf("yes\n");
    33. }
    34. else
    35. {
    36. printf("no\n");
    37. }
    38. }
    39. return 0;
    40. }

    7-7 蛇形矩阵

    题目

    蛇形矩阵是由1开始的自然数依次排列成的一个上三角矩阵(参看 输出样例)。要求输入整数n,构造并输出蛇形矩阵。

    输入格式:

    首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入一个正整数N(N不大于100)。

    输出格式:

    对于每组测试,输出一个共有N行的蛇形矩阵。每行的每两个数字之间留一个空格。

    输入样例:

    在这里给出一组输入。例如:

    1. 1
    2. 5

    输出样例:

    1. 1 3 6 10 15
    2. 2 5 9 14
    3. 4 8 13
    4. 7 12
    5. 11

    代码

    1. #include
    2. void initArr(int arr[101][101], int n)
    3. {
    4. int init = 1;//第一个数
    5. int ret = 1;
    6. int add = 0;
    7. for (int i = 0; i < n; i++)
    8. {
    9. ret++;//每行一开始加的数
    10. init += i;//每行的第一个数
    11. add = ret;
    12. for (int j = 0; j < n - i; j++)
    13. {
    14. if (j == 0)
    15. {
    16. arr[i][j] = init;
    17. }
    18. else
    19. {
    20. arr[i][j] = arr[i][j-1] + add;
    21. add++;
    22. }
    23. }
    24. }
    25. }
    26. void print(int arr[101][101], int n)
    27. {
    28. for (int i = 0; i < n; i++)
    29. {
    30. for (int j = 0; j < n - i; j++)
    31. {
    32. if (j != n - i - 1)
    33. {
    34. printf("%d ", arr[i][j]);
    35. }
    36. else
    37. {
    38. printf("%d", arr[i][j]);
    39. }
    40. }
    41. printf("\n");
    42. }
    43. }
    44. int main()
    45. {
    46. int T = 0;
    47. int N = 0;
    48. int arr[101][101] = { 0 };
    49. scanf("%d", &T);
    50. while (T--)
    51. {
    52. scanf("%d", &N);
    53. initArr(arr, N);
    54. print(arr, N);
    55. }
    56. return 0;
    57. }

    7-8 扫雷游戏

    题目

    玩过扫雷游的朋友都知道,该游戏的目标是找出一个nm矩阵内的所有的地雷,在本题中,你需要为每一个单元格统计出它周围地雷的个数,每个单元格最多有8个相邻单元格,如下图,44 的格子里,用“*”表示雷,用“^” 表示没有雷。

    *^^^

    ^^^^

    ^*^^

    ^^^^

    计算后的输出结果为:

    *100

    2210

    1*10

    1110

    输入格式:

    输入包含若干个矩阵,对于每一个矩阵,第一行包含两个数M和N,分别表示该矩阵的行数和列数(0

    输出格式:

    对于每一个矩阵,首先在单独一行打印出矩阵序号:Field #X: 其中X是矩阵的编号,从1开始编号,接下来N行中,读入的“^”用该位置周围的地雷数目所代替,地雷处,仍用“*”表示。输出相邻的两个矩阵之间,空一行。

    输入样例:

    在这里给出一组输入。例如:

    1. 4 4
    2. *^^^
    3. ^^^^
    4. ^*^^
    5. ^^^^
    6. 8 8
    7. *^^^*^^^
    8. *^****^^
    9. ^*^^**^^
    10. ^^**^**^
    11. ^*^^**^^
    12. *^^^*^^^
    13. ^^**^**^
    14. ^*^^**^^
    15. 0 0

    输出样例:

    在这里给出相应的输出。例如:

    1. Field #1:
    2. *100
    3. 2210
    4. 1*10
    5. 1110
    6. Field #2:
    7. *324*310
    8. *4****20
    9. 2*56**41
    10. 23**6**1
    11. 2*34**31
    12. *334*531
    13. 23**5**1
    14. 1*33**31

    代码

    1. #include
    2. void initBoard(char arr[102][102], int N, int M)
    3. {
    4. for (int i = 0; i < 102; i++)
    5. {
    6. for (int j = 0; j < 102; j++)
    7. {
    8. arr[i][j] = '^';
    9. }
    10. }
    11. for (int i = 1; i <= N; i++)
    12. {
    13. for (int j = 1; j <= M; j++)
    14. {
    15. scanf("%c", &arr[i][j]);
    16. }
    17. getchar();
    18. }
    19. }
    20. int get_mine_count(char mine[102][102], int x, int y)
    21. {
    22. return (mine[x - 1][y] +
    23. mine[x + 1][y] +
    24. mine[x][y - 1] +
    25. mine[x][y + 1] +
    26. mine[x - 1][y - 1] +
    27. mine[x - 1][y + 1] +
    28. mine[x + 1][y - 1] +
    29. mine[x + 1][y + 1] - 8 * '^')/('*'-'^');
    30. }
    31. void findMine(char arr[102][102], int N, int M)
    32. {
    33. for (int i = 1; i <= N; i++)
    34. {
    35. for (int j = 1; j <= M; j++)
    36. {
    37. if (arr[i][j] == '*')
    38. {
    39. printf("%c",arr[i][j]);
    40. }
    41. else
    42. {
    43. printf("%c",'0'+get_mine_count(arr, i, j));
    44. }
    45. }
    46. printf("\n");
    47. }
    48. }
    49. int main()
    50. {
    51. int count = 1;
    52. int N = 0;
    53. int M = 0;
    54. char arr[102][102] = { 0 };
    55. while(scanf("%d %d\n", &N, &M)!=EOF)
    56. {
    57. // getchar();
    58. if (M == N && N == 0)
    59. {
    60. return 0;
    61. }
    62. initBoard(arr, N, M);
    63. printf("Field #%d:\n",count);
    64. findMine(arr, N, M);
    65. printf("\n");
    66. count++;
    67. }
    68. return 0;
    69. }

    7-9 优美的括号序列

    题目

    某日,小明特别无聊,就想找点东西玩,于是他发现括号()特别好玩,而且新学会了一项技能,

    将一对小括号(),插入到一个括号序列中,其中插入的规则是,左括号'('的位置要小于右括号')'的位置,不要求插入的左右括号相邻,

    例如以下,为了方便区分,我们拿ab代表原括号序列

    将()插入到()中可形成()ab (a)b (ab) a()b a(b) ab()等等序列,其中a代表原括号序列的左括号,b代表原括号序列的右括号。

    小明认为一个括号序列是一个优美的序列当且仅当这个括号序列可以被如下方法构造出来:

    一开始有一个空串,然后执行0次或者若干次操作,每次操作将()插入到当前的括号序列中。

    根据上面的定义:() , (()) , (()())都是优美的括号序列,(() , )( , ()))都不是优美的括号序列

    输入格式:

    多组输入

    每行输入给定一个仅由'(',')'组成的括号序列,长度小于等于1000

    题目保证没有空串

    输出格式:

    对于每个输入输出一行,若当前的括号序列是优美的,则输出"YES"(不含引号)

    否则输出"NO"(不含引号)

    输入样例:

    1. ()
    2. (())
    3. (()())
    4. ()()
    5. (()
    6. )(
    7. ()))

    输出样例:

    1. YES
    2. YES
    3. YES
    4. YES
    5. NO
    6. NO
    7. NO

    代码

    1. #include
    2. #include
    3. int judge(char arr[])
    4. {
    5. int count=0;
    6. for(int i=0;i<strlen(arr);i++)
    7. {
    8. if(arr[i]=='(')
    9. {
    10. count++;
    11. }
    12. else
    13. {
    14. count--;
    15. }
    16. if(count<0)
    17. {
    18. return -1;
    19. }
    20. }
    21. if(count==0)
    22. {
    23. return 1;
    24. }
    25. else
    26. {
    27. return -1;
    28. }
    29. }
    30. int main()
    31. {
    32. char arr[1001]={0};
    33. int count = 0;
    34. while(scanf("%s\n",arr)!=EOF)
    35. {
    36. if(judge(arr)==1)
    37. {
    38. printf("YES\n");
    39. }
    40. else
    41. {
    42. printf("NO\n");
    43. }
    44. }
    45. return 0;
    46. }

    7-10 单链表基本操作

    题目

    请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。

    输入格式:

    输入第1行为1个正整数n,表示当前单链表长度;第2行为n个空格间隔的整数,为该链表n个元素的数据域值。第3行为1个正整数m,表示对该链表施加的操作数量;接下来m行,每行表示一个操作,为2个或3个整数,格式为0 k d或1 k。0 k d表示在链表第k个结点后插入一个数据域值为d的结点,若k=0则表示表头插入。1 k表示删除链表中第k个结点,此时k不能为0。注:操作序列中若含有不合法的操作(如在长度为5的链表中删除第8个结点、删除第0个结点等),则忽略该操作。n和m不超过100000。

    输出格式:

    输出为一行整数,表示实施上述m个操作后的链表,每个整数后一个空格。输入数据保证结果链表不空。

    输入样例:

    1. 5
    2. 1 2 3 4 5
    3. 5
    4. 0 2 8
    5. 0 9 6
    6. 0 0 7
    7. 1 0
    8. 1 6

    输出样例:

    7 1 2 8 3 5 

    代码

    1. #include
    2. #include
    3. struct Node
    4. {
    5. int data;
    6. struct Node * next;
    7. };
    8. //输出链表
    9. void ShowList(struct Node* list)
    10. {
    11. //list = list->next;
    12. while (list) {
    13. printf("%d ", list->data);
    14. list = list->next;
    15. }
    16. //printf("%d\n", list->data);
    17. printf("\n");
    18. }
    19. void DeleteList(struct Node* list, int t)
    20. {
    21. struct Node* p = list;
    22. struct Node* q = NULL;
    23. if (t) {
    24. for (int i = 0; p && i < t - 1; ++i) {
    25. if (!p->next) {
    26. return ;//若超出链表范围,不处理
    27. }
    28. p = p->next;
    29. }
    30. q = p;
    31. p = p->next;
    32. q->next = p->next;//删除中间结点和尾结点
    33. }
    34. else {
    35. return;
    36. }
    37. // free(p);
    38. }
    39. void InsertList(struct Node* list, int t ,int data)
    40. {
    41. if (t < 0)
    42. {
    43. return;
    44. }
    45. struct Node* p = list;
    46. struct Node* insert = (struct Node*)malloc(sizeof(struct Node*));//开辟一块新的空间
    47. /*for (int i = 0; i < t ; i++) {
    48. p = p->next;
    49. }*/
    50. while (t-->0)
    51. {
    52. if (p->next==NULL)//链表越界则直接返回
    53. return;
    54. p = p->next;
    55. }
    56. //找到所插入位置处的上一块空间
    57. insert->data = data;//存入数据
    58. insert->next = p->next;//和后面的空间建立连接
    59. p->next = insert;//和前面的空间建立连接
    60. }
    61. int main()
    62. {
    63. int n = 0;
    64. struct Node* head;
    65. struct Node* cur;
    66. struct Node* tem;
    67. scanf("%d", &n);
    68. // int curn = n;//复制一个链表个数
    69. head = (struct Node*)malloc(sizeof(struct Node));
    70. head->next = NULL;
    71. cur = head;
    72. //创建链表
    73. while (n--)
    74. {
    75. tem = (struct Node*)malloc(sizeof(struct Node));
    76. scanf("%d", &(tem->data));
    77. cur->next = tem;
    78. cur = cur->next;
    79. }
    80. cur->next = NULL;
    81. //对链表施加的操作数
    82. int operand = 0;
    83. scanf("%d",&operand);
    84. //用于判断进行删除还是插入操作
    85. int flag=0;
    86. int k = 0;
    87. int d = 0;
    88. while(operand--)
    89. {
    90. scanf("%d",&flag);
    91. if(flag==0)//插入节点
    92. {
    93. scanf("%d %d", &k, &d);
    94. InsertList(head, k, d);
    95. //ShowList(head->next);
    96. }
    97. else//删除节点
    98. {
    99. scanf("%d", &k);
    100. DeleteList(head, k);
    101. //ShowList(head->next);
    102. }
    103. }
    104. ShowList(head->next);
    105. }

  • 相关阅读:
    常用的控制板加工制造设备有哪些?
    什么是深度学习?最易懂的机器学习入门文章
    阿里云 MSE 支持 Go 语言流量防护
    信息系统数据同步解决方案
    Elasticsearch:从零开始创建一个 ingest pipeline 处理器
    蓝桥等考Python组别十六级002
    Sql依赖注入-架构案例(五十五)
    注册表的增删改查
    C语言通用交换和查询函数
    轻量级的VsCode为何越用越大?为什么吃了我C盘10G?如何无痛清理VsCode缓存?手把手教你为C盘瘦身
  • 原文地址:https://blog.csdn.net/m0_56911284/article/details/126709607