#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,它不会被初始化。
我不确定你的代码中的逻辑是否正确,但是修复这个未定义的行为应该消除你观察到的“奇怪”错误。

10-07 19:32
查看更多