我的代码如下:
#include <stdio.h>
int main()
{
int base, exp;
scanf ( "%d %d", &base, &exp );
if ( exp == 0 )
{
printf ( "%d %d", 0, 0 );
}
else
{
printf ( "%d %d", base*exp, exp-1 );
while ( exp - 1 != 0 )
{
scanf ( "%d %d", &base, &exp );
printf ( " %d %d", base*exp, exp-1 );
}
}
return 0;
}
实在想不出来后,在网络AC的代码根据它的思路,自己改了一下,也AC了。
#include <stdio.h>
int main()
{
int base, exp;
int flag = 0;
while ( scanf( "%d %d", &base, &exp ) != EOF )
{
if ( base*exp != 0 )
{
if ( flag != 0 )
{
printf (" ");
}
else
{
flag = 1;
}
printf ( "%d %d", base*exp, exp-1 );
}
}
if ( flag == 0 )
{
printf ( "%d %d", 0, 0 );
}
return 0;
}
可是这段代码测试用例为 9 0
时无限循环,没出结果,这样也是对的吗?
1
aaaa007cn 2014-12-27 22:50:07 +08:00
while 的退出条件为 scanf 返回 EOF
如果是通过重定向输入的话倒是没问题 如果你直接运行的话 是需要手动输入 EOF 的 https://en.wikipedia.org/wiki/End-of-file windows ctrl+z linux ctrl+d |
2
zeroday OP |
3
aaaa007cn 2014-12-28 00:22:31 +08:00
while ( exp - 1 != 0 )
退出条件为 exp == 1 用例 3 是什么? 没有一次项么…… |
4
zeroday OP |
5
aaaa007cn 2014-12-28 01:29:36 +08:00 1
不知道用例 3 具体是什么怎么能断定用例 3 有一次项的……
你可以用 exp > 1 来做退出判断的一部分 但是不应该用 exp - 1 != 0 另外 scanf 也要判断是不是读到 EOF 不然的话,比如输入只有 3 4 的话 你的那个代码就死循环了 |
6
zeroday OP @aaaa007cn 我看错上面话的意思了。你说的没错,我的代码似乎没有一次项的时候,进入死循环。用例3应该没有一次项吧,可能还有负数指数项。
解决的办法是将循环条件为 scanf( "%d %d", &base, &exp ) != EOF 吗? 谢谢你的回答了。 |
7
aaaa007cn 2014-12-28 11:18:41 +08:00
如果考虑到负数的指数项
比如输入 1 0 1 -1 光改循环条件第一段代码还是要出错 改到最后好像又要变成第二段代码的样子 |
9
aaaa007cn 2014-12-29 20:17:21 +08:00
改了之后再把相同代码块合并后
整个代码的结构就和你最终提交的那个差不多了 不知道你说的重写是指重写什么 但像这样根据测试结果来修改代码是很常见的 话说我没做过这种题 不理解它到底要考察什么 比如你说的要不要考虑负数指数 那其他的呢?空白输入?输入项总数为奇数个? |
10
zeroday OP @aaaa007cn 原来是这样。有时候写代码时思绪很乱,总喜欢推掉重写一个,一方面重新理清思路,一方面也是为了让代码看起来更美观。
根据猜测测试用例改了代码。这是按我第一次的代码进行修改,终于全部通过了。 附上代码,感觉有点乱,我还是先歇歇。 https://gist.github.com/arcticlion/f2ca9e98b7b629969187 其实最近找这些题来做,是为了训练程序语言的控制结构的运用,培养用编程语言解决问题的逻辑思维。 |