我有一个测验,我写了这段代码:
如果它被3整除则打印Fizz,如果是,则打印Buzz 如果它可以打印FizzBuss 可被两者整除。否则,它将打印1到100之间的数字。
但是在我到家后,我想知道是否可以 用更少的代码写它。但是,我不能出来 用更短的代码。 我可以用更短的代码吗?感谢。
这是我写的,我认为它运作良好。但我能做到吗? 用更少的代码。
#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;
}
答案 0 :(得分:12)
你也可以这样做:
#include <stdio.h>
int main(void)
{
int i;
for(i=1; i<=100; ++i)
{
if (i % 3 == 0)
printf("Fizz");
if (i % 5 == 0)
printf("Buzz");
if ((i % 3 != 0) && (i % 5 != 0))
printf("number=%d", i);
printf("\n");
}
return 0;
}
短几行,更容易阅读。
答案 1 :(得分:8)
如果一个数字可以被3和5整除,那么它可以被15整除,所以:
for each number 1 to 100:
if number % 15 == 0:
print number, "fizzbuzz"
else if number % 5 == 0:
print number, "buzz"
else if number % 3 == 0:
print number, "fizz"
else:
print number
除此之外,你可能不会更短,至少在像C这样的传统语言中(我假设你不希望正常的代码 - 高尔夫风格修改使你的代码不可读)。
如果你将整个main
函数打包到一个大的行上,你也可以把整个事情分成两行,但我希望你也不会在那种诡计之后。
您可以更快地 (尽管您应该自己检查所有性能声明),例如:
static const char *xyzzy[] = {
"", "", "fizz", "", "buzz",
"fizz", "", "", "fizz", "buzz",
"", "fizz", "", "buzz", "fizzbuzz",
// Duplicate those last three lines to have seven copies (7x15=105).
};
for (int i = 1; i <= 100; i++)
printf ("%d %s\n", i, xyzzy[i-1]);
顺便说一下,由于不断的合并,这一系列的char指针可能比你想象的要便宜得多 - 换句话说,它很可能只有一个每个C字符串。
正如我所说,应该测试它是否更快。此外,您的原始规格仅需要最短的代码,因此可能无关紧要。
答案 2 :(得分:7)
我不确定你什么时候开始称它为不可读,但就是这样。
#include <stdio.h>
int main(void)
{
int i = 1;
for (; i<=100; ++i) {
printf("number= %d %s%s\n", i, i%3?"":"Fizz", i%5?"":"Buzz");
}
return 0;
}
答案 3 :(得分:2)
我会说模数很贵而比较便宜所以只执行一次模数。这会产生类似的结果。
int i;
for( i = 0; i!=100; ++i ) {
bool bModThree = !(i % 3);
bool bModFive = !(i % 5);
if( bModThree || bModFive ) {
if( bModThree ) {
printf( "Fizz" );
}
if( bModFive ) {
printf( "Buzz" );
}
} else {
printf( "%d", i );
}
printf( "\n" );
}
答案 4 :(得分:1)
我会写那样的东西
main(){
if (i % 3 == 0){
cout<<"Fizz";
}
if (i % 5 == 0){
cout<<"Buzz";
}
// So if both are true, it will print “FizzBuzz” and augment the two strings
}
答案 5 :(得分:1)
这个避免了一些代码重复,但需要一个临时变量char t
void FizzBuzz( ) {
char t = 0;
for (unsigned char i = 1; i <= 100; ++i, t = 2) {
(i % 3) ? --t : printf("Fizz");
(i % 5) ? --t : printf("Buzz");
if (!t) printf("%d", i);
printf("\n");
}
}
答案 6 :(得分:0)
#include <stdio.h>
char const * template[] = {
"%i",
"Buzz",
"Fizz",
"FizzBuzz"
};
const int __donotuseme3[] = { 2, 0, 0 };
const int __donotuseme5[] = { 1, 0, 0, 0, 0 };
#define TEMPLATE(x) (template[__donotuseme3[(x) % 3] | __donotuseme5[(x) % 5]])
int
main(void) {
int i;
for (i = 1; i <= 100; i++) {
printf(TEMPLATE(i), i);
putchar('\n');
}
return 0;
}
答案 7 :(得分:0)
void main()
{
int i = 0;
char h[4];
while (++i <= 100)
{
sprintf(h, "%d", i);
printf("%s%s%s\n", i%3 ? "" : "fizz", i%5 ? "" : "buzz", (i%3 && i%5) ? h: "");
}
}
答案 8 :(得分:0)
您可以使用字符串:
String s="";
if(num%3==0)
s+="fizz";
if(num%5==0)
s+="buzz";
if(s.length()==0)
s+=num+"";
答案 9 :(得分:0)
我使用辅助功能: - )
#include <stdio.h>
int fbindex(int n) {
int i = 0;
if (n % 3 == 0) i += 1;
if (n % 5 == 0) i += 2;
return i;
}
int main(void) {
const char *fb[] = {"%d\n", "Fizz\n", "Buzz\n", "FizzBuzz\n"};
for (int i = 1; i <= 100; i++) printf(fb[fbindex(i)], i);
}
答案 10 :(得分:-3)
模糊形式
main(int i){while(i++<100){printf("number= %d %s%s",i,i%3?"":"Fizz",i%5?"":"Buzz");}}