首页 > 解决方案 > 当我尝试在矩阵中查找素数时,某些数字被错误地更改

问题描述

我尝试在矩阵中找到素数,然后分别用 1 和 0 替换。对于某些输出是正确的,但对于某些输出不正确并且它不会更改最后一个元素。无法弄清楚是什么原因造成的。查找查找素数的公式,它们使用与我相同的循环。

int main() {
    int m, n;
    scanf("%d %d", &m, &n);

    int a[m][n];

    for(int i = 0; i < m; i++) {
        for(int j = 0; j < n; j++) {
            scanf("%d", &a[i][j]);
        }
    }


    for(int i = 0; i < m; i++) {
        for(int j = 0; j < n; j++) {
            for(int k = 2; k < a[i][j]; k++) {
                if(a[i][j] % k == 0) {
                    a[i][j] = 0;
                } else if(a[i][j] % k != 0){
                    a[i][j] = 1;
                }
        }
    }
}

输入:

15 23 7 10 6 18 5 31 31 14 1 2

我得到的输出:

1 1 1 0 0 0 1 1 1 0 1 2

我需要得到的输出:

0 1 1 0 0 0 1 1 1 0 0 1

标签: c

解决方案


作为素数测试的一部分,在数字被标记为非素数后停止迭代。

        int p = a[i][j];
        a[i][j] = p > 1;
        for(int k = 2; k < p; k++) {
            if(p % k == 0) {
                a[i][j] = 0;
                break;
            }
        }

更好的是,无需迭代直到k < p. k*k <= p使用 . 代码可以更快或更好地停止 k <= p/k。考虑是否p接近 1,000,000。与 1,000,000 次循环相比,代码执行最多 1,000 次循环——要快得多。

        // for(int k = 2; k < p; k++) {
        for(int k = 2; k <= p/k; k++) {

推荐阅读