尝试在c程序中创建行的问题

时间:2015-02-14 23:56:26

标签: c loops rows primes

#include <stdio.h>
int prime(int limit,int col);
int main(){        
    int limit,col,count,i;

    printf("Table of Primes\n");
    printf("===============\n");
    printf("Upper limit: ");
    scanf("%d",&limit);
    getchar();
    printf("# of columns: ");
    scanf("%d",&col);

    count=prime( limit,col);

    return 0;
}

int prime(int limit,int col){
    int i,j,w;

    for(w=0;w<col;w++){     
        for(i=2;i<=limit;i++){    
            for(j=2;j<=i;j++){    
                if(i%j==0){    
                    break;    
                }    
            }               
            if(i==j){    
                printf("%d ",i);        
            }    
        }
        printf("\n");
    }       
}

上面的代码是查找2和用户输入数字之间的素数。 我的工作正常,但我的问题是将代码放入列(由列数定义) 我和老师讨论了这个问题,她说我不必使用2D阵列来完成这个任务。 有人可以帮帮我吗?

输出也是配偶看起来像这样:

 Table of Primes
 ===============
 Upper limit:  175
 # of columns: 5
  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 

谢谢。

3 个答案:

答案 0 :(得分:1)

您可以轻松测试列数并打印newline。函数prime()也没有返回值,所以我返回w作为找到的素数。这只是对您prime()功能的轻微调整。

#include <stdio.h>
#include <string.h>

int prime(int limit, int col) {
int i, j, w = 0;
    for (i=2; i<=limit; i++) {
        for (j=2; j<=i; j++) {
            if (i%j == 0) {
                break;
            }
        }
        if (i==j) {
            if (w++ % col == 0)               // test number of columns
                printf("\n");
            printf("%7d", i);                // specify field width
        }
    }
    printf("\n");
    return w;
}

int main(void) {
    prime (173, 5);
    return 0;
}

节目输出:

  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

我让你加上装饰品。

答案 1 :(得分:0)

我建议您使用单独的函数来查找素数并显示素数,这样您就可以更好地控制显示素数:

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

int is_prime (int x);
void prime(int limit, int col);

int main ()
{
    int limit, col;

    printf("Table of Primes\n");
    printf("===============\n");
    printf("Upper limit: ");
    scanf("%d",&limit);
    getchar();
    printf("# of columns: ");
    scanf("%d",&col);

    prime(limit, col);

    printf("\n");

    return 0;
}


int is_prime (int num)
{
    int flag;
    int i;
    double p;

    p = sqrt(num);
    flag = 1;

    if (num == 1)
        return 0;

    if (num == 2)
        return flag;

    if ((num % 2) == 0)
        return 0;

    for (i = 3; i <= p; i += 2)
    {
        if ((num % i) == 0)
        {
            flag = false;
            return flag;
        }
    }

    return flag;
}


void prime (int limit, int column)
{
    int i, j, cnt;;

    cnt = 0;
    for (i = 0; i < limit; i++) {
        if (is_prime(i)) {
            printf("%4d ", i);
            cnt++;
            if ((cnt % column) == 0) {
                printf("\n");
            }
        }
    }
}

当然,您可以将is_prime更改为您自己的功能。

答案 2 :(得分:0)

您可以保留一个变量来计算已打印的数量,每当count % col为col的倍数时,count将为零,这样就可以了

#include <stdio.h>

void prime(int limit, int col);
int readint(const char *const message);

int main()
{
    int limit,col;

    printf("Table of Primes\n");
    printf("===============\n");

    limit = readint("Upper limit");
    col   = readint("# of columns");

    prime(limit, col);

    return 0;
}

int readint(const char *const message)
{
    int value;

    printf("%s> ", message);
    while (scanf("%d", &value) != 1)
    {
        int chr;

        printf("\tinvalid input\n");
        printf("%s> ", message);
        do {
            chr = getchar();
        } while ((chr != EOF) && (chr != '\n'));
    }
    return value;
}

void prime(int limit, int col)
{
    int i, j;
    int count;

    count = 0;
    for (i = 2 ; i <= limit ; i++)
    {
        for (j = 2 ; j <= i ; j++)
        {
            if (i % j == 0)
                break;
        }

        if (i == j)
        {
            count += 1;

            printf("%5d", i);
            if ((count != 0) && (count % col == 0))
                printf("\n");
        }
    }
}

请注意,您的代码无法处理无效输入,我补充说,在此代码中,很多人错误地忽略了scanf()的返回值,这是有原因的。