好的,所以我遇到了这个挑战,我必须将所有素数从1打印到100 ...但是我的代码中有一个我找不到的错误,这就是我认为应该解决的方式: 对于从3到100的任何数字,请检查primes数组中是否还有其他数字,用thay除以它。如果有,则不是质数...如果没有,则应将其加到数组中。简单吧? 但是...不起作用..这是我的代码:
#include <stdio.h>
int main()
{
int Primes[50] = {0};
int i,j,k;
Primes[0]=2;
Primes[1]=3;
for(i=3;i<101;i++)
{
for(j=2;j<100;j++)
{
if(i % Primes[j] != 0 && Primes[j] !=0)
{
Primes[j]=i;
}
}
}
printf("Primes array : \n");
for(k=0;k<51;k++)
{
printf("%d ", Primes[k]);
}
return 0;
}
答案 0 :(得分:1)
我们可以假设魔术数不是25 ...即k!= 25,我们可以 将其替换为i <= 100。
#include <stdio.h>
#include <stdlib.h>
int main(void){
int Primes[50] = {0};
int i,j,k = 0;
Primes[0]=2;
Primes[1]=3;
for(i=0; i<=100; i++) {
for(j = 2; j<=i; j++) {
if(i % j == 0 ){
if(i == j)
Primes[k++]=i;
break;
}
}
}
printf("Primes array : \n");
for(int index = 0;index < k; index++) {
printf("%d\n", Primes[index]);
}
return 0;
}
答案 1 :(得分:0)
执行此操作时:
if(i % Primes[j] != 0 && Primes[j] !=0)
{
Primes[j]=i;
}
您说的是“如果当前数字不能被给定的素数整除,请用当前数字替换给定的素数”。这不是你想要的。
您需要检查当前数字是否不能被任何质数整除。因此,您需要遍历素数列表以确保您的数字不能被素数整除,如果是,则将其添加到列表末尾。您可以按照以下步骤进行操作:
int num_primes = 0;
for (i=2;i<101;i++)
{
int is_prime = 1;
for(j=0; j<num_primes && is_prime; j++)
{
if(i % Primes[j] == 0)
{
is_prime = 0;
}
}
if (is_prime) {
Primes[num_primes++] = i;
}
}
在上面的代码中,我们使用num_primes
来计算到目前为止的素数,并使用is_prime
来查看是否发现了将当前数除的素数。将每个数字除以质数时,如果余数为0,则知道该数字不是质数,并将is_prime
设置为0。这也会导致内部循环立即退出。然后,如果is_prime
仍设置在内循环的末尾,则您有一个质数并将其添加到列表的末尾。
在打印循环中您还会遇到一个错误:
for(k=0;k<51;k++)
由于Primes
的大小为50,因此最大的有效索引为49。因此将其更改为:
for(k=0;k<50;k++)
答案 2 :(得分:0)
您使用的算法存在很多问题。将此简单版本用于代码中解决的问题。
int main(void){
int Primes[50] = {0};
int i,j,k = 0 /* use for prime count purpose */;
Primes[0]=2;
Primes[1]=3;
for(i=4 /* 3 is already stored */; k != 48; i++) { /* rotate loop until prime count doesn't reaches 48 */
for(j = 2; j<=i; j++) { /* i is the number you want to check whether its prime or not. SO rotate loop from 2 to "i" */
if(i % j == 0){ /* use i%j not i % Primes[j] as you want to check whether i is prime or not */
if(i == j) /* if its a prime numbur j reaches upto i */
Primes[k++]=i; /* store it */
break; /* comes out of inner loop */
}
}
}
printf("Primes array : \n");
for(int index = 0;index < k; index++) { /* rotate k times not some random 51 times */
printf("%d ", Primes[index]);
}
return 0;
}
答案 3 :(得分:0)
上面的代码实际上并没有提供我们想要的,但是仍然是漂亮的代码。这是经过编辑的代码,其素数从 1到100
int main(void){
int Primes[50] = {0};
int i,j,k = 0 /* use for prime count purpose */;
Primes[0]=2;
Primes[1]=3;
for(i=0 /* 3 is already stored */; k != 25; i++) { /* rotate loop until prime count doesn't reaches 48 */
for(j = 2; j<=i; j++) { /* i is the number you want to check whether its prime or not. SO rotate loop from 2 to "i" */
if(i % j == 0){ /* use i%j not i % Primes[j] as you want to check whether i is prime or not */
if(i == j) /* if its a prime numbur j reaches upto i */
Primes[k++]=i; /* store it */
break; /* comes out of inner loop */
}
}
}
printf("Primes array : \n");
for(int index = 0;index < k; index++) { /* rotate k times not some random 51 times */
printf("%d\n", Primes[index]);
}
return 0;
}