2016-03-21 14 views
-1

Bir sayıyı ana çarpanlarına dönüştürecek bir program yapmaya çalışıyorum. Örneğin, 2048 = 2^11 program 211 çıkacaktır (çünkü bu değer farklı bir işlevde kullanılacaktır.). Program daha sonra birincil faktörizasyonu ve bir dosyadaki sayıyı yazdırır. Sorun şu ki, iki işlevi, digitCount ve FdigitCount sahip olmak, bir döngü içinde çalıştırmak ve değerleri dosyadan okumak ve sonra ana faktörleştirmedeki basamakların miktarını normal sayıdaki basamak sayısıyla karşılaştırmaktır. sayıları basmak daha azdır.C: işlevler döngüde çalışmayacak ve bir dosyadan okunamıyor

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

Bir fclose (...) ve bir fopen (...) özledim mi yoksa "append" modunda açılmış bir dosyadan okumaya mı çalışıyorsunuz? –

+1

@MarcoSanfilippo, w + '(okuma/yazma) modunda açılmış gibi görünüyor. – Chad

+0

İki işleviniz aynıdır. Fonksiyonun dışında hiçbir etkisi olmayan sadece isimler farklıdır. Böylece "fdigitCount (frugalNum) purplepsycho

cevap

0

Sen feof() dönene true kadar döngü dosyayı okumak olmamalıdır. EOF'u geçtikten sonra true döndürür ve okuduğunuz son değerler çöp olacaktır. için döngü değiştirin:

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

Ayrıca, ben digitCount() ve fdigitCount() tam olarak aynı şeyi olduğunu fark tutamadı. Neden ikisine de ihtiyacın var?

+0

Teşekkürler, her birinin çıkışını karşılaştırdığımdan beri ikisine de ihtiyacım olduğunu düşündüm. Artık fdigitCount'a ihtiyacım olmadığını anlıyorum. While ifadesindeki == 2 ne anlama geliyor? – zach1198

+0

2 değeri başarıyla okuduğunuzu test ediyor. –