2015-08-24 38 views
0
#include <stdio.h> 
#include<string.h> 
int find(char a[],int p,int q,char t){ 
int l=strlen(a); 
int k,m,n; 
if(p==q){ 
    if(a[0]==t)return 1; 
    else return 0;} 
    if(p<q){ 
    int mid=p+q/2; 
    m=find(a,p,mid,t); 
    n=find(a,mid+1,q,t); 
    if(m>n)return m; 
    else 
     return n; 
     } 
    if(p>q)return 0; 
     } 

int main() 
{ 
int test,j,k,i,l,s=0; 
char a[200],tc='a'; 
scanf("%d",test); 
while(test--){ 
s=0; 
tc='a'; 
scanf("%d",&a); 
l=strlen(a); 
if(l<26){ 
    printf("NO\n"); 
    continue; 
} 
for(i=1;i<=26;i++){ 
    j=find(a,0,l,tc); 
    if(j==1)s++; 
    tc++; 
} 
if(s==26)printf("YES"); 
else printf("NO\n"); 
} 
return 0; 
} 

問題是:一個字符串被認爲是完整的,如果它包含從a到z的所有字符。給定一個字符串,檢查它是否完整。我嘗試了分而治之的技術。爲什麼我得到一個運行時錯誤?爲什麼我得到運行時錯誤?

回答

0

我會添加一些printf到你的查找函數來檢查它是否正確應用了分而治之。

對我來說,你的計算中旬看起來錯誤:

int mid=p+q/2; 

應該

int mid=p+((q-p)/2); 
2

你已經錯過了一些支撐。我把整個代碼放在這裏,以便更好地理解。

#include <stdio.h> 
#include<string.h> 
int find(char a[],int p,int q,char t) 
{ 
int l=strlen(a); 
int k,m,n; 
if(p==q) 
{ 
    if(a[0]==t)return 1; 
    else return 0; 
} 
if(p<q){ 
int mid=p+q/2; 
m=find(a,p,mid,t); 
n=find(a,mid+1,q,t); 
if(m>n){ 
     return m; 
     } 
} 
else{ 
     return n; 
    } 
if(p>q) 
{ 
     return 0; 
} 
} 

int main() 
{ 
int test,j,k,i,l,s=0; 
char a[200],tc='a'; 
scanf("%d",test); 
while(test--){ 
s=0; 
tc='a'; 
scanf("%d",&a); 
l=strlen(a); 
if(l<26){ 
printf("NO\n"); 
continue; 
} 
for(i=1;i<=26;i++){ 
    j=find(a,0,l,tc); 
if(j==1)s++; 
tc++; 
} 
    if(s==26) 
    { 
    printf("YES"); 
    } 
    else{ 
    printf("NO\n"); 
    } 
} 
system("pause"); 
return 0; 
} 
相關問題