2

我试图在我的程序中找到一个解决方案(修复错误),它必须从定义中计算二项式定理。首先,我创建了“阶乘”-“silnia”的定义。

1) 算法确定定义的SN1(n,k)的值。(牛顿函数)

2) 算法通过公式递归确定SN3(n,k)的值。(newton_rek函数)。

输入: 文件名:In0101.txt

OUTPUT: 文件名:Out0101.txt 在这个文件中我想保存从公式计算出来的值。

示例: In0101.txt

8 2// n k 

Out0101.txt

n=8 k=2
SN1 = 28; count= 14

还有一个我无法修复的错误。有人可以帮我吗?

我的代码:

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

long silnia(int a)
{
    long s;
    if (a == 0 || a == 1)
    {
        return 1;
    }
    else
    {
        s = 1;
        for (int i = 1; i <= a; i++)
        {
            s *= i;
        }
    }
    return s;
}

long newton(int n, int k)
{
    return silnia(n)/(silnia(k)*silnia(n-k));
}

unsigned long int newton_rek(long int n ,long int k)
{
    if ( n == k || k == 0 )
    {
        return 1;
    }

    if (k > n)
    {
        return 0;
    }

    else return newton_rek(n-1,k-1) + newton_rek(n-1,k);
}

int main()
{
    int n = 0;
    int k = 0;
    long funkcja1 = 0;
    long funkcja2 = 0;

    FILE *f = fopen("In0101.txt", "r+");    
    if (f == NULL)
    {
        printf("Nie udalo sie otworzyc pliku In0101.txt\n");
        return 1;
    }
    fread(n, sizeof(long), 1 , f);
    fread(k, sizeof(long), 1 , f);
    fclose(f);

    FILE *ff = fopen("Out0101.txt", "w+");    

    if (ff == NULL)
    {
        printf("Nie udalo sie otworzyc pliku Out0101.txt\n");
        return 1;
    }

    funkcja1 = newton(n,k);
    funkcja2 = newton_rek(n,k);
    fwrite(funkcja1, sizeof(long), 1 , ff);
    fwrite(funkcja2, sizeof(long), 1 , ff);
    fclose(f);

    return 0;
}
4

1 回答 1

4

您的计算都生成了帕斯卡三角形。我做了一个简短的测试:http: //ideone.com/jHA8EJ

我认为你的问题是你没有正确输出。您没有在问题中说明您遇到的问题,因此由于您缺乏描述,人们怀疑这是算法问题。

我相信问题实际上在这里:

fwrite(funkcja1, sizeof(long), 1 , ff);
fwrite(funkcja2, sizeof(long), 1 , ff);

有两点不对:

  1. 您没有获取正在编写的变量的地址。这可能会导致崩溃(也许您可能已经提到过);
  2. 您正在尝试将它们编写为二进制文件,但您似乎期待文本。

您应该将这些调用替换为以下内容:

fprintf( ff, "%d %d\n", funkcja1, funkcja2 );

正如 Daniel Fischer 指出的那样:

地址的东西也适用于读取输入文件(以及字节/文本表示的东西),此外 fread 得到错误的大小参数。

那是:

fread(n, sizeof(long), 1 , f);
fread(k, sizeof(long), 1 , f);

同样的两个原则适用。您正在读取二进制值并且您做错了。相反,阅读文本:

int nvals = fscanf( f, "%d%d", &n, &k );

您应该测试它nvals是 2,这表明两个值都已成功读取。

于 2012-10-29T23:16:26.257 回答