鱼C论坛

 找回密码
 立即注册
查看: 2028|回复: 6

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

[复制链接]
发表于 2020-3-1 11:08:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

  2. int main()
  3. {
  4.         long long int a;
  5.         long long int b;
  6.     long long int c;
  7.         long long int d;
  8.         long long int n;
  9.         float k2;
  10.        
  11.         printf("欢迎使用心鲜旅人自制独立性检验程序!\n");
  12.         printf("请输入a:");
  13.         scanf("%I64d",&a);
  14.         printf("请输入b:");
  15.         scanf("%I64d",&b);
  16.         printf("请输入c:");
  17.         scanf("%I64d",&c);
  18.         printf("请输入d:");
  19.         scanf("%I64d",&d);
  20.        
  21.         n = a + b + c + d;
  22.         k2 = 1.0 * n * (a * d - b * c) * (a * d - b * c) / ((a + b) * (c + d) * (a + c) * (b + d));
  23.        
  24.         printf("K2 = %.3f\n",k2);
  25.        
  26.         if (k2 >= 0.455 && k2 < 0.708)
  27.         {
  28.                 printf("P(%.3f >= 0.455) = 0.50",k2);
  29.         }
  30.         else if (k2 >= 0.708 && k2 < 1.323)
  31.         {
  32.                 printf("P(%.3f >= 0.708) = 0.40",k2);
  33.         }
  34.         else if (k2 >= 1.323 && k2 < 2.072)
  35.         {
  36.                 printf("P(%.3f >= 1.323) = 0.25",k2);
  37.         }
  38.         else if (k2 >= 2.072 && k2 < 2.706)
  39.         {
  40.                 printf("P(%.3f >= 2.072) = 0.15",k2);
  41.         }
  42.         else if (k2 >= 2.706 && k2 < 3.841)
  43.         {
  44.                 printf("P(%.3f >= 2.706) = 0.10",k2);
  45.         }
  46.         else if (k2 >= 3.841 && k2 < 5.024)
  47.         {
  48.                 printf("P(%.3f >= 3.841) = 0.05",k2);
  49.         }
  50.         else if (k2 >= 5.024 && k2 < 6.635)
  51.         {
  52.                 printf("P(%.3f >= 5.024) = 0.025",k2);
  53.         }
  54.         else if (k2 >= 6.635 && k2 < 7.879)
  55.         {
  56.                 printf("P(%.3f >= 6.635) = 0.010",k2);
  57.         }
  58.         else if (k2 >= 7.879 && k2 <10.828)
  59.         {
  60.                 printf("P(%.3f >= 7.879) = 0.005",k2);
  61.         }
  62.         else if (k2 >= 10.828)
  63.         {
  64.                 printf("P(%.3f >= 10.828) = 0.001",k2);
  65.         }
  66.         else if (k2 >= 0 && k2 < 0.455)
  67.         {
  68.                 printf("P(%.3f < 0.455) < 0.50(我也只能这样说了)",k2);
  69.         }
  70.         else
  71.         {
  72.                 printf("负的???!!你丫的逗我呢!!!");
  73.         }
  74.        
  75.         return 0;
  76. }
复制代码

