鱼C论坛

 找回密码
 立即注册
查看: 8337|回复: 46

匹配圆周率题 求助大神

[复制链接]
发表于 2021-11-13 22:17:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
W]3EV@15}LK%X82~4]8EQ69.png
8@PQ}S_`LX}14`W4B26UOCG.png



求助大神!   研究到哭  也是错误,网上搜不到~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-13 22:45:31 | 显示全部楼层

回帖奖励 +2 鱼币

  1. #include <stdio.h>

  2. int match(char s1[] , char s2[])
  3. {
  4.         int i , j , m , n , r = -1                                             ;
  5.         for(m = 0 ; s1[m] ; m ++)                                              ;
  6.         for(n = 0 ; s2[n] ; n ++)                                              ;
  7.         if(m >= n && n > 0) {
  8.                 for(i = 0 ; i < m - n + 1 ; i ++) {
  9.                         for(j = 0 ; j < n ; j ++) if(s1[i + j] != s2[j]) break ;
  10.                         if(j == n) {
  11.                                 r = i                                          ;
  12.                                 break                                          ;
  13.                         }
  14.                 }
  15.         }
  16.         return r                                                               ;
  17. }

  18. int main(void)
  19. {
  20.         char s1[1000000] , s2[1000000]  ;
  21.         scanf("%s" , s1)                ;
  22.         scanf("%s" , s2)                ;
  23.         printf("%d\n" , match(s1 , s2)) ;
  24. }
复制代码

        编译、运行实况:
  1. D:\00.Excise\C>g++ -o x x.c

  2. D:\00.Excise\C>x
  3. 1234
  4. 1234
  5. 0

  6. D:\00.Excise\C>x
  7. 1234
  8. 12345
  9. -1

  10. D:\00.Excise\C>x
  11. 821999052039574422
  12. 19990520
  13. 2

  14. D:\00.Excise\C>x
  15. 881994082555083527588321827035
  16. 19940825
  17. 2

  18. D:\00.Excise\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-14 09:35:24 | 显示全部楼层

