我的fizzbuzz代码遇到错误

时间:2015-05-31 04:29:27

标签: c++ fizzbuzz

#include <iostream>
using namespace std;

int f[33] = {3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 
             57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99};

int b[20] = {5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 
             90, 95, 100};


int main (){

  for (int x=100; x >= 1; x-- ){

    if (x == f){
        cout << "fizz" << endl;
    } else {
        if(x ==b){
            cout << "buzz" << endl;
        }else{
            if(x==f & x==b){
                cout << "fizzbuzz" << endl;

            }else{
                cout << x << endl;
            }
        }
    }
  }
}

我还在学习,所以这可能不是解决这个问题的最佳方法。我只是想知道这段代码的错误。感谢

4 个答案:

答案 0 :(得分:1)

您的代码出错是您无法比较整数和指针,您要做的是查找x是否为f或x是否为b或两者。 但为什么你必须这样做,你知道管理集合f和b的属性,它们只是&#34;%3 == 0&#34; ,&#34;%5 == 0&#34;那么你可以做一些非常容易的事情,如

 #include <iostream>
using namespace std;

int main (){

for (int x=100; x >= 1; x-- ){
if(x%3==0)        cout<<"Fizz";
if(x%5==0)        cout<<"Buzz";
else if(x%3 !=0)  cout <<x;
 cout<<endl;
}

}

答案 1 :(得分:1)

正如其他人所指出的那样,你已经在数组中预先计算了3和5的倍数,但是然后在int和这些数组之间进行直接比较 - 这总是会失败(ISO C++ forbids comparison between pointer and integer)。如果您使用预先计算的数组,则可以使用std::find or std::any_of检查其中一个数组是否包含当前数字。

但是,如果您还包含了如何确定数字是否可以在代码中被3或5整除的知识,而不是预先填充3和5的倍数,那么您可能会获得更多可信度。这是通过以下方式完成的:模运算符%。如果number % x自然可被x整除,则任何fizbuzz都将返回零。

您的代码中存在另一个逻辑缺陷。为了能够被3和5整除(即15,因为3和5都是素数),你需要改变支票的优先顺序,以便先检查15,否则你永远不会达到for (int x=100; x >= 1; x--){ bool isDiv3 = x % 3 == 0; bool isDiv5 = x % 5 == 0; if (isDiv3 && isDiv5){ cout << "fizzbuzz" << endl; } else if (isDiv5) { cout << "buzz" << endl; } else if (isDiv3) { cout << "fizz" << endl; } else { cout << x << endl; } } 分支(因为3和5分支也会被命中)。

Fizzbuzz通常会从1到100逐步完成,但这是您的原始&#39;倒数&#39; fizzbuzz改写:

fizz

通过将打印的buzzfor (int x=100; x >= 1; x--){ bool isDiv3 = x % 3 == 0; bool isDiv5 = x % 5 == 0; if (isDiv3) { cout << "fizz"; } if (isDiv5) { cout << "buzz"; } if (!isDiv3 && !isDiv5) cout << x; } cout << endl; } 以15倍的比例相互运行,也可以消除其中一个if分支,尽管这不一定是易读:

CREATE OR REPLACE PROCEDURE country_demographics
  (p_country_name  IN countries.country_name%TYPE,
   p_country_demo_rec  OUT ed_type)
 IS
  TYPE ed_type IS RECORD (
      c_name countries.country_name%TYPE, 
      c_location     countries.location%TYPE, 
      c_capitol countries.capitol%TYPE, 
      c_population countries.population%TYPE, 
      c_airports countries.airports%TYPE, 
      c_climate countries.climate%TYPE);

BEGIN
  SELECT country_name, location, capitol, population, airports, climate
  INTO ed_type.c_name, ed_type.c_location, ed_type.c_capitol, ed_type.population, ed_type.airports, ed_type.climate
  FROM countries;
 DBMS_OUTPUT.PUT_LINE('Country Name:' || v_country_demo_rec.country_name || 
          'Location:' || v_country_demo_rec.location || 
          'Capitol:' || v_country_demo_rec.capitol || 
          'Population:' || v_country_demo_rec.population || 
          'Airports:' || v_country_demo_rec.airports || 
          'Climate:' || v_country_demo_rec.climate );

 IF SQL%NOTFOUND THEN
    RAISE_APPLICATION_ERROR(-20201, 'This country does not exist.');
 END IF;
END;

答案 2 :(得分:0)

xint,而f是数组。你无法用这种方式比较它们:

if (x == f){

如果你的技巧是检查数组x中是否f,我建议你必须检查f中的每个值,例如

 if(x == f[i++]){

其中i是用于遍历f数组的索引。

此外,您可以考虑在评估之前评估xfb的条件。

答案 3 :(得分:0)

x是整数,而f和b是整数数组。如果你想在数组f和b中测试变量x的内容的成员资格,你可能想要定义自己的函数来检查它。

int is_in(int item, int[] list){
    for(i = 0; i < sizeof(list) / sizeof(struct list); i++){
        if(item==list[i]) return 1;
    }
    return 0;
}

然后将您的条件更改为if(is_in(x,b))