鱼C论坛

 找回密码
 立即注册
查看: 1189|回复: 3

[已解决]c++改写成c

[复制链接]
发表于 2020-10-19 15:29:50 | 显示全部楼层 |阅读模式

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

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

x
踩气球问题,我直接把答案c++改成c出现了奇怪的bug help
踩气球描述:
六一儿童节,小朋友们做踩气球游戏,气球的编号是1~100,两位小朋友各踩了一些气球,要求他们报出自己所踩气球的编号的乘积。现在需要你编一个程序来判断他们的胜负,判断的规则是这样的:如果两人都说了真话,数字大的人赢;如果两人都说了假话,数字大的人赢;如果报小数字的人说的是真话而报大数字的人说谎,则报小数字的人赢(注意:只要所报的小数字是有可能的,即认为此人说了真话)。
输入:
输入为两个数字,0 0表示结束;
输出:
输出为获胜的数字。
输入样例:
36 62 49 343 0 0
输出样例:
62 49

答案代码:
  1. #include <iostream>
  2. #include <string.h>
  3. using namespace std;

  4. /*        "注意:只要所报的小数字是有可能的,即认为此人说了真话",
  5.         这句话的意思是要先判断小数字,报小数字的小朋友踩过的气球,
  6.         则报大数字的小朋友无法再踩,
  7.         因此要做一个访问标记
  8.         这题的主体的思路是 假设判断数字 n 能否由1到100之间的数字相乘得到,
  9.         则判断 n % k == 0 ? dfs(n / k, k-1) : dfs(n, k-1) 依次判断下去,如果  
  10.         n == 1 说明能找到1到100之间的且不重复的数相乘等于原来的n
  11. */

  12. //标记是否访问
  13. bool vis[101];

  14. bool dfs(int n, int k)
  15. {
  16.         if(n == 1)
  17.         {
  18.                 return true;
  19.         }


  20.         if(k>1)
  21.         {
  22.                 if(n % k == 0 && vis[k] == 0)
  23.                 {
  24.                         vis[k] = 1;
  25.                         return dfs(n / k, k - 1);

  26.                 }
  27.                 else
  28.                 {
  29.                         return dfs(n, k-1);
  30.                 }
  31.         }
  32.         return false;
  33. }

  34. int main(int argc, char const *argv[])
  35. {
  36.         int a, b, low, high;
  37.         bool flag1, flag2;
  38.         while(cin>>a>>b && (a!=0 && b!=0))
  39.         {
  40.                 if(a > b)
  41.                 {
  42.                         low = b;
  43.                         high = a;
  44.                 }
  45.                 else
  46.                 {
  47.                         low = a;
  48.                         high = b;
  49.                 }

  50.                 memset(vis, 0, sizeof(vis));

  51.                 flag1 = dfs(low, 100);
  52.                 flag2 = dfs(high, 100);

  53.                 if((flag1 && flag2) || (!flag1 && !flag2))
  54.                 {
  55.                         cout<<high<<endl;
  56.                 }
  57.                 else if (flag1 && !flag2)
  58.                 {
  59.                         cout<<low<<endl;
  60.                 }
  61.                 else
  62.                 {
  63.                         cout<<high<<endl;
  64.                 }

  65.         }
  66.         return 0;
  67. }
复制代码