回帖奖励 +2 鱼币

  1. #include <stdio.h>

  2. int match(char A[], char B[]){
  3.     for(int i = 0; A[i]; i++){
  4.         if(A[i] == B[0]){
  5.             int check = 1;
  6.             for(int j = i, n = 0; B[n]; j++, n++){
  7.                 if(B[n] != A[j]){
  8.                     check = -1;
  9.                     break;
  10.                 }
  11.             if(check) return i;
  12.             }
  13.         }
  14.     }
  15.     return -1;
  16. }

  17. int main(){
  18.     char A[1000000], B[1000000];
  19.     scanf("%s", A);
  20.     scanf("%s", B);
  21.     int answer = sizeof(A) >= sizeof(B) ? match(A, B) : -1;
  22.     printf("%d", answer);
  23. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-14 14:13:22 | 显示全部楼层

回帖奖励 +2 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-14 20:05:47 | 显示全部楼层
jackz007 发表于 2021-11-13 22:45
编译、运行实况:

最后的测试点显示超时,可能有些问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-14 20:06:18 | 显示全部楼层

部分正确,有2个测试点不正确
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-14 20:57:54 | 显示全部楼层
寂寞知己 发表于 2021-11-14 20:06
部分正确,有2个测试点不正确


已修改:
  1. #include <stdio.h>

  2. int match(char A[], char B[], int N, int M){
  3.     for(int i = 0; i < N-M+1; i++){
  4.         if(A[i] == B[0]){
  5.             int check = 1;
  6.             for(int j = i, n = 0; B[n]; j++, n++){
  7.                 if(B[n] != A[j]){
  8.                     check = -1;
  9.                     break;
  10.                 }
  11.             if(check) return i;
  12.             }
  13.         }
  14.     }
  15.     return -1;
  16. }

  17. int main(){
  18.     char A[1000000], B[1000000];
  19.     scanf("%s", A);
  20.     scanf("%s", B);
  21.     int a, b;
  22.     for(a = 0; A[a]; a++){}
  23.     for(b = 0; B[b]; b++){}
  24.     int answer = a > b ? match(A, B, a, b) : -1;
  25.     printf("%d", answer);
  26. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-15 08:40:15 | 显示全部楼层

回帖奖励 +2 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-15 21:08:19 | 显示全部楼层

还是3个错误点。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-15 21:13:43 | 显示全部楼层
寂寞知己 发表于 2021-11-15 21:08
还是3个错误点。。。。。。

抱歉,有没有可以参考的参数?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-15 21:50:10 | 显示全部楼层

回帖奖励 +2 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-15 22:15:26 | 显示全部楼层
傻眼貓咪 发表于 2021-11-15 21:13
抱歉,有没有可以参考的参数?

ZF[R9FNM3{2FXH79IZ5Z4.png
只有这个。。。。。


第一个人是对的   只不过最后那个测试点显示超时,你这个借鉴下第一个人   把超时整没有了   应该就是正确答案啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-15 22:16:54 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-15 22:17:20 | 显示全部楼层
jackz007 发表于 2021-11-13 22:45
编译、运行实况:

这个超时能解决一下吗?

X(FSBJ6())P$O2YP5URWSA1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-15 22:49:27 | 显示全部楼层
本帖最后由 jackz007 于 2021-11-15 22:51 编辑
寂寞知己 发表于 2021-11-15 22:17
这个超时能解决一下吗?


        那就再试试这个?
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         char s1[1000000] , s2[1000000]                                         ;
  5.         int i , j , k = -1 , m , n                                             ;
  6.         scanf("%s" , s1)                                                       ;
  7.         scanf("%s" , s2)                                                       ;
  8.         for(m = 0 ; s1[m] ; m ++)                                              ;
  9.         for(n = 0 ; s2[n] ; n ++)                                              ;
  10.         if(m >= n && n > 0) {
  11.                 for(i = 0 ; i < m - n + 1 ; i ++) {
  12.                         for(j = 0 ; j < n ; j ++) if(s1[i + j] != s2[j]) break ;
  13.                         if(j == n) {
  14.                                 k = i                                          ;
  15.                                 break                                          ;
  16.                         }
  17.                 }
  18.         }               
  19.         printf("%d\n" , k)                                                     ;
  20. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-15 22:51:01 | 显示全部楼层
jackz007 发表于 2021-11-15 22:49
那就再试试这个?

还是超时。。。。。。。。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-15 22:59:38 | 显示全部楼层
本帖最后由 jackz007 于 2021-11-15 23:01 编辑
寂寞知己 发表于 2021-11-15 22:51
还是超时。。。。。。。。。。。。。。


            这个呢?
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         char c , s1[1000000] , s2[1000000]                                     ;
  5.         int i , j , k = -1 , m , n                                             ;
  6.         for(m = 0 ; (c = getchar()) != '\n' ; m ++) s1[m] = c                  ;
  7.         for(n = 0 ; (c = getchar()) != '\n' ; n ++) s2[n] = c                  ;
  8.         if(m >= n && n > 0) {
  9.                 for(i = 0 ; i < m - n + 1 ; i ++) {
  10.                         for(j = 0 ; j < n ; j ++) if(s1[i + j] != s2[j]) break ;
  11.                         if(j == n) {
  12.                                 k = i                                          ;
  13.                                 break                                          ;
  14.                         }
  15.                 }
  16.         }               
  17.         printf("%d\n" , k)                                                     ;
  18. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-15 23:02:05 | 显示全部楼层

还是超时。。。。。。。。       最后那个检测点超时 ,应该还是算法出了问题,有某处跟题不符合吧。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-15 23:05:36 | 显示全部楼层
寂寞知己 发表于 2021-11-15 23:02
还是超时。。。。。。。。       最后那个检测点超时 ,应该还是算法出了问题,有某处跟题不符合吧。。

这已经是我的极限了,希望不会错:
  1. #include <stdio.h>

  2. int kmp(char S[], char W[], int s, int w){
  3.     int P[s], nP = 0, j = 0, k = 0, T[s];
  4.     for(int i = 0; i < s; i++){
  5.         T[i] = -1;
  6.         P[i] = -1;
  7.     }
  8.     while(j < s){
  9.         if(W[k] == S[j]){
  10.             j++;
  11.             k++;
  12.             if(k == w){
  13.                 P[nP] = j-k;
  14.                 nP++;
  15.                 k = T[k];
  16.             }
  17.         }
  18.         else{
  19.             k = T[k];
  20.             if(k < 0){
  21.                 j++;
  22.                 k++;
  23.             }
  24.         }
  25.     }
  26.     for(int i = 0;; i++){
  27.         if(P[i] > 0){
  28.             return P[i];
  29.         }
  30.     }
  31. }

  32. int main()
  33. {
  34.     char A[1000000], B[1000000];
  35.     scanf("%s", A);
  36.     scanf("%s", B);
  37.     int a, b;
  38.     for(a = 0; A[a]; a++){}
  39.     for(b = 0; B[b]; b++){}
  40.     int answer = a > b ? kmp(A, B, a, b) : -1;
  41.     printf("%d", answer);
  42. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-15 23:42:44 | 显示全部楼层
寂寞知己 发表于 2021-11-15 23:02
还是超时。。。。。。。。       最后那个检测点超时 ,应该还是算法出了问题,有某处跟题不符合吧。。


        题目要求使用 KMP 快速模式匹配,我在网上抄了一段代码,现在再试试呢
  1. #include <stdio.h>

  2. void Next(char * T , int * next)
  3. {
  4.         int i = 1 , j = 0 , m                        ;
  5.         next[1] = 0                                  ;
  6.         for(m = 0 ; T[m] ; m ++)                     ;
  7.         while(i < m) {
  8.                 if(j == 0 || T[i - 1] == T[j - 1]) {
  9.                         i ++                         ;
  10.                         j ++                         ;
  11.                         next[i] = j                  ;
  12.                 } else {
  13.                         j = next[j]                  ;
  14.                 }
  15.         }
  16. }

  17. int KMP(char * S , char * T)
  18. {
  19.         int i = 1 , j = 1 , next[10] , m , n         ;
  20.         for(m = 0 ; S[m] ; m ++)                     ;
  21.         for(n = 0 ; T[n] ; n ++)                     ;
  22.         Next(T , next)                               ;
  23.         while(i <= m && j <= n) {
  24.                 if (j == 0 || S[i - 1] == T[j - 1]){
  25.                         i ++                         ;
  26.                         j ++                         ;
  27.                 } else {
  28.                         j = next[j]                  ;
  29.                 }
  30.         }
  31.         if(j > n) return i - n - 1                   ;
  32.         else return -1                               ;
  33. }

  34. int main(void)
  35. {
  36.         char c , s1[1000000] , s2[1000000]                   ;
  37.         int m , n                                            ;
  38.         for(m = 0 ; (c = getchar()) != '\n'; m ++) s1[m] = c ;
  39.         for(n = 0 ; (c = getchar()) != '\n'; n ++) s2[n] = c ;
  40.         s1[m] = s2[n] = '\0'                                 ;
  41.         printf("%d\n" , KMP(s1, s2))                         ;
  42. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 05:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表