C語言考試~只能使用C語言寫

2007-06-23 3:13 am
設計依個程式輸入任何字串,若該字串重複性時則顯示 " YES " ,否則顯示 " NO " 例:輸入為BASBAS輸出為YES

回答 (3)

2007-06-23 9:24 am
✔ 最佳答案
題意不清:
abcdabff 算不算有重複性?

因此,我寫了 2 個副程式。
isRepeating 算 abcabcabc 這類全程重覆的。
(註:上面列位程式都只考慮 2 次,這種 3 次的也是重覆!)

hasRepeat 算〝有〞就好。
 若把 abcaff 的 a 算〝有重複,有點可笑!
 所以,要2個字母起,才算重覆。

#include <stdio.h>
#include <string.h>


int isRepeating(char *str)
{ int i, j, l;

l = strlen(str);
for (i=1; i<=l>>1; i++)
{ if (l%i) continue;
if (strncmp(str, &str[i], i)) continue;
for (j=i<<1; j<=l-i; j+=i)
if (strncmp(str, &str[j], i)) return 0;
return i;
}
return 0;
}


int hasRepeat(char *str)
{ int i, j, k, l;

l = strlen(str);
for (i=1; i<l; i++)
for (j=0; j<i; i++)
for (k=i; k>1; k--) // length of repatting
if (!strncmp(&str[j], &str[i], k))
return k;

return 0;
}


int main(void)
{ char s[256];
int i;

printf("Please enter a string: ");
gets(s);

i = isRepeating(s);

printf(i ? "YES\n" : "NO\n");

if (i) printf("This string is repeating %d times.\n", strlen(s)/i);
else printf("This string does not repeat.\n");

printf(hasRepeat(s) ? "YES\n" : "NO\n");

return 0;
}

2007-06-23 05:54:35 補充:
hasRepeat 在速度上並未最佳化。
它只是寫成較好理解的方式。
(它接近 O(n^3)!
 哇!是Compiler 在要處理最佳化 時的複雜度!)
2007-06-23 5:54 am
//Power by Visual Studio 2005
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#ifndef _MAX_ENV
#define _MAX_ENV 32767
#endif
int main(int argc, char* argv[]){
//==========START==========//
int length,i,flag=1;
char string[_MAX_ENV];
printf("Input a string: "),scanf("%s",string);
if(!((length=(int)strlen(string))&1)){
for(i=0;i<(length>>1);i++){
if(string[i]!=string[(length>>1)+i]){
flag=0;
}
}
printf("string repeat= %s\n",(flag?"YES":"NO"));
}
//==========END==========//
printf("\n"),system("PAUSE");
return 0;
}
2007-06-23 4:47 am
#include <stdio.h>
#include <string.h>
int isdup(char *p){
int len=strlen(p);
if (len&1==1) return 0; //若字串長度為奇數,傳回0
len/=2;
for (int i=0;p[i]==p[i+len];i++);
return (i==len)?1:0; //重複傳回1,否則傳回0
}
int main(){
char str[81];
printf("Enter a string: ");
gets(str);
if (isdup(str)) printf("YES\n");
else printf("NO\n");
}

2007-06-23 02:32:39 補充:
若把一個程式呼叫的函式 inline到主程式內,把除以2改用右移一位元,把分開的述句合併成一行,把原先呼叫函式傳回值改用一個變數來取代,「而程式的演算邏輯及流程相似度幾達百分之百」,內行人一看便知這是什麼行為!!
模仿是初學者學習的方式之一,但絕不是一個進階者應有的作為,何況還大搖大擺的拿出來現!!


收錄日期: 2021-04-27 17:13:37
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20070622000016KK08012

檢視 Wayback Machine 備份