#include <stdio.h>
#include <stdlib.h>
int factor(int n, int k, int v[], int *check){
int i=0;
if (n==1) {
*check=1;
return 1;
}
while (i<k && *check!=1){
if (n%v[i]==0) factor(n/v[i], k, v, check);
i++;
}
if (*check==1) return 1;
else return 0;
}
int fac(int n, int k, int v[]){
int check;
return factor(n,k,v,&check);
}
int main(){
int i,k, temp;
int P[2]={2,3};
int A[100];
for (i=1; i<20;i++) A[i]=0;
for (i=1; i<20;i++) {
temp=fac(i,2,P);
if(temp==1) {/*printf("%d ", temp);*/ A[i]=6; }
}
printf("\n");
for (i=1; i<20;i++) printf("%d ", A[i]);
return 1;
}
此函数查找可表示为2和3的乘积的整数
最佳答案
像这样的问题通常意味着某个地方存在未定义的行为。为了及早发现问题,请始终在启用警告的情况下编译;例如,如果使用g cc,请始终至少提供-Wall
标志(并且-O3
通常有助于获得更多警告,因为编译器更彻底地分析代码)。
这是我编译代码时的输出:
gcc -Wall -O3 my.c
my.c: In function ‘fac’:
my.c:19:7: warning: ‘check’ may be used uninitialized in this function [-Wmaybe-uninitialized]
int check;
^
因此,正如它指出的,变量
check
没有初始化。恐怕你的目的是用这个片段来初始化它: if (n==1) {
*check=1;
return 1;
}
但它不是这样工作的:下一次调用
fac
时,会有一个新的局部变量check
,它不会被初始化。我不确定你的代码中的逻辑是否正确,但是修复这个未定义的行为应该消除你观察到的“奇怪”错误。