当前位置:   article > 正文

专科段数据结构专项练习 PTA 16-20题_7-18 大菲波数

7-18 大菲波数

7-16 队列的实现及基本操作

代码:

  1. #include <stdio.h>
  2. int queue[20000];
  3. int front;
  4. int rear;
  5. void initqueue();//初始化队列
  6. void enterqueue(int x);//入队
  7. int deletequeue();//出队 
  8. int main()
  9. {
  10.     int n,t;
  11.     int i,k=0;
  12.     int a[20000][2];
  13.     char ch;
  14.     scanf("%d",&n);
  15.     for(i=0;i<n;i++)
  16.     {    
  17.         k=0;
  18.         do
  19.         {
  20.             scanf("%d",&a[i][k]);
  21.             k++;
  22.         }while((ch=getchar())!='\n');                    
  23.     }
  24.     for(i=0;i<n;i++)
  25.     {
  26.         if(a[i][0]==1)//入队 
  27.         {
  28.             enterqueue(a[i][1]);
  29.         }            
  30.         if(a[i][0]==0)
  31.         {    
  32.             t=deletequeue();                
  33.             if(t==0)
  34.                 printf("invalid\n");
  35.             else
  36.                 printf("%d\n",queue[front-1]);            
  37.         }
  38.     }    
  39.     return 0;
  40. }
  41. void initqueue()//初始化队列
  42. {
  43.     front=0;
  44.     rear=0;
  45. }
  46. void enterqueue(int x)//入队
  47. {    
  48.     queue[rear]=x;
  49.     rear++;    
  50. }
  51. int deletequeue()//出队 
  52. {
  53.     if(front==rear)
  54.         return 0;//队列为空 
  55.     else
  56.     {
  57.         front++;
  58.         return 1;
  59.     }
  60. }

7-17 字符串模式匹配

代码:

  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<string.h>
  4. int* getNext(char* p, int pn)
  5. {
  6. if (pn == 1) {
  7. int* next = (int*)malloc(sizeof(int));
  8. next[0] = -1;
  9. return next;
  10. }
  11. int* next = (int*)malloc(sizeof(int) * pn);
  12. next[0] = -1;
  13. next[1] = 0;
  14. int pos = 2;
  15. int cn = 0;
  16. while (pos < pn) {
  17. if (p[pos - 1] == p[cn]) {
  18. next[pos++] = ++cn;
  19. }
  20. else if (cn > 0) {
  21. cn = next[cn];
  22. }
  23. else
  24. {
  25. next[pos++] = 0;
  26. }
  27. }
  28. return next;
  29. }
  30. int kmp(char* t, int tn, char* p, int pn)
  31. {
  32. if (t == NULL || p == NULL || pn < 1 || tn < pn) {
  33. return -1;
  34. }
  35. int i = 0;
  36. int j = 0;
  37. int* next = getNext(p, pn);
  38. int m = tn;
  39. int n = pn;
  40. while ((i < m) && (j < n)) {
  41. if (t[i] == p[j]) {
  42. ++i;
  43. ++j;
  44. }
  45. else if (next[j] == -1) i++;
  46. else j = next[j];
  47. }
  48. return j == pn ? i - j : -1;
  49. }
  50. void fail(char* a,int an) {
  51. int* b = (int*)malloc(sizeof(int) * an);
  52. b[0] = -1;
  53. for (int i = 1; i < an; ++i) {
  54. int j = b[i - 1];
  55. while (a[i] != a[j + 1] && (j >= 0)) j = b[j];
  56. if (a[i] == a[j + 1]) b[i] = j + 1;
  57. else b[i] = -1;
  58. }
  59. for (int i = 0; i < an; ++i) {
  60. printf("%d ", b[i]);
  61. }
  62. printf("\n");
  63. }
  64. int main()
  65. {
  66. // char str1[] = "qwerabcabhlk";
  67. // char str2[] = "abcab";
  68. char str1[100000], str2[100000];
  69. //str1 = "qwerabcabhlk";
  70. //str2 = "abcab";
  71. scanf("%s", str1);
  72. scanf("%s", str2);
  73. int length1 = strlen(str1);
  74. int length2 = strlen(str2);
  75. fail(str2, length2);
  76. int res = kmp(str1, length1, str2, length2);
  77. printf("%d", res);
  78. return 0;
  79. }

7-18 大菲波数

