我的 fizzbuzz 代码遇到错误
I am encountering an error with my code for 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;
}
}
}
}
}
我还在学习,所以这可能不是解决这个问题的最好方法。我只想知道这段代码有什么问题。谢谢
x
是一个 int
,而 f
是一个数组。你不能这样比较它们:
if (x == f){
如果你的技术是检查 x
是否在数组 f
中,我建议你必须检查 f
中的每个值,例如
if(x == f[i++]){
其中 i
是用于遍历 f
数组的索引。
此外,您可以考虑在 f
和 b
中评估 x
的状况,然后再对其进行单独评估。
x 是整数,而 f 和 b 是整数数组。如果您想测试变量 x 的内容在数组 f 和 b 中的成员资格,您可能想定义自己的函数来检查它。
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))
您的代码的错误是您无法比较整数和指针,您试图做的是查找 x 是否在 f 中或 x 是否在 b 中或两者。
但是为什么你必须这样做,你知道管理集合 f 和 b 的属性只是“%3==0”,“%5==0”。所以你可以做一些非常简单的事情,比如
#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;
}
}
正如其他人所指出的,您已经在数组中预先计算了 3 和 5 的倍数,但随后在 int 和这些数组之间进行直接比较——这总是会失败 (ISO C++ forbids comparison between pointer and integer
)。如果您坚持使用预先计算的数组,则可以使用 std::find
or std::any_of
检查任一数组是否包含当前数字。
但是,如果您还在代码中包含有关如何确定数字是否可被 3 或 5 整除的知识,而不是预先填充 3 和 5 的倍数,您可能会获得更多可信度。这已完成使用模运算符 %
。任何 number % x
将 return 为零,如果它可以自然地被 x 整除。
您的代码中还有另一个逻辑缺陷。为了同时被 3 和 5 整除(即 15,因为 3 和 5 都是素数),您需要更改检查的优先顺序,以便首先完成 15 的检查,否则您将永远无法达到fizbuzz
分支(因为 3 和 5 分支也会被击中,而不是)。
Fizzbuzz 通常从 1 到 100 递增,但这里是您原来的 'count down' fizzbuzz 重写:
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;
}
}
也可以消除其中一个 if 分支,方法是 运行 打印的 fizz
和 buzz
以 15 的比例相互融合,尽管这不一定是易于阅读:
for (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;
}
#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;
}
}
}
}
}
我还在学习,所以这可能不是解决这个问题的最好方法。我只想知道这段代码有什么问题。谢谢
x
是一个 int
,而 f
是一个数组。你不能这样比较它们:
if (x == f){
如果你的技术是检查 x
是否在数组 f
中,我建议你必须检查 f
中的每个值,例如
if(x == f[i++]){
其中 i
是用于遍历 f
数组的索引。
此外,您可以考虑在 f
和 b
中评估 x
的状况,然后再对其进行单独评估。
x 是整数,而 f 和 b 是整数数组。如果您想测试变量 x 的内容在数组 f 和 b 中的成员资格,您可能想定义自己的函数来检查它。
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))
您的代码的错误是您无法比较整数和指针,您试图做的是查找 x 是否在 f 中或 x 是否在 b 中或两者。 但是为什么你必须这样做,你知道管理集合 f 和 b 的属性只是“%3==0”,“%5==0”。所以你可以做一些非常简单的事情,比如
#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;
}
}
正如其他人所指出的,您已经在数组中预先计算了 3 和 5 的倍数,但随后在 int 和这些数组之间进行直接比较——这总是会失败 (ISO C++ forbids comparison between pointer and integer
)。如果您坚持使用预先计算的数组,则可以使用 std::find
or std::any_of
检查任一数组是否包含当前数字。
但是,如果您还在代码中包含有关如何确定数字是否可被 3 或 5 整除的知识,而不是预先填充 3 和 5 的倍数,您可能会获得更多可信度。这已完成使用模运算符 %
。任何 number % x
将 return 为零,如果它可以自然地被 x 整除。
您的代码中还有另一个逻辑缺陷。为了同时被 3 和 5 整除(即 15,因为 3 和 5 都是素数),您需要更改检查的优先顺序,以便首先完成 15 的检查,否则您将永远无法达到fizbuzz
分支(因为 3 和 5 分支也会被击中,而不是)。
Fizzbuzz 通常从 1 到 100 递增,但这里是您原来的 'count down' fizzbuzz 重写:
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;
}
}
也可以消除其中一个 if 分支,方法是 运行 打印的 fizz
和 buzz
以 15 的比例相互融合,尽管这不一定是易于阅读:
for (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;
}