1

入力として 2 つの整数 (m と n) を取り、それらの間のすべての素数をファイルに書き込むプログラムを作成しました。出力をきれいに見せたかったので、field-width 修飾子を使用して各数値を 7 スペース幅で出力し、1 行あたり 10 だけ出力しました。出力は、最初の行を除いて予想どおりで、9 つの数字のみが出力されます。
コードは次のとおりです。

#include <stdio.h>
#include <math.h>

#define SIZE 100000000

char primes[SIZE];

void seive(void)
{
    int i, j;
    primes[1] = primes[0] = 1;
    for (i=3;i<=sqrt(SIZE);i+=2)           
        if (primes[i] == 1)
            continue;
        else 
            for (j=i*i;j<SIZE;j+=2*i)
                primes[j] = 1;
}

int main()
{
    int n, m, count;
    FILE *fp;
    fp = fopen("test.txt", "w");
    seive();
    scanf("%d %d", &m, &n);
    count = 0;
    if (m <= 2) {
       fprintf(fp, "%7d ", 2);
       count++;
       }
    if (!(m & 1))
       m++;
    for (m;m<=n;m+=2) {
        if (!primes[m]) {
           count++;
           if (count == 10) {
              fprintf(fp, "\n");
              count = 0;
           }
           fprintf(fp, "%7d ", m);
        }
    }
    return 0;
}

これは、入力 1 300 の出力です。

      2       3       5       7      11      13      17      19      23 
     29      31      37      41      43      47      53      59      61      67 
     71      73      79      83      89      97     101     103     107     109 
    113     127     131     137     139     149     151     157     163     167 
    173     179     181     191     193     197     199     211     223     227 
    229     233     239     241     251     257     263     269     271     277 
    281     283     293   

ご覧のとおり、最初の行には 9 つの数字しか表示されていませんが、その後は正常に表示されています。私は困惑しています。前もって感謝します。

4

2 に答える 2

2

ループで出力を印刷する前に改行を印刷するという事実と関係があると思います。

次のように変更します。

for (m;m<=n;m+=2) {
    if (!primes[m]) {
       count++;

       fprintf(fp, "%7d ", m);

       if (count == 10/*&& you're going to print more numbers*/) {
          fprintf(fp, "\n");
          count = 0;
       }
    }
}
于 2012-12-17T20:16:16.950 に答える
1
count = 0;
if (m <= 2) {
   fprintf(fp, "%7d ", 2);
   count++;
   }

これにより、行が開始され、エントリが出力され、 count1 にインクリメントされます。

    if (!primes[m]) {
       count++;
       if (count == 10) {
          fprintf(fp, "\n");
          count = 0;
       }
       fprintf(fp, "%7d ", m);

これにより、行が開始され、エントリが出力され、countゼロに設定されます。

2 つのコード セクションcountが異なる値 (1 つずれる) に設定されているため、 は行ごとに異なる数のエントリを生成します (1 つずれる)。

于 2012-12-17T20:14:46.537 に答える