Algorithm 解决这个问题的最佳方案是什么?(任何语言)

Algorithm 解决这个问题的最佳方案是什么?(任何语言),algorithm,language-agnostic,fizzbuzz,Algorithm,Language Agnostic,Fizzbuzz,这里有一个问题。有人能想出答案吗 最多允许进行两次“如果”测试 Given numbers from 1 to 100 If this number is divisble by 21 print "foobar" If this number is divisble by 7 print "bar" If this number is divisble by 3 print "foo" If none of the above, print the number 只能打印一个数字。例如,数字

这里有一个问题。有人能想出答案吗

最多允许进行两次“如果”测试

Given numbers from 1 to 100
If this number is divisble by 21 print "foobar"
If this number is divisble by 7 print "bar"
If this number is divisble by 3 print "foo"
If none of the above, print the number
只能打印一个数字。例如,数字21应该只打印“foobar”,而不是所有的“foobar”、“bar”、“foo”

可以用任何语言完成

非常感谢。

如果语句:

array[1..100] = {"1", "2", "foo", "4", "5", "6", "bar", ... "bar", "foo", "100"}
for i = 1 to 100:
    print array[i]
我将让您填写
位并将其转换为真正的语言。我自己会做的,但我怀疑这样的任务是否有用:-)

或者,也许更好:

print "1\n2\nfoo\n4\n...97\nbar\nfoo\n100"

诀窍在于,了解问题中的4个“如果”,我们可以根据中间的2推断出顶部和底部的“如果”

for(int i=1;i<=100;i++)
{
    string numberstr = i.ToString();
    if(i % 3 == 0)
    {
        Console.Write("foo");
        numberstr = "";
    }
    if(i % 7 == 0)
    {
        Console.Write("bar");
        numberstr = "";
    }
    Console.WriteLine(numberstr);

}
for(inti=1;iOhai,FizzBuzz

#include <iostream>

int main(){
  for(int i=1; i <= 100; ++i){
    bool foo = !(i % 3), bar = !(i % 7);
    bool num = !(foo || bar);
    foo && std::cout << "foo";
    bar && std::cout << "bar";
    num && std::cout << i;
    std::cout << "\n";
  }
}
#包括
int main(){
对于(int i=1;i0,如果使用linq(但实际上是通过使用条件运算符进行欺骗)


基本上,当遇到可被21整除的数字时,foobar将被连接起来。

当然,有3个条件,但没有IF:)C#


将结果保存为字符串

例如:

字符串str=number.toString()

C代码

char* x = "\n"; 
int i;
for(i=1;i<=75;i++)
{   
    int y = ((i%5 == 0) && printf("%s","Foo")); 
    y=y+((i%7 == 0) && printf("%s","Bar"));
    ((!y==1) && printf("%d",i));
    printf("%s",x);
}
char*x=“\n”;
int i;

对于(i=1;i进一步阅读:搜索FizzBuzz。问题来自哪里?是面试问题吗?家庭作业?限制是否仅限于
if
,或所有分支流控制(如
开关/案例
)还是?@George Duckett:考虑到这个问题是语言不可知的,我认为你需要限制任何类型的分支/条件控制流。否则我可以发明一种语言“法语C++”,在其中我可以任意多次使用关键字
si
,因为它不是
if
;-),然后你可以就“分支”实际上是,比较代码的逻辑结构,特定编译器发出的实际操作码,等等。它是采访者发明的一种人为限制,目的是激发你给出的特定答案。@SteveJessop:正是我的观点:)现在这被称为欺骗;)我的回答是“小林丸”":-)在Haskell中,您不需要填写
,也不需要将其转换为真正的语言。编译器会为您设计一种语言,然后使用该语言进行编译;)如果数字可被21整除,则不会打印
foobar
。哦,很好,另一个带有零if语句。尽管这是边界。毫无疑问,您可以做到这一点与
相似,而(foo){事实上,我很肯定,发明这个问题的人想到了一个包含两个“if”的for循环。因此,“for”循环肯定不算作“if”,我们可以用
for(int tmp=I;tmp%3==0;++tmp)std::cout似乎不符合问题中的最大两个if测试要求。@RobertLongson您能简要说明最大两个是什么意思吗?我将在我的代码中编辑问题状态-最大两个“if”测试是允许的!你的答案中有三个if测试。@RobertLongson我做了改变。那是遵守法律的文字而不是它的精神:基本上是一个if else测试,你还有三个。
pseudcode:
if (num/3)
{
    print foo
}
elseif (num/7)
{
    print bar
}
else
{
        print num
}
var list = Enumerable.Range(1, 100).Select(n =>
            n % 21 == 0 ? "foobar" :
            n % 7 == 0 ? "bar" :
            n % 3 == 0 ? "foo" : n.ToString());
foreach(var n in list)
{
    Console.WriteLine(n);
}
if(number % 7 == 0) {
   str = "FOO";
}

if(number % 5 == 0) {
   str = i % 7 == 0 ? str + "BAR" : "BAR";
}

return str;
char* x = "\n"; 
int i;
for(i=1;i<=75;i++)
{   
    int y = ((i%5 == 0) && printf("%s","Foo")); 
    y=y+((i%7 == 0) && printf("%s","Bar"));
    ((!y==1) && printf("%d",i));
    printf("%s",x);
}
for (int i = 100; i > 0; i--) {
        int mul3  = (i /3)*3;
        int mul7 = (i /7) * 7;
        String fooOrBar = (mul3 == i && mul7 == i) ? "foobar" :(mul3 == i) ? "foo" : (mul7 == i) ? "bar" : "";
        System.out.println(fooOrBar);

    }