首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么pow函数在C中减少了my循环的长度?

为什么pow函数在C中减少了my循环的长度?
EN

Stack Overflow用户
提问于 2021-12-02 19:35:43
回答 2查看 55关注 0票数 0

我有这样的代码:

代码语言:javascript
复制
#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函数的问题是,每当我使用pow函数将一个参数传递给prime_check时,它就会添加调用菜单,并在循环的中途被卡住。当我不使用pow时,它就能正常工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-02 19:42:03

您的问题在于这段代码:

代码语言:javascript
复制
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()函数的手册页面:

代码语言:javascript
复制
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作为返回值。

要查找这些类型的错误,可以考虑使用以下方法编译代码:

代码语言:javascript
复制
gcc -wall

这将启用所有警告。最好的做法是消除任何编译代码中的所有警告,并在所有警告打开的情况下进行编译。

票数 0
EN

Stack Overflow用户

发布于 2021-12-02 20:40:34

其他非pow()问题:

溢出

i * i <= numINT_MAX附近的素数时,INT_MAX就会溢出。

假素数

prime_check(any value 1 or less)不正确地返回true。

固定

有着温和的甚至测试的改进。

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70205465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档