我的c:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int num1,num2;
  4. int flag1,flag2;
  5. int balloon[101];
  6. int result[1000],count=1;
  7. enum{false,true};
  8. //有问题
  9. int Do(int currnum,int currballoon)
  10. {
  11.         if(currnum==1)
  12.         {
  13.                 return true;
  14.         }
  15.         else if(currnum>1)
  16.         {
  17.                 if(currnum%currballoon==0&&balloon[currballoon]==0)
  18.                 {
  19.                         balloon[currballoon]=1;
  20.                         return Do(currnum/currballoon,currballoon-1);
  21.                 }
  22.                 else
  23.                 {
  24.                         return Do(currnum,currballoon-1);
  25.                 }
  26.                
  27.         }
  28.         return false;
  29. }

  30. int main(void)
  31. {
  32.         int a,b,i;//a-high,b-low;
  33.         while(1)
  34.         {
  35.                 scanf("%d%d",&num1,&num2);
  36.                 if(num1==0&&num2==0)break;
  37.                 if(num1>num2)
  38.                 {
  39.                         a=num1,b=num2;
  40.                 }
  41.                 else
  42.                 {
  43.                         a=num2,b=num1;
  44.                 }
  45.                 for(i=1;i<=100;i++)
  46.                 {
  47.                         balloon[i]=0;
  48.                 }
  49.                 //memset(balloon,0,sizeof(balloon));
  50.                 flag1=Do(a,100);
  51.                 flag2=Do(b,100);
  52.                 if(flag1&&flag2||!flag1&&!flag2)
  53.                 {
  54.                         result[count++]=a;
  55.                 }
  56.                 else if(!flag1&&flag2)
  57.                 {
  58.                         result[count++]=b;
  59.                 }
  60.                 else
  61.                 {
  62.                         result[count++]=a;
  63.                 }
  64.         }
  65.         for(i=1;i<count;i++)
  66.         {
  67.                 printf("%d\n",result[i]);
  68.         }
  69.        
  70.         return 0;
  71. }
复制代码
最佳答案
2020-10-19 16:13:06
原答案也不严谨。
比如说输入 64 ,64 分解因数如下
64 = 2*32
64 = 4 * 16
64 = 1 * 64
64 = 2 * 4 * 8
64 = 1 * 2 * 4 * 8
等等等等,如何确定哪些气球是他踩的呢?没法确定,严谨的做法要把所有可能性都排除出来。
跟答案相比,你的代码有一个问题:

答案是:

  1. bool dfs(int n, int k)
  2. {
  3.     //这里是n
  4.     if(n == 1)
  5.         {
  6.                 return true;
  7.         }

  8.    //这里是k   
  9.    if(k>1)
  10.       {
  11.            ....
  12.       }
  13.       return false;
  14. }
复制代码

而你的代码是:

  1. int Do(int currnum,int currballoon)
  2. {
  3.         //对应 n 没错
  4.         if(currnum==1)
  5.         {
  6.                 return true;
  7.         }
  8.         //这里应该改成 if(currballoon > 1)
  9.         else if(currnum>1)
  10.         {
  11.              ...
  12.         }
  13.      return false;
  14. }
复制代码


按你的代码逻辑,最后总是返回 true ,或者递归出不来导致堆栈溢出 stack overflow
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-10-19 16:13:06 | 显示全部楼层    本楼为最佳答案   
原答案也不严谨。
比如说输入 64 ,64 分解因数如下
64 = 2*32
64 = 4 * 16
64 = 1 * 64
64 = 2 * 4 * 8
64 = 1 * 2 * 4 * 8
等等等等,如何确定哪些气球是他踩的呢?没法确定,严谨的做法要把所有可能性都排除出来。
跟答案相比,你的代码有一个问题:

答案是:

  1. bool dfs(int n, int k)
  2. {
  3.     //这里是n
  4.     if(n == 1)
  5.         {
  6.                 return true;
  7.         }

  8.    //这里是k   
  9.    if(k>1)
  10.       {
  11.            ....
  12.       }
  13.       return false;
  14. }
复制代码

而你的代码是:

  1. int Do(int currnum,int currballoon)
  2. {
  3.         //对应 n 没错
  4.         if(currnum==1)
  5.         {
  6.                 return true;
  7.         }
  8.         //这里应该改成 if(currballoon > 1)
  9.         else if(currnum>1)
  10.         {
  11.              ...
  12.         }
  13.      return false;
  14. }
复制代码


按你的代码逻辑,最后总是返回 true ,或者递归出不来导致堆栈溢出 stack overflow
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-10-19 18:04:57 | 显示全部楼层
xieglt 发表于 2020-10-19 16:13
原答案也不严谨。
比如说输入 64 ,64 分解因数如下
64 = 2*32

太对了,我自己都看花眼了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-19 18:06:12 | 显示全部楼层
“注意:只要所报的小数字是有可能的,即认为此人说了真话”加上这句话应该题目没问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 23:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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