나는 소수의 배열을 가지고있다. 이 배열의 길이는 1,000,000입니다. 이것은 마지막 요소 소수 [999999]가 100 만 번째 소수를 가져야한다는 것을 의미합니다. 실제로 처음 2 개를 떠난 이후로 1,000,000 번째 소수를 가져야합니다.배열의 정확성을 어떻게 확인할 수 있습니까?
프로그램을 실행하고 배열의 마지막 요소를 뱉어 내면 999,999 번째 소수가 튀어 나옵니다. 나는 C를 배우는 중입니다. 그리고 이것은 제가 수강하는 수학 수업을위한 약간의 숙제 프로젝트입니다. 나는이 문제에 대한 나의 문제 해결에서 어디서부터 시작할 지 전혀 모른다. 어떤 도움이라도 대단히 감사하겠습니다.
편집 : 죄송합니다. 웬일인지 쉽게 대답 할 수 있다고 생각했습니다. 아래 코드를 게시했습니다. 나는 옵션 1에서 소수의 배열을 출력했고 모든 소수는 정확하고 결과는 정확하다. 다른 옵션과 나는 잘못된 출력을 얻을.
void createArray(int, unsigned long long *);
unsigned long long root(unsigned long long);
void print(unsigned long long *, int);
int main(void){
unsigned long long *prime = (unsigned long long *)calloc(SIZE6,
sizeof(unsigned long long));
unsigned long long *ptrEmpty = &prime[15];
unsigned long long i;
unsigned long long j;
long int sizeComp;
int flag = 0;
unsigned long option = 0;
int length = 0;
system("clear");
do{
flag = 0;
option = -1;
printf("Welcome to the prime number finder program. Below are a list "
"of prime numbers\nyou can find as well as their average runni"
"ng time on the Loki system of UNO.\n\nOption 1: Return the 10"
"0th prime number. (Running time: .006s)\nOption 2: Return t"
"he 1000th prime number. (Running time: .008s)\nOption 3: Re"
"turn the 10000th prime number. (Running time: .089s)\nOptio"
"n 4: Return the 100000th prime number. (Running time: 2.188s"
")\nOption 5: Return the 1000000th prime number. (Running ti"
"me: 57.156s)\nOption 6: Return the 10000000th prime number. "
"(**CAUTION!** Running time: 35m51.3s)\n\nEnter the number o"
"f the option you would like the program to\nperform (Enter 0 "
"to exit): ");
scanf("%lu", &option);
switch(option){
case 0:
flag = 1;
break;
case 1:
createArray(SIZE1, prime);
ptrEmpty = &prime[15];
length = SIZE1;
break;
case 2:
createArray(SIZE2, prime);
ptrEmpty = &prime[15];
length = SIZE2;
break;
case 3:
createArray(SIZE3, prime);
ptrEmpty = &prime[15];
length = SIZE3;
break;
case 4:
createArray(SIZE4, prime);
ptrEmpty = &prime[15];
length = SIZE4;
break;
case 5:
createArray(SIZE5, prime);
ptrEmpty = &prime[15];
length = SIZE5;
break;
case 6:
createArray(SIZE6, prime);
ptrEmpty = &prime[15];
length = SIZE6;
break;
default:
printf("Please enter one of the available options (1 - 7) "
"or 0 to exit: ");
flag= 1;
break;
}
if(flag != 1){
for(i = START, sizeComp = 15; sizeComp <= length; i += 2){
flag = 0;
for(j = 0; prime[j] < root(i); j++){
if((i % prime[j]) == 0){
flag = 1;
break;
}
}
if(flag == 0){
*ptrEmpty = i;
++sizeComp;
ptrEmpty++;
}
}
printf("\nThe %dth prime number is %llu.\n\n", length,
prime[ length - 2 ]);
// print(prime, length);
printf("****************************************"
"****************************************\n\n");
}
}while(option != 0);
free(prime);
return 0;
}
void print(unsigned long long *prime, int length){
int i;
printf("\n%4d", 2);
for(i = 0; i < length; i++){
printf("%4llu ", prime[i]);
}
printf("\n");
}
void createArray(int length, unsigned long long *prime){
unsigned long long *pHolder = NULL;
pHolder = (unsigned long long *)realloc(prime, length *
sizeof(unsigned long long));
if(pHolder != NULL){
prime = pHolder;
}else{
free(prime);
printf("Error reallocating memory.\n");
exit(1);
}
prime[0] = 3;
prime[1] = 5;
prime[2] = 7;
prime[3] = 11;
prime[4] = 13;
prime[5] = 17;
prime[6] = 19;
prime[7] = 23;
prime[8] = 29;
prime[9] = 31;
prime[10] = 37;
prime[11] = 41;
prime[12] = 43;
prime[13] = 47;
prime[14] = 53;
}
unsigned long long root(unsigned long long a) {
unsigned long long rem = 0;
unsigned long long root = 0;
int i;
for (i = 0; i < 16; i++) {
root <<= 1;
rem <<= 2;
rem += a >> 30;
a <<= 2;
if (root < rem) {
root++;
rem -= root;
root++;
}
}
return (root >> 1);
}
편집 : 크기 1 = 100, SIZE2 = 1000, SIZE3 = 10000, SIZE4 = 100000, SIZE5 = 1000000, SIZE6 = 10000000
일부 코드를 표시하는 것은 어떻습니까? 우리는 독자들을 신경 쓰지 않습니다. – OldProgrammer
코드를 게시하면 누군가가 버그를 지적 할 가능성이 높습니다. 스스로 알아 내고 싶다면 프로그램이 실행되는 동안'printf'를 사용하여 디버그 정보를 출력 해 볼 수 있습니다. 우선 배열의 시작 부분을 인쇄하여 처음 두 소수를 무시하는지 확인하십시오. – simonc
@OldProgrammer 위의 게시물에 추가 정보와 함께 코드를 추가했습니다. – user1362058