C 如何在没有除法的情况下判断一个数是素数还是非素数

C 如何在没有除法的情况下判断一个数是素数还是非素数,c,prime-factoring,C,Prime Factoring,我被告知要用C语言编写一个程序,找出一个数是否为素数并对其进行因式分解。我使用了重复除法,也就是说,我重复地将数字除以从1开始的整数,如果剩余的0不超过2个(1和该数字),则该数字为素数,否则不是。但是我的老师说,如果输入中有大量的数据,程序需要花费很多时间来处理,所以它是错误的。他说要创建一个新程序,但我不明白如果没有这个方法,我怎么能检查一个数字是否为素数,所以请任何人帮助我 我被告知要用C语言编写一个程序,找出一个数是否为素数并对其进行因式分解 开始;忘掉“是素数还是非素数”部分,专注于“

我被告知要用C语言编写一个程序,找出一个数是否为素数并对其进行因式分解。我使用了重复除法,也就是说,我重复地将数字除以从1开始的整数,如果剩余的0不超过2个(1和该数字),则该数字为素数,否则不是。但是我的老师说,如果输入中有大量的数据,程序需要花费很多时间来处理,所以它是错误的。他说要创建一个新程序,但我不明白如果没有这个方法,我怎么能检查一个数字是否为素数,所以请任何人帮助我

我被告知要用C语言编写一个程序,找出一个数是否为素数并对其进行因式分解

开始;忘掉“是素数还是非素数”部分,专注于“因式分解”部分

分解一个数;首先尝试除以最小的素数,然后再除以下一个最小的素数,然后。。。像这样:

    while(value % 2 == 0) {
        printf("2 ");
        value /= 2;
        if(value == 0) {
            goto done;
        }
    }
    while(value % 3 == 0) {
        printf("3 ");
        value /= 3;
        if(value == 0) {
            goto done;
        }
    }
    while(value % 5 == 0) {
        printf("5 ");
        value /= 5;
        if(value == 0) {
            goto done;
        }
    }
这会让人恼火,所以让我们切换到素数数组,可能是这样的:

    unsigned int array[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23 };

    for(index = 0; index < sizeof(array) / sizeof(array[0]); index++) {
        while(value % array[index] == 0) {
            printf("%u ", array[index]);
            value /= array[index];
            if(value == 0) {
                goto done;
            }
        }
    }
done: ;
无符号整数数组[]={2,3,5,7,11,13,17,19,23};
对于(index=0;index
当然,如果只有一个因子,那么你知道这个数是素数,那么让我们加上:

    unsigned int array[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23 };
    int factorCount = 0;

    for(index = 0; index < sizeof(array) / sizeof(array[0]); index++) {
        while(value % array[index] == 0) {
            printf("%u ", array[index]);
            value /= array[index];
            factorCount++;
            if(value == 0) {
                goto done;
            }
        }
    }
done:
    if(factorCount == 1) {
        printf("Yep, that's a prime number\n");
    }
无符号整数数组[]={2,3,5,7,11,13,17,19,23};
整数因子计数=0;
对于(index=0;index
现在,这个数组也会变得很烦人,特别是对于大数(谁想手工写出一个巨大的素数数组?)。最好根据需要生成素数列表


为此,你需要“筛出埃拉托斯坦”。有关说明,请参见:

或更复杂的方法,如…@Dashwuff:Miller-Rabin将有助于有效识别素数,但不能进行因式分解。我们需要知道我们谈论的数字有多大,才能确定哪些因子分解算法是合适的。@Barmar:Eratosthenes的筛子适合于测试许多小数字的素性;修改后的表单也可以对它们进行因子分析(但如果要存储所有这些元素的因子,则需要大量内存)。无论哪种方式,对于需要进行素性测试或只考虑一个大数字的情况,这都不是理想的选择;它用乘法和记忆代替了试除法,但它的伸缩性仍然相对较差,这取决于老师认为的“大”。OP应该看看。@ShadowRanger:Eratosthenes筛的好处是你可以选择一个块大小(例如
10!
,或
1*2*3*4*5*6*7*8*9*10,或3628800),然后一次复制(或循环)整个块,这样你就不需要关心前N个数字;您可以随意增加块大小(例如,从
2!
块开始,复制它3次,并在3中合并以获得
3!
块,然后执行类似的操作以获得
4!
块,然后…,直到内存开始耗尽