代码:

  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<string.h>
  4. int a[1000 +5][400];
  5. int main()
  6. {
  7. int T;
  8. scanf("%d",&T);
  9. while(T--){
  10. int pi,i,j;
  11. scanf("%d",&pi);
  12. memset(a,0,sizeof(a));
  13. a[0][0]=a[1][0]=1;
  14. int k=1;
  15. if(pi>1){
  16. for(i = 2;i<pi;i++){
  17. for(j = 0;j <k ;j++){
  18. a[i][j]=a[i-1][j]+a[i-2][j];
  19. }
  20. for(j=0;j<k;j++){
  21. if(a[i][k-1]>9)
  22. k++;
  23. if(a[i][j]>9){
  24. a[i][j+1]+=a[i][j]/10;
  25. a[i][j]=a[i][j]%10;
  26. }
  27. }
  28. }for(i = k-1;i >=0;i--){
  29. printf("%d",a[pi-1][i]);
  30. }
  31. }
  32. else
  33. printf("%d",a[pi-1][0]);
  34. printf("\n");
  35. }
  36. return 0;
  37. }

7-19 "聪明的学生"

代码: 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int step(int t1,int t2)
  4. {
  5. if(t2>t1)
  6. return t2-t1;
  7. else
  8. return t2+3-t1;
  9. }
  10. int times(int i,int j,int t1,int t2,int t3)
  11. {
  12. int k;
  13. k=i-j;
  14. if(k==0)
  15. {
  16. return t3;
  17. }
  18. if(k>0)
  19. {
  20. return times(j,i-j,t2,t3,t1)+step(t1,t3);
  21. }
  22. if(k<0)
  23. {
  24. return times(i,j-i,t1,t3,t2)+step(t2,t3);
  25. }
  26. }
  27. int main()
  28. {
  29. int result;
  30. int a=1,b=2,c=3;
  31. int arr[3];
  32. scanf("%d,%d,%d",&arr[0],&arr[1],&arr[2]);
  33. int index=0;
  34. int max_num=-1,mid_num=-1;
  35. int max_index=-1,mid_index=-1;
  36. for(;index<3;index++)
  37. {
  38. if(max_num<arr[index])
  39. {
  40. mid_num=max_num;
  41. mid_index=max_index;
  42. max_num=arr[index];
  43. max_index=index;
  44. }
  45. if(mid_num<arr[index]&&arr[index]!=max_num)
  46. {
  47. mid_num=arr[index];
  48. mid_index=index;
  49. }
  50. }
  51. c=max_index+1;
  52. b=mid_index+1;
  53. if((c==1&&b==2)||(c==2&&b==2))
  54. a=3;
  55. else
  56. if((c==2&&b==3)||(c==3&&b==2))
  57. a=1;
  58. else
  59. a=2;
  60. result=times(arr[a-1],arr[b-1],a,b,c);
  61. printf("%d\n",result);
  62. return 0;
  63. }

7-20 who is the last?

代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct Node;
  4. typedef struct Node *ptrtoNode;
  5. typedef ptrtoNode position;
  6. typedef position Head;
  7. struct Node
  8. {
  9. int x;
  10. position next;
  11. };
  12. int main()
  13. {
  14. Head head = malloc(sizeof(struct Node));
  15. head->next = NULL;
  16. head->x = 1;
  17. position pLast = head;
  18. int N, M;
  19. scanf("%d", &N);
  20. getchar();
  21. scanf("%d", &M);
  22. int i;
  23. if (N == 0)
  24. {
  25. for (i = 1; i < N; i++)
  26. {
  27. printf("%d,", i);
  28. }
  29. printf("%d", i);
  30. }
  31. else
  32. {
  33. for (i = 2; i <= N; i++)
  34. {
  35. position pnew = malloc(sizeof(struct Node));
  36. pnew->x = i;
  37. pLast->next = pnew;
  38. pnew->next = head;
  39. pLast = pnew;
  40. }
  41. int nowPeople = N;
  42. position p = head;
  43. while (nowPeople > 1)
  44. {
  45. for (i = 1; i <= M - 1; i++)
  46. {
  47. p = p->next;
  48. }
  49. // deleteNode(p);
  50. printf("%d,", p->next->x);
  51. p->next = p->next->next;
  52. p = p->next;
  53. nowPeople--;
  54. }
  55. printf("%d\n", p->x);
  56. }
  57. return 0;
  58. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/843633
推荐阅读
相关标签
  

闽ICP备14008679号