我今天去面试了。这个问题是为了优化下面的代码。如果我们将看到下面的代码后for循环,有四个步骤的“如果-否则”如下。所以,面试官让我把它优化为3条如果-否则的话。我试过很多次了。但无法找到解决办法。甚至他也告诉我,如果你懂脚本语言,你也可以使用它们。请帮我优化一下。
int main()
{
int i = 1;
for(i; i <= 100; i++)
{
if((i % 3 == 0 && i % 5 == 0))
{cout << "PR\n";}
else if(i % 3 == 0)
{cout << "P\n";}
else if(i % 5 == 0)
{cout << "R\n";}
else
{cout << i <<"\n";}
}
system("pause");
return 0;
}发布于 2013-09-04 16:14:01
这是一个众所周知的问题。"FizzBuzz“。
你甚至可以不用任何显式的IFs就能解决它。
const char *messages[] = {"%i\n", "P\n", "R\n", "PR\n"};
for (i=1; i<=100; i++) {
printf(messages[((i % 3)==0) + 2*((i % 5)==0))], i);
}发布于 2013-09-04 16:25:26
这里有一种方式,在Python中:
for i in range(1, 101):
s = ''
if i % 3 == 0:
s += 'P'
if i % 5 == 0:
s += 'R'
if i % 3 != 0 and i % 5 != 0:
s = i
print(s)等效地:使用一个标志,如您自己的回答中所示:
for i in range(1, 101):
s, flag = '', False
if i % 3 == 0:
flag = True
s += 'P'
if i % 5 == 0:
flag = True
s += 'R'
if not flag:
s = i
print(s)只是为了好玩,Python版本的@6502的答案:
messages = ['{}', 'P', 'R', 'PR']
for i in range(1, 101):
print(messages[(i%3 == 0) + 2*(i%5 == 0)].format(i))最后,我个人的最爱(因为它是最短的)--使用最大的公共除数函数和一个查找表:
from fractions import gcd
messages = {3:'P', 5:'R', 15:'PR'}
for i in range(1, 101):
print(messages.get(gcd(i, 15), i))发布于 2013-09-04 16:29:30
我找到了解决办法。请让我知道它是好还是坏?
int main()
{
int i = 1;int stat=0;
for(i; i <= 100; i++)
{
stat=0;
if(i%3 == 0){stat++; cout << "P";}
if(i%5 == 0){stat++; cout << "R";}
if(stat == 0)cout << i;
cout << "\n";
}
system("pause");
return 0;
}https://stackoverflow.com/questions/18618800
复制相似问题