还要币才能看????
哥们儿,小弟初来乍到,不知道这个怎搞的,我设置的难道不是6鱼币的奖励吗?/笑哭 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);
} ba21 发表于 2018-8-20 22:20
还要币才能看????
问题我在上面又重新发给你了一遍,希望大佬帮个忙{:5_109:}(上传代码我点了"<>"的,但是还是显示的是原字符?) 本帖最后由 TyCk 于 2018-8-21 08:51 编辑
迎风探雨 发表于 2018-8-21 08:28
#include
int main()
第一个问题,!a%2,这样写是有问题的,!的优先级高于%,也就是假如a=5,先对a做逻辑非运算,应当是为0,然后对2取余,相当于0%2,结果显而易见,可以加括号!(a%2)。
第二个问题,是什么给你break只能跳一层的错觉呢?break的作用就是跳出循环,或者说结束循环,所以用break就可以满足你的要求,或许你和continue混淆了?
TyCk 发表于 2018-8-21 08:50
第一个问题,,这样写是有问题的,!的优先级高于%,也就是假如a=5,先对a做逻辑非运算,应当是为0,然 ...
多谢解答!第一个问题确实是弱鸡了,第二个问题,为了让程序及时退出循环,我在循环中加入了一个循环,可break只能跳出当前循环,(编译的结果是这样,我大概是这样理解的)总而言之,实现不了我想要的跳出,最后才用goto的,至于continue我都没用过,暂时不会混淆,,,也不知道哪里出现了问题,如果你有空的话,可以看看break的结果确实和goto不一样啊 本帖最后由 TyCk 于 2018-8-21 10:05 编辑
迎风探雨 发表于 2018-8-21 09:43
多谢解答!第一个问题确实是弱鸡了,第二个问题,为了让程序及时退出循环,我在循环中加入了一个循环,可 ...
哦,这里是两层循环呐,没仔细看代码,但是呢,break就是跳出当前循环是没有错的,不要理解上产生偏差。
在这里,第二层while循环是起到什么作用呢?
个人感觉,你这里似乎是要作条件判断,满足某种条件,就跳出循环,如果这样的话,这里该用if条件判断,而不是用while循环,仔细琢磨一下,这里用循环很不对劲的,会有莫名其妙的问题的{:10_256:}
第一个问题的话,其实很正常的,优先级用的时候确实要小心的,不确定就多加括号,安全,放心,不然,会莫名其妙的踩坑,很难调试的。 TyCk 发表于 2018-8-21 09:55
哦,这里是两层循环呐,没仔细看代码,但是呢,break就是跳出当前循环是没有错的,不要理解上产生偏差 ...
对啊,第二次while确实如此,但是用if就能跳出么?它和while不也一样是一层循环吗?如果在if里面用break,不也一样只能跳出当前循环,而无法达到目的么?,,,{:10_282:} 迎风探雨 发表于 2018-8-21 10:49
对啊,第二次while确实如此,但是用if就能跳出么?它和while不也一样是一层循环吗?如果在if里面用break ...
纠正你一下,if是条件判断,while是循环。
第三次强调,break作用是跳出循环,结束循环。
if并不是循环,if代码块中用break,跳出的是循环,也就是while语句。
可以实际测试一下,不要猜测代码,多调试,会理解的更深刻的。{:10_256:} 迎风探雨 发表于 2018-8-21 10:49
对啊,第二次while确实如此,但是用if就能跳出么?它和while不也一样是一层循环吗?如果在if里面用break ...
另外,给你捋一下用while循环当作条件判断的问题吧,潜在问题很大很大。
这样,假设变量a,当a=0时,跳出循环,否则向下执行。
你的代码就类似如下while(0==a)
break;
显然,当a=5时,这段while,不满条件,会跳过不执行这一层循环,向下执行。
而当a=0时,进入循环,你用goto跳去了一个指定位置。
但是如果这里不是break或者goto,那么这里就会变成一个死循环,不停执行这段代码,程序崩的不能再崩。
用if条件判断的话,就是条件满足,执行一次,条件不满足,不执行;一般不会因为判断语句,程序卡在这儿。
建议楼主多思考下循环和判断的区别,真的不一样,或许可以通过循环间接实现判断功能,通过判断间接实现循环功能,但个人感觉,没有使得代码足够简洁、足够健壮、便于阅读。 TyCk 发表于 2018-8-21 11:16
另外,给你捋一下用while循环当作条件判断的问题吧,潜在问题很大很大。
这样,假设变量a,当a=0时,跳 ...
的确用if判断更好,最开始应该 程序整体有问题,用if时才出现和用while一样的错误。总算是理解了,,,,,,下面还有点小问题,可以忽略,如果你有时间感兴趣就看一下吧,也不是很紧要的问题,
我这程序运行的时间2.66s,而小甲鱼给的程序1s以内。这是因为我打印了各个数据的缘故吗?而且有好几个问题都是类似的,时间都比标准的长,甚至有6s以上的。运行时间反应的应该是算法的间接与否吧?那么如何处理这个问题呢?少让计算机计算? 迎风探雨 发表于 2018-8-23 10:26
的确用if判断更好,最开始应该 程序整体有问题,用if时才出现和用while一样的错误。总算是理解了,,,, ...
贴一下两种代码,我看一下,没有代码,没办法分析啊……{:10_266:} TyCk 发表于 2018-8-23 11:30
贴一下两种代码,我看一下,没有代码,没办法分析啊……
#include <stdio.h>
int main()
{
long a = 1, b = 2, c, sum = 0;
do
{
if (!(b % 2))
{
sum += b;
}
c = a + b;
a = b;
b = c;
} while (c < 4000000);
printf("%ld\n", sum);
return 0;
}
我刚刚又试了一下,时间又不一样了,我的程序:0.52 0.44,答案的程序:1.20 0.23;6s多那个我找不到了,我感觉没有太大必要哎,好像没有太大问题,就这样吧。麻烦你了。 迎风探雨 发表于 2018-8-24 08:57
我刚刚又试了一下,时间又不一样了,我的程序:0.52 0.44,答案的程序:1.20 0.23;6s多那个我找不到 ...
嗯嗯,好的,没事的,自己多调试下就可以的。{:10_256:}
页:
[1]