浮点运动例外(C语言)

时间:2014-07-09 10:31:38

标签: c string pointers floating-point-exceptions

我刚刚创建了一个实现二项式函数的程序(n!/k!*(n-k)!)

我可以毫无问题地编译我的程序,但是当我扫描2 int(n和k)时,它会说"浮点异常"。

我已经尝试了很多方法来解决这个问题,但我无法找到问题,因为我对c编程并不擅长:(我正在学习。 有人可以帮帮我吗? 非常感谢你。

#include <stdio.h>
#include <stdlib.h>

int factorial( int n ){
    int result;
    if( n == 0 ){
        result = 0;
    } else {
        result = n * factorial((n - 1));
    }
    return result;
}

char *stringa_binomiale(int n, int k){

    char *s;
    s=malloc(sizeof(char)*20);

    int b;

    b = factorial(n)/(factorial(k)*factorial(n-k));

    sprintf(s,"%i su %i fa %i",n ,k ,b);

    return s;
}

int main (void){

    int n;
    int k;
    char *s;
    s=malloc(sizeof(char)*20);

    printf("n:");
    scanf("%i",&n);
    printf("k:");
    scanf("%i",&k);

    s= stringa_binomiale(n,k);
    printf("%s \n", stringa_binomiale(n, k));

    free(s);
    return 0;
}

4 个答案:

答案 0 :(得分:1)

对于任何输入,您的factorial函数始终返回0,因为基本情况是错误的。您的基本案例会返回0,当您乘以此基础时,您会获得0

因此,您在0中除以stringa_binomiale,这会导致浮点异常。

基本情况应为n == 1,并且应返回1

答案 1 :(得分:0)

什么能给FPE? :)

提示:尝试打印“阶乘”功能的输出..

解决方案:“factorial”函数始终返回0,并且其返回值用于除法。 N!如果n为0,则为1:改变该行,你就没事了。

答案 2 :(得分:0)

您的factorial函数始终返回0,因此除以0正在提供floating point exception

factorial函数应为

int factorial( int n ) {
  int result;
  if( n == 0 ){
    result = 1;
  } else {
    result = n * factorial((n - 1));
  }
  return result;
 }

这是链接http://ideone.com/CTKDyX ..

答案 3 :(得分:0)

整数除以零也会将报告作为“浮点异常”。不知道为什么会这样,可能有历史原因。

如果您的C编译器足够新,则应使用“-fsanitize = undefined”进行编译。对于很多C错误,你会得到运行时消息而不是奇怪的行为,包括这个错误。