C de la programmation. Le programme FizzBuzz
J'ai eu un quiz et j'ai écrit ce code:
Impression Fizz si elle est divisible par 3 et il imprime Buzz si c'est
divisible par 5. Il imprime FizzBuss si elle est
divisible par deux. Sinon, il affichera les nombres entre 1 et 100.
Mais après je suis arrivé à la maison, je me demandais si ont pouvait
écrit avec moins de code. Cependant, je ne pouvais pas sortir
avec un code plus court.
Puis-je le faire avec un code plus court? Merci.
C'est ce que j'ai écrit et je pense qu'il fonctionne bien. Mais puis-je l'avoir fait
avec moins de code.
#include <stdio.h>
int main(void)
{
int i;
for(i=1; i<=100; i++)
{
if(((i%3)||(i%5))== 0)
printf("number= %d FizzBuzz\n", i);
else if((i%3)==0)
printf("number= %d Fizz\n", i);
else if((i%5)==0)
printf("number= %d Buzz\n", i);
else
printf("number= %d\n",i);
}
return 0;
}
- Est-ce devoirs? (BTW, avez-vous vraiment l'intention d'optimiser la première instruction if que beaucoup? 🙁
- pile de change a un codegolf site je crois
- Cette question tend à vaincre ceux qui essaient d'être intelligent. Vous pouvez faire plus court, mais il est alors facile de se tromper. Ce que vous avez fait est le moyen le plus simple pour obtenir ce droit.
- Non, ce n'est pas un problème du tout. Je n'étais tout simplement essayer de savoir si je pourrait avoir fait dans le plus court chemin. Et j'ai appris quelque chose ici de l'utilisateur paxdiable, où si vous avez besoin de tester les deux conditions, parfois, vous pourriez réduire à ces deux conditions pour être juste et, par conséquent, votre code sera plus courte. Quand j'ai écrit mon code, je ne pense pas de cette façon. Maintenant je vais utiliser sa technique à partir de maintenant.
if(((i%3)||(i%5))== 0)
N'essayez pas d'être trop intelligent, c'est juste obscurcit ce que votre code est destiné à faire. Aussi, il doit imprimer Fizz/Buzz au lieu de le nombre, alors méfiez-vous que certaines des solutions fournis dans les réponses sont fausses.- Je vais voter pour fermer cette question hors-sujet, parce que l'examen de code fonctionnel est hors sujet pour Stack Overflow. Votre question peut être sur le sujet de la Revue de Code.
- Totalement bizarre que c'était fermé à mon humble avis. Comment est-il pas peut-être pas une question de programmation?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez aussi faire:
Quelques lignes plus courtes et beaucoup plus facile à lire.
if ((i % 3 != 0) && (i % 5 != 0))
pouvez en fait juste être écrit commeif (i % 3 && i % 5)
.i % 3
eti % 5
dans ce cas sera de retour non nulle numéros, qui évalue à true.Si un nombre est divisible par 3 et 5, alors il est divisible par 15, donc:
Autre que cela, vous n'aurez probablement pas obtenir beaucoup plus courte, au moins dans un classique des langages comme le C (et je suis en supposant que vous ne voulez pas que la normale code-golf modifications de style qui font de votre code illisible).
Vous pouvez aussi obtenir le tout en deux lignes, si vous avez emballé l'ensemble de la
main
fonction sur une seule grande ligne, mais j'espère que vous ne seriez pas après ce genre de supercherie soit.Vous pouvez éventuellement obtenir plus rapide (bien que vous devriez vérifier toutes les allégations de performance pour vous-même) avec quelque chose comme:
En aparté, ce tableau de pointeurs de char sera probablement moins d'espace-cher que vous le pensez, grâce à l'action permanente de la fusion - en d'autres termes, il sera probable qu'il y aura seulement un de chaque C de la chaîne.
Comme je l'ai dit, si c'est plus rapide devrait être testé. En outre, l'original de votre specs que le plus court code de sorte qu'il peut être sans importance.
Je ne suis pas sûr de vous lorsque vous vous feriez commencer à appeler illisible, mais il y a ce.
i
dans lefor
déclaration et abandonné les accolades, il serait encore plus courte, sans pour autant sacrifier la lisibilité. +1.Je dirais que modulo est cher alors que les comparaisons ne sont pas cher, donc uniquement effectuer le modulo une fois. Que donnerait quelque chose comme ça.
je voudrais écrire quelque chose comme ça
Cela on évite la répétition de code, mais nécessite une variable temporaire
char t
Vous pouvez le faire en utilisant une Chaîne de caractères:
std::string
(minuscule!) en C++, mais cette question est balisé C.J'irais avec une fonction d'aide 🙂
Obscurci forme de M. Lister, en réponse
main(int i){while(i++<100){printf("number= %d %s%s",i,i%3?"":"Fizz",i%5?"":"Buzz");}}