心鲜旅人 发表于 2020-3-1 11:08:06

刚会写一个算数学题的小程序就漏洞百出。

没错,还是那个抓着 独立性检验 不放的我{:10_266:}。今天我把程序完善了一下,
这是第一版:
#include <stdio.h>

int main()
{
        long long int a;
        long long int b;
    long long int c;
        long long int d;
        long long int n;
        float k2;
       
        printf("欢迎使用心鲜旅人自制独立性检验程序!\n");
        printf("请输入a:");
        scanf("%I64d",&a);
        printf("请输入b:");
        scanf("%I64d",&b);
        printf("请输入c:");
        scanf("%I64d",&c);
        printf("请输入d:");
        scanf("%I64d",&d);
       
        n = a + b + c + d;
        k2 = 1.0 * n * (a * d - b * c) * (a * d - b * c) / ((a + b) * (c + d) * (a + c) * (b + d));
       
        printf("K2 = %.3f\n",k2);
       
        if (k2 >= 0.455 && k2 < 0.708)
        {
                printf("P(%.3f >= 0.455) = 0.50",k2);
        }
        else if (k2 >= 0.708 && k2 < 1.323)
        {
                printf("P(%.3f >= 0.708) = 0.40",k2);
        }
        else if (k2 >= 1.323 && k2 < 2.072)
        {
                printf("P(%.3f >= 1.323) = 0.25",k2);
        }
        else if (k2 >= 2.072 && k2 < 2.706)
        {
                printf("P(%.3f >= 2.072) = 0.15",k2);
        }
        else if (k2 >= 2.706 && k2 < 3.841)
        {
                printf("P(%.3f >= 2.706) = 0.10",k2);
        }
        else if (k2 >= 3.841 && k2 < 5.024)
        {
                printf("P(%.3f >= 3.841) = 0.05",k2);
        }
        else if (k2 >= 5.024 && k2 < 6.635)
        {
                printf("P(%.3f >= 5.024) = 0.025",k2);
        }
        else if (k2 >= 6.635 && k2 < 7.879)
        {
                printf("P(%.3f >= 6.635) = 0.010",k2);
        }
        else if (k2 >= 7.879 && k2 <10.828)
        {
                printf("P(%.3f >= 7.879) = 0.005",k2);
        }
        else if (k2 >= 10.828)
        {
                printf("P(%.3f >= 10.828) = 0.001",k2);
        }
        else if (k2 >= 0 && k2 < 0.455)
        {
                printf("P(%.3f < 0.455) < 0.50(我也只能这样说了)",k2);
        }
        else
        {
                printf("负的???!!你丫的逗我呢!!!");
        }
       
        return 0;
}
最初,用起来还不错,之后又改了一版:
#include <stdio.h>

int main()
{
        unsigned long long int a;
        unsigned long long int b;
        unsigned long long int c;
        unsigned long long int d;
        unsigned long long int n;
        float k2;
       
        printf("欢迎使用心鲜旅人秘制独立性检验小程序!\n");
        printf("请输入a:");
        scanf("%I64u",&a);
        printf("请输入b:");
        scanf("%I64u",&b);
        printf("请输入c:");
        scanf("%I64u",&c);
        printf("请输入d:");
        scanf("%I64u",&d);
       
        n = a + b + c + d;
        k2 = 1.0 * n * (a * d - b * c) * (a * d - b * c) / ((a + b) * (c + d) * (a + c) * (b + d));
       
        printf("K2 = %.3f\n",k2);
       
        if (k2 >= 0.455 && k2 < 0.708)
        {
                printf("P(K2 >= 0.455) = 0.50");
        }
        else if (k2 >= 0.708 && k2 < 1.323)
        {
                printf("P(K2 >= 0.708) = 0.40");
        }
        else if (k2 >= 1.323 && k2 < 2.072)
        {
                printf("P(K2 >= 1.323) = 0.25");
        }
        else if (k2 >= 2.072 && k2 < 2.706)
        {
                printf("P(K2 >= 2.072) = 0.15");
        }
        else if (k2 >= 2.706 && k2 < 3.841)
        {
                printf("P(K2 >= 2.706) = 0.10");
        }
        else if (k2 >= 3.841 && k2 < 5.024)
        {
                printf("P(K2 >= 3.841) = 0.05");
        }
        else if (k2 >= 5.024 && k2 < 6.635)
        {
                printf("P(K2 >= 5.024) = 0.025");
        }
        else if (k2 >= 6.635 && k2 < 7.879)
        {
                printf("P(K2 >= 6.635) = 0.010");
        }
        else if (k2 >= 7.879 && k2 <10.828)
        {
                printf("P(K2 >= 7.879) = 0.005");
        }
        else if (k2 >= 10.828)
        {
                printf("P(K2 >= 10.828) = 0.001");
        }
        else
        {
                printf("P(K2 < 0.455) < 0.50(我也只能这样说了)");
        }

       
        return 0;
}
可这一版就崩了,算不出来正确答案。{:10_266:}
找了半天找不到bug,我就放弃了,反正第一版能用就行啦。{:10_250:}
可后来做了个题,是50 1000 75 1500,算出来是0.000,我就又崩溃了。{:10_266:}
这不能是取值问题吧,我都用了long long了啊。大神求解{:10_254:}

EthanHsiung 发表于 2020-3-1 12:00:36

高中的独立性检验?没有问题啊,50 1000 75 1500算出来k2确实为零,说明没有把握判定两者有关联。

心鲜旅人 发表于 2020-3-1 16:00:38

EthanHsiung 发表于 2020-3-1 12:00
高中的独立性检验?没有问题啊,50 1000 75 1500算出来k2确实为零,说明没有把握判定两者有关联。

抱歉,这写错了,是75.5,好啦{:10_281:}这个不是重点啦,我就是想问我第二版哪错了。

EthanHsiung 发表于 2020-3-1 16:40:40

心鲜旅人 发表于 2020-3-1 16:00
抱歉,这写错了,是75.5,好啦这个不是重点啦,我就是想问我第二版哪错了。

是75.5的话,和定义的unsigned long long int长整型不一致,应该是这个原因。

心鲜旅人 发表于 2020-3-1 21:07:16

EthanHsiung 发表于 2020-3-1 16:40
是75.5的话,和定义的unsigned long long int长整型不一致,应该是这个原因。

兄弟,这个我知道,这也是为啥我打错成75的原因,你换个数试试,结果的数能吓死你

EthanHsiung 发表于 2020-3-2 08:13:55

心鲜旅人 发表于 2020-3-1 21:07
兄弟,这个我知道,这也是为啥我打错成75的原因,你换个数试试,结果的数能吓死你

我找了几道例题试了一下,结果没问题。可能是编译器不支持unsigned long long int

心鲜旅人 发表于 2020-3-2 11:11:08

EthanHsiung 发表于 2020-3-2 08:13
我找了几道例题试了一下,结果没问题。可能是编译器不支持unsigned long long int

{:10_284:}可兄弟,我这这套程序就能用啊
#include <stdio.h>
#include <math.h>

int main()
{
        unsigned long long int sum =0;
        unsigned long long int temp;
        unsigned long long int weight;
        int i;
       
        for (i = 0; i < 64; i++)
        {
                temp = pow(2,i);
                sum = sum + temp;
        }
        weight = sum / 25000;
       
        printf("舍罕王应该给予达依尔%I64u粒麦子\n",sum);
        printf("如果每25000粒麦子为1kg,那么应该给%I64u公斤麦子!\n",weight);
       
        return 0;
}
页: [1]
查看完整版本: 刚会写一个算数学题的小程序就漏洞百出。