鱼C论坛

 找回密码
 立即注册
查看: 1765|回复: 15

[已解决]第一阶段考核第二题,取余问题,希望能遇到热心市民O(∩_∩)O

[复制链接]
发表于 2018-8-20 21:39:00 | 显示全部楼层 |阅读模式
购买主题 本主题需向作者支付 6 鱼币 才能浏览
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-20 22:20:11 | 显示全部楼层
还要币才能看????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-21 08:26:50 | 显示全部楼层
ba21 发表于 2018-8-20 22:20
还要币才能看????

哥们儿,小弟初来乍到,不知道这个怎搞的,我设置的难道不是6鱼币的奖励吗?/笑哭
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-21 08:28:43 | 显示全部楼层
ba21 发表于 2018-8-20 22:20
还要币才能看????

#include <stdio.h>

int main()
{
        int a=1,b=2,c,sum=2;
        printf("1 2");
        while (a<4000000&&b<4000000&&c<4000000)
           {
                 c=a+b;
                 a=b+c;
                 b=c+a;
            while (a>=4000000||b>=4000000||c>=4000000)
            goto shuai;
                 if(a%2==0)
                     sum+=a;
             if(b%2==0)
                 sum+=b;
             if(c%2==0)
                 sum+=c;
                          printf(" %d %d %d\n",c,a,b,sum);
            }
            shuai:  printf("\nsum=%d",sum);
            
}

/********************小弟粗来炸到*********************************
上面是实现的,下面是没实现的。
question1:
             if(!a%2)
                     sum+=a;
             if(!b%2)
                 sum+=b;
             if(!c%2)
                 sum+=c;
这三个取余的否,系统无法识别?想知道错在哪儿了。

question2:
while (!a<4000000&&b<4000000&&c<4000000)
            break;
我知道break只能跳一层,跳了也白跳,于是没法只能用最shuai的goto了
while (a>=4000000||b>=4000000||c>=4000000)
            goto shuai;
所以,想问问大佬们推荐点更好的办法。
********************还望鱼油指点迷津******************************/

int main()
{
        int a=1,b=2,c,sum=2;
        printf("1 2");
        while (a<4000000&&b<4000000&&c<4000000)
           {
                 c=a+b;
                 a=b+c;
                 b=c+a;
            while (!a<4000000&&b<4000000&&c<4000000)
            break;
                 if(!a%2)
                     sum+=a;
             if(!b%2)
                 sum+=b;
             if(!c%2)
                 sum+=c;
                          printf(" %d %d %d\n%d",c,a,b,sum);
            }
            printf("\nsum=%d",sum);
            
        
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-21 08:32:54 | 显示全部楼层
ba21 发表于 2018-8-20 22:20
还要币才能看????

问题我在上面又重新发给你了一遍,希望大佬帮个忙(上传代码我点了"<>"的,但是还是显示的是原字符?)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-21 08:50:11 | 显示全部楼层
本帖最后由 TyCk 于 2018-8-21 08:51 编辑


第一个问题,
  1. !a%2
复制代码
,这样写是有问题的,!的优先级高于%,也就是假如a=5,先对a做逻辑非运算,应当是为0,然后对2取余,相当于0%2,结果显而易见,可以加括号
  1. !(a%2)
复制代码

第二个问题,是什么给你break只能跳一层的错觉呢?break的作用就是跳出循环,或者说结束循环,所以用break就可以满足你的要求,或许你和continue混淆了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-8-21 09:43:22 | 显示全部楼层
TyCk 发表于 2018-8-21 08:50
第一个问题,,这样写是有问题的,!的优先级高于%,也就是假如a=5,先对a做逻辑非运算,应当是为0,然 ...

多谢解答!第一个问题确实是弱鸡了,第二个问题,为了让程序及时退出循环,我在循环中加入了一个循环,可break只能跳出当前循环,(编译的结果是这样,我大概是这样理解的)总而言之,实现不了我想要的跳出,最后才用goto的,至于continue我都没用过,暂时不会混淆,,,也不知道哪里出现了问题,如果你有空的话,可以看看break的结果确实和goto不一样啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-21 09:55:10 | 显示全部楼层
本帖最后由 TyCk 于 2018-8-21 10:05 编辑
迎风探雨 发表于 2018-8-21 09:43
多谢解答!第一个问题确实是弱鸡了,第二个问题,为了让程序及时退出循环,我在循环中加入了一个循环,可 ...


哦,这里是两层循环呐,没仔细看代码,但是呢,break就是跳出当前循环是没有错的,不要理解上产生偏差。
在这里,第二层while循环是起到什么作用呢?
个人感觉,你这里似乎是要作条件判断,满足某种条件,就跳出循环,如果这样的话,这里该用if条件判断,而不是用while循环,仔细琢磨一下,这里用循环很不对劲的,会有莫名其妙的问题的

第一个问题的话,其实很正常的,优先级用的时候确实要小心的,不确定就多加括号,安全,放心,不然,会莫名其妙的踩坑,很难调试的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-21 10:49:17 | 显示全部楼层
TyCk 发表于 2018-8-21 09:55
哦,这里是两层循环呐,没仔细看代码,但是呢,break就是跳出当前循环是没有错的,不要理解上产生偏差 ...

对啊,第二次while确实如此,但是用if就能跳出么?它和while不也一样是一层循环吗?如果在if里面用break,不也一样只能跳出当前循环,而无法达到目的么?,,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-21 11:05:57 | 显示全部楼层
迎风探雨 发表于 2018-8-21 10:49
对啊,第二次while确实如此,但是用if就能跳出么?它和while不也一样是一层循环吗?如果在if里面用break ...

纠正你一下,if是条件判断,while是循环。
第三次强调,break作用是跳出循环,结束循环。
if并不是循环,if代码块中用break,跳出的是循环,也就是while语句。
可以实际测试一下,不要猜测代码,多调试,会理解的更深刻的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-21 11:16:36 | 显示全部楼层    本楼为最佳答案   
迎风探雨 发表于 2018-8-21 10:49
对啊,第二次while确实如此,但是用if就能跳出么?它和while不也一样是一层循环吗?如果在if里面用break ...

另外,给你捋一下用while循环当作条件判断的问题吧,潜在问题很大很大。
这样,假设变量a,当a=0时,跳出循环,否则向下执行。
你的代码就类似如下
  1. while(0==a)
  2. break;
复制代码

显然,当a=5时,这段while,不满条件,会跳过不执行这一层循环,向下执行。
而当a=0时,进入循环,你用goto跳去了一个指定位置。
但是如果这里不是break或者goto,那么这里就会变成一个死循环,不停执行这段代码,程序崩的不能再崩。

用if条件判断的话,就是条件满足,执行一次,条件不满足,不执行;一般不会因为判断语句,程序卡在这儿。
建议楼主多思考下循环和判断的区别,真的不一样,或许可以通过循环间接实现判断功能,通过判断间接实现循环功能,但个人感觉,没有使得代码足够简洁、足够健壮、便于阅读。

评分

参与人数 1荣誉 +1 鱼币 +5 贡献 +1 收起 理由
迎风探雨 + 1 + 5 + 1 鱼C有你更精彩^_^真是受益匪浅:)

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-8-23 10:26:06 | 显示全部楼层
TyCk 发表于 2018-8-21 11:16
另外,给你捋一下用while循环当作条件判断的问题吧,潜在问题很大很大。
这样,假设变量a,当a=0时,跳 ...

