私は C に不慣れで、「構造体」などのオブジェクトを使用する習慣がありません。単純なプログラムの速度を改善しようとしています: 入力が 2 つのリストで構成されているとします: N 要素の 1 つと M 要素のもう 1 つです。2 番目のリストの各要素について知りたいのですが、最初のリストに表示される場合、出力は 1 になり、そうでない場合は戻り値が 0 になります。最後に、出力は 2 番目のリストの要素が入力された順序で表示されます。
そのため、最初に両方のリストを qsort() で並べ替えてから、各リストを比較しようとしましたが、私のプログラムは異常な結果を出力します。たとえば、M を 2 に固定すると、4 つの数値が出力されます。だからここに私のコードがあります:
#include <stdio.h>
#include <stdlib.h>
//this function detects if the element 'input' is appears in the
//first list called 'c'
//The output returns 0 if not, and the '(i+1)th' place 'input'
//appears in 'c'
int search(int input,int a, int N,int c[N]){
int i;
int res=0;
for(i=a;i<N;i++){
if(input==c[N-1-i]){res=i+1;break;}
else{}
}
return res;
}
//Since we sort each list and since we want the output to appear
//in the order each element the second list's elements were input,
//we define a 'Spec' to keep in mind each index of the second list's
//elements
struct Spec{
int val;
int ind;
};
//function qsort() uses to sort the first list 'c'
int compare (int* a, int* b)
{
return ( *a - *b );
}
//function qsort() uses to sort the second list called 'd'
int comp(const void* a, const void* b)
{
const struct Spec *A = (const struct Spec*) a;
const struct Spec *B = (const struct Spec*) b;
return A->val - B->val;
}
int main()
{
int i;
//the size of the first list 'c'
int N;
scanf("%d",&N);
int rank=0;
//declaring and sorting the first list 'c'
int c[N];
for(i = 0; i < N; ++i)
{scanf("%d", &c[i]);}
qsort (c, N, sizeof(int),compare);
//the size of the second list 'd'
int M;
scanf("%d",&M);
//declaring and sorting the second list 'd'
struct Spec* d;
d = (struct Spec*)calloc(M, sizeof(struct Spec));
for(i = 0; i < M; i++)
{scanf("%d", &d[i].val);}
//initialize the index of the input's elements order
for(i = 0; i < M; i++)
{d[i].ind=i;}
qsort (d, N, sizeof(struct Spec), comp);
//the output will be stored in 'f'
int f[M];
//if the following condition is verified, the the output must
//always be 0
if((d[0].val>c[N-1])||(d[M-1].val<c[0])){
for(i=0;i<M;i++){printf("0");printf("\n");}
}
else{
for (i=0;i<M;i++){
//the output is stored in 'f', and the index to respect
//input's order is then 'd[i].ind'
if((d[i].val<c[0])){f[d[i].ind]=0;}
//if the following condition is verified, the the output must always be 0 for the last 'M-i' outputs
else if((d[i].val>c[N-1]))
{
int j;
for(j=i;j<M;j++)
{
f[d[j].ind]=0;
}
break;
}
else{
//if an element 'd[i]' of the second list 'd'
//appears in the first list 'c', then the output
//stored in 'f' will be '1' and the size of the
//matching (betwenn 'c' and 'd') search can be
//truncated from the first 'rank-1' elements
if(search(d[i].val,rank,N,c)>0){
rank=search(d[i].val,rank,N,c)-1;
f[d[i].ind]=1;
}
else{f[d[i].ind]=0;}
}
}
}
//printing the output
for(i=0;i<M;i++){
printf("%d",f[i]);
printf("\n");
}
}
誰でも助けることができますか?