[英]Why does the pow function reduce the length of my loop in C
我有這個代碼:
#include <stdio.h>
#include <math.h>
int check_menu(int menu1)
{
if (menu1 > 3 || menu1 < 0)
return 1;
else
return 0;
}
void menu()
{
int choice, count = 0, count2;
do {
printf("----MENU----\n0 -> Exit\n1 -> Prime time\n2 -> Calander calculating\n3 -> Matrix printing\n");
scanf_s("%d", &choice);
count++;
if (choice < 0 || choice > 3)
printf("%d/5 errors\n", count);
} while (check_menu(choice) == 1 && count <= 4);
determine(choice);
}
int prime_check(int num) {
int i, is_prime = 1;
for (i = 2; i * i <= num; i++) {
if (num % i == 0) {
is_prime = 0;
}
}
return is_prime;
}
void prime_total(int num) {
int prime, germain, marsenne, couss, cousb, twins, twinb, fermat, loop, i;
for (i = -9, loop = num - 9; loop <= num + 9; loop++, i++) {
prime =prime_check(loop),germain=prime_check(2*loop+1),marsenne=prime_check(pow(2, loop)-1),twins=prime_check(loop+2),twinb=prime_check(loop-2),couss=prime_check(loop+4),cousb=prime_check(loop-4);// prime
if (prime == 0)
germain = 0, marsenne = 0, cousb = 0, couss = 0, twins = 0, twinb = 0, fermat = 0;
printf("%3d) %3d|%d|%d|%d|%d|%d|%d|%d|\n",i, loop, prime, germain, marsenne, twinb, twins, cousb, couss);
}
menu();
}
int Prime_time() {
int num;
do {
printf("enter a number (1 - 1000000):\n");
scanf_s("%d", &num);
} while (num < 1 || num > 1000000);
prime_total(num);
}
int determine(int choice) {
if (choice == 1)
Prime_time();
}
void main()
{
menu();
}
}
我遇到的問題是 prime_total function 問題是,每當我使用 pow function 將參數傳遞給 prime_check 時,它就會調用菜單並在循環中途卡住。 當我不使用 pow 時,它工作正常。
您的問題出在這段代碼中:
void prime_total(int num) {
int prime, germain, marsenne, couss, cousb, twins, twinb, fermat, loop, i;
for (i = -9, loop = num - 9; loop <= num + 9; loop++, i++) {
prime =prime_check(loop),germain=prime_check(2*loop+1),marsenne=prime_check(pow(2, loop)-1),twins=prime_check(loop+2),twinb=prime_check(loop-2),couss=prime_check(loop+4),cousb=prime_check(loop-4);// prime
if (prime == 0)
germain = 0, marsenne = 0, cousb = 0, couss = 0, twins = 0, twinb = 0, fermat = 0;
printf("%3d) %3d|%d|%d|%d|%d|%d|%d|%d|\n",i, loop, prime, germain, marsenne, twinb, twins, cousb, couss);
}
menu();
}
如果您考慮pow()
function 的手冊頁:
NAME
pow -- power function
SYNOPSIS
#include <math.h>
double
pow(double x, double y);
long double
powl(long double x, long double y);
float
powf(float x, float y);
請注意, int
不是用於調用或處理其中任何一個返回的類型。 事實上,通過使用pow()
您期望double
精度值作為返回值。
要查找這些類型的錯誤,您可以考慮使用以下代碼編譯代碼:
gcc -wall
這將啟用所有警告。 最佳做法是消除任何已編譯代碼中的所有警告並在所有警告打開的情況下進行編譯。
其他非pow()
問題:
溢出
當num
是INT_MAX
附近的素數時, i * i <= num
將溢出。
假素數
prime_check(any value 1 or less)
錯誤地返回 true。
固定的
適度的測試改進。
bool prime_check(int num) {
if (num % 2 == 0) {
return num == 2;
}
for (i = 3; i <= num/i; i += 2) {
if (num % i == 0) {
return false;
}
}
return num >= 2;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.