的确用if判断更好,最开始应该 程序整体有问题,用if时才出现和用while一样的错误。总算是理解了,,,,,,下面还有点小问题,可以忽略,如果你有时间感兴趣就看一下吧,也不是很紧要的问题,
我这程序运行的时间2.66s,而小甲鱼给的程序1s以内。这是因为我打印了各个数据的缘故吗?而且有好几个问题都是类似的,时间都比标准的长,甚至有6s以上的。运行时间反应的应该是算法的间接与否吧?那么如何处理这个问题呢?少让计算机计算?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-23 11:30:12 | 显示全部楼层
迎风探雨 发表于 2018-8-23 10:26
的确用if判断更好,最开始应该 程序整体有问题,用if时才出现和用while一样的错误。总算是理解了,,,, ...

贴一下两种代码,我看一下,没有代码,没办法分析啊……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-24 08:40:11 | 显示全部楼层
TyCk 发表于 2018-8-23 11:30
贴一下两种代码,我看一下,没有代码,没办法分析啊……
  1. #include <stdio.h>



  2. int main()

  3. {

  4.         long a = 1, b = 2, c, sum = 0;



  5.         do

  6.         {

  7.                 if (!(b % 2))

  8.                 {

  9.                         sum += b;

  10.                 }

  11.                 c = a + b;

  12.                 a = b;

  13.                 b = c;

  14.         } while (c < 4000000);



  15.         printf("%ld\n", sum);



  16.         return 0;

  17. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-24 08:57:01 | 显示全部楼层
我刚刚又试了一下,时间又不一样了,我的程序:0.52    0.44,答案的程序:1.20   0.23;6s多那个我找不到了,我感觉没有太大必要哎,好像没有太大问题,就这样吧。麻烦你了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-24 13:10:43 | 显示全部楼层
迎风探雨 发表于 2018-8-24 08:57
我刚刚又试了一下,时间又不一样了,我的程序:0.52    0.44,答案的程序:1.20   0.23;6s多那个我找不到 ...

嗯嗯,好的,没事的,自己多调试下就可以的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 17:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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