Я столкнулся с ошибкой в ​​моем коде для 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;
}
}
}
}
}

Я все еще учусь, так что, возможно, это не лучший способ решить эту проблему. Я просто хочу знать, что не так с этим кодом. Спасибо

-2

Решение

Ошибка в вашем коде в том, что вы не можете сравнить целое число и указатель. То, что вы пытаетесь сделать, это найти, если 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;
}

}
1

Другие решения

Как уже отмечали другие, вы предварительно вычислили ваши кратные 3 и 5 в массивах, но затем выполнили прямые сравнения между int и этими массивами — это всегда будет неудачным (ISO C++ forbids comparison between pointer and integer). Если вы сохраните с предварительно вычисленными массивами, вы можете использовать std::find или же std::any_of проверить, содержит ли какой-либо массив текущий номер.

Тем не менее, вы, вероятно, получите больше доверия, если бы вы включили знание того, как определить, делится ли число на 3 или 5 в вашем коде, вместо того, чтобы предварительно заполнять кратные 3 и 5. Это делается с помощью оператора по модулю, %, любой number % x вернет ноль, если он естественно делится на х.

В вашем коде есть еще один логический недостаток. Чтобы делиться как на 3, так и на 5 (т. Е. На 15, поскольку 3 и 5 являются простыми числами), вам нужно изменить порядок приоритетов ваших проверок таким образом, чтобы проверка для 15 выполнялась первой, иначе вы никогда не достигнете fizbuzz ветвь (так как 3 и 5 ветки также будут поражены, вместо этого).

Fizzbuzz обычно делается постепенно от 1 до 100, но вот ваш оригинальный 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;
}
1

x является int, в то время как f это массив. Вы не можете сравнить их таким образом:

if (x == f){

Если ваша техника состоит в том, чтобы проверить, x находится в массиве fПредлагаю проверить каждое значение в f, лайк

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

где i это индекс, используемый для пересечения f массив.

Кроме того, вы можете рассмотреть возможность оценки состояния x в обоих f а также b до их индивидуальной оценки.

0

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))

0
По вопросам рекламы [email protected]