最初,用起来还不错,之后又改了一版:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         unsigned long long int a;
  5.         unsigned long long int b;
  6.         unsigned long long int c;
  7.         unsigned long long int d;
  8.         unsigned long long int n;
  9.         float k2;
  10.        
  11.         printf("欢迎使用心鲜旅人秘制独立性检验小程序!\n");
  12.         printf("请输入a:");
  13.         scanf("%I64u",&a);
  14.         printf("请输入b:");
  15.         scanf("%I64u",&b);
  16.         printf("请输入c:");
  17.         scanf("%I64u",&c);
  18.         printf("请输入d:");
  19.         scanf("%I64u",&d);
  20.        
  21.         n = a + b + c + d;
  22.         k2 = 1.0 * n * (a * d - b * c) * (a * d - b * c) / ((a + b) * (c + d) * (a + c) * (b + d));
  23.        
  24.         printf("K2 = %.3f\n",k2);
  25.        
  26.         if (k2 >= 0.455 && k2 < 0.708)
  27.         {
  28.                 printf("P(K2 >= 0.455) = 0.50");
  29.         }
  30.         else if (k2 >= 0.708 && k2 < 1.323)
  31.         {
  32.                 printf("P(K2 >= 0.708) = 0.40");
  33.         }
  34.         else if (k2 >= 1.323 && k2 < 2.072)
  35.         {
  36.                 printf("P(K2 >= 1.323) = 0.25");
  37.         }
  38.         else if (k2 >= 2.072 && k2 < 2.706)
  39.         {
  40.                 printf("P(K2 >= 2.072) = 0.15");
  41.         }
  42.         else if (k2 >= 2.706 && k2 < 3.841)
  43.         {
  44.                 printf("P(K2 >= 2.706) = 0.10");
  45.         }
  46.         else if (k2 >= 3.841 && k2 < 5.024)
  47.         {
  48.                 printf("P(K2 >= 3.841) = 0.05");
  49.         }
  50.         else if (k2 >= 5.024 && k2 < 6.635)
  51.         {
  52.                 printf("P(K2 >= 5.024) = 0.025");
  53.         }
  54.         else if (k2 >= 6.635 && k2 < 7.879)
  55.         {
  56.                 printf("P(K2 >= 6.635) = 0.010");
  57.         }
  58.         else if (k2 >= 7.879 && k2 <10.828)
  59.         {
  60.                 printf("P(K2 >= 7.879) = 0.005");
  61.         }
  62.         else if (k2 >= 10.828)
  63.         {
  64.                 printf("P(K2 >= 10.828) = 0.001");
  65.         }
  66.         else
  67.         {
  68.                 printf("P(K2 < 0.455) < 0.50(我也只能这样说了)");
  69.         }

  70.        
  71.         return 0;
  72. }
复制代码

可这一版就崩了,算不出来正确答案。
找了半天找不到bug,我就放弃了,反正第一版能用就行啦。
可后来做了个题,是50 1000 75 1500,算出来是0.000,我就又崩溃了。
这不能是取值问题吧,我都用了long long了啊。大神求解
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-1 12:00:36 | 显示全部楼层
高中的独立性检验?没有问题啊,50 1000 75 1500算出来k2确实为零,说明没有把握判定两者有关联。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

抱歉,这写错了,是75.5,好啦这个不是重点啦,我就是想问我第二版哪错了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

是75.5的话,和定义的unsigned long long int长整型不一致,应该是这个原因。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-1 21:07:16 | 显示全部楼层
EthanHsiung 发表于 2020-3-1 16:40
是75.5的话,和定义的unsigned long long int长整型不一致,应该是这个原因。

兄弟,这个我知道,这也是为啥我打错成75的原因,你换个数试试,结果的数能吓死你
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-2 08:13:55 | 显示全部楼层
心鲜旅人 发表于 2020-3-1 21:07
兄弟,这个我知道,这也是为啥我打错成75的原因,你换个数试试,结果的数能吓死你

我找了几道例题试了一下,结果没问题。可能是编译器不支持unsigned long long int
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

可兄弟,我这这套程序就能用啊
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.         unsigned long long int sum =0;
  6.         unsigned long long int temp;
  7.         unsigned long long int weight;
  8.         int i;
  9.        
  10.         for (i = 0; i < 64; i++)
  11.         {
  12.                 temp = pow(2,i);
  13.                 sum = sum + temp;
  14.         }
  15.         weight = sum / 25000;
  16.        
  17.         printf("舍罕王应该给予达依尔%I64u粒麦子\n",sum);
  18.         printf("如果每25000粒麦子为1kg,那么应该给%I64u公斤麦子!\n",weight);
  19.        
  20.         return 0;
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-4 17:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表