【问题标题】:issues trying to make rows in c program尝试在 c 程序中创建行的问题
【发布时间】:2015-02-14 23:56:25
【问题描述】:
#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 和用户输入的数字之间的质数数量。 我的工作正常,但我的问题是将代码放入列中(由列数定义) 我和我的老师讨论过这个问题,她说我不必使用二维数组来完成这个。 谁能帮帮我?

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

 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 

谢谢。

【问题讨论】:

    标签: c loops rows primes


    【解决方案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
    

    我让你来添加装饰。

    【讨论】:

    • 非常感谢,这非常有帮助!我感觉这和我的函数 prime 的返回值有点关系
    【解决方案2】:

    我建议您分别创建查找素数和显示素数的函数,以便您可以更好地控制显示这些素数:

    #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 改成你自己的函数。

    【讨论】:

    • 谢谢。这是我的另一个想法,但由于研讨会建议我只使用一个功能,包括主功能,所以我担心这会成为评分问题。无论如何,这是一个很大的帮助。我一定要用这个作为参考。
    【解决方案3】:

    您可以保留一个变量来计算打印了多少个数字,然后每次count 是 col 的倍数时,count % col 将为零,所以这会起作用

    #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() 的返回值,这是有原因的。

    【讨论】:

    • 谢谢,我是 C 编程新手。您的编辑有助于进一步了解无效输入。这周我其实正要在学校学习指针,这肯定会有所帮助!
    猜你喜欢
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2020-06-20
    • 2020-12-11
    • 2012-10-01
    • 1970-01-01
    相关资源
    最近更新 更多