2016-03-21 1 views
-1

数字を素因数分解に変換するプログラムを作成しようとしています。たとえば、2048 = 2^11の場合、プログラムは211を出力します(この値は別の関数で使用されるため)。プログラムは、素因数分解と数値をファイルに出力します。私が抱えている問題は、digitCountとFdigitCountという2つの関数をループで実行し、ファイルから値を読み込み、素因数分解の桁数を通常の数字の桁数と比較し、数字が少なくなる。C:関数がループで実行されず、ファイルから読み込まれない

int digitCount(int n){ 
    int digits = 0; 
    while(n!=0) { 
     n/=10;    //divides the number by 10 and adds one to the digits until it is no longer divisible by 10. 
     ++digits; 
    } 
    return digits; 
} 

int fdigitCount(int p){ //this function is used the count the digits of the prime factorization. 
    int fdigits = 0; 
    while(p!=0) { 
     p/=10;    //divides the number by 10 and adds one to the fdigits until it is no longer divisible by 10. 
     ++fdigits; 
    } 
    return fdigits; 
} 


int main(void) { 
    FILE* primes = NULL; //file pointer to the file that will contain all the prime factors of a number 
    int num; 
    int count; 
    int digits; 
    int limit; 
    int i; 
    int j=2; 
    int fdigits; 
    int frugalNum; 
    int normNum; 

    primes = fopen("primes.txt", "w+"); 
    if (primes == NULL){ 
     printf("Could not open primes.txt"); 
    } 

    printf("Enter a limit: "); 
    scanf("%d", &limit); 
    for (i=2; i <= limit; i++){ 
     num = i; 
     j = i; 
     count = 0; 
     if (num%2 == 0){ 
      while (num%2 == 0) 
      { 
       num = num/2; 
       count++; 
      } 
      if (count > 1){ 
       fprintf(primes, "2%d", count); 
      } 
      else { 
       fprintf(primes, "2"); 
      } 
     } 
     else if(num%2 != 0) { 
      for (int i = 3; i <= sqrt(num); i = i+2) 
      { 
       // While i divides n, print i and divide n 
       count = 0; 
       while (num%i == 0) 
       { 
        num = num/i; 
        count++; 
       } 
       if (count > 1){ 
        fprintf(primes, "%d%d", i, count); 
       } 
       else if (count==1){ 
        fprintf(primes, "%d", i); 
       } 
      } 

     } 
     if (num > 2){ 
      fprintf (primes, "%d", num); 
     } 
     fprintf(primes, " %d", j); 
     fprintf(primes, "\n"); 
    } 
    while (!feof(primes)){ 
     fscanf(primes, "%d %d", &frugalNum, &normNum); 
     if (fdigitCount(frugalNum) < digitCount(normNum)){ 
      printf("%d\n", normNum); 
     } 
    } 
    fclose(primes); 
    return 0; 
} 
+0

fclose(...)とfopen(...)が見つからなかったか、または「追加」モードでまだ開いているファイルから読み込もうとしましたか? –

+1

@MarcoSanfilippoは、彼が 'w +'(読み取り/書き込み)モードで開いたようです。 – Chad

+0

あなたの2つの機能は同じです。名前のみが異なり、機能の外には何の効果もありません。したがって、 'fdigitCount(frugalNum) purplepsycho

答えて

0

あなたはfeof()戻りtrueまでループしてファイルを読み込むべきではありません。あなたがEOFを渡した後にはtrueを返します。最後に読んだ値はゴミになります。あなたのループを変更します。

while (fscanf(primes, "%d %d", &frugalNum, &normNum) == 2) { 
    /* Do stuff with frugalNum and normNum */ 
} 

また、私はdigitCount()fdigitCount()はまったく同じことを行うことを気付いて助けることができませんでした。なぜあなたはそれらの両方が必要なのですか?

+0

ありがとう、私はそれぞれの出力を比較していたので、私はそれらの両方が必要だと思った。今私はfdigitCountは必要ないと分かります。 whileステートメントの== 2はどういう意味ですか? – zach1198

+0

2つの値が正常に読み込まれていることをテストしています。 –

関連する問題