好吧,这真的不是一个疯狂的问题,因为它是一个C问题。
我在C中编写了一些简单的代码,用于根据需要打印出fizzbuzz。
#include <stdio.h>
int main(void)
{
int n = 30;
int i;
for (i = 1; i<=n; i++)
printf("%s\n", (i % 15) == 0 ? "fizzbuzz" : (i % 5) == 0 ? "buzz" : (i % 3) == 0 ? "fizz" : i);
}
现在,最后的其他声明显然不起作用,因为printf正在接受一个字符串,而“&#39; i&#39;是一个int。 我的问题是,是否有任何类型的演员可以申请转换“我”。变成一个字符串?
编辑:我应该提一下,我真正想问的是,这个fizzbuzz测试是否可以使用单个print语句完成。没有特别的理由说明为什么我希望它只是一个单独的打印声明,而不仅仅是关于它是否可以完成。EDIT2:问题已经回答了,这是我的实施:
#include <stdio.h>
int main(void)
{
int i, n=30;
for (i = 1; i<=n; i++)
printf((!(i%3) || !(i%5)) ? "%s\n" : "%d\n", !(i % 15) ? "fizzbuzz" : !(i % 5) ? "buzz" : !(i % 3) ? "fizz" : i);
}
答案 0 :(得分:5)
您已经尝试将所有逻辑置于printf
电话中,从而使自己陷入困境。最好把它写出来&#34;慢&#34;首先,然后寻找方法来优化它。
for (i = 1; i <= n; i++) {
if (i % 15 == 0)
printf("fizzbuzz\n");
else if (i % 5 == 0)
printf("buzz\n");
else if (i % 3 == 0)
printf("fizz\n");
else
printf("%d\n", i);
}
/* The following code is NOT recommended... */
int isFizz = (i % 3 == 0 ) ? 1 : 0;
int isBuzz = (i % 5 == 0 ) ? 1 : 0;
int isFizzBuzz = (isFizz && isBuzz) ? 1 : 0;
printf(
(isFizz || isBuzz) ? "%s\n" : "%d\n",
(
isFizzBuzz ? "fizzbuzz" :
isFizz ? "fizz" :
isBuzz ? "buzz" :
i
)
);
答案 1 :(得分:1)
您可以通过将字符串文字作为格式字符串传递来简化args到printf,而不是使用%s
来打印它们。这可以利用您知道%
或"fizz"
中没有"buzz"
个字符的事实。 It's guaranteed to be safe to pass unused args to printf
要使源可读,请拉出逻辑以从printf()
本身中选择格式字符串,并将其存储在本地变量中。
#include <stdio.h>
int main(void)
{
int n=30;
for (int i = 1; i<=n; i++) {
int fizzy = (i % 3 == 0);
int buzzy = (i % 5 == 0);
const char *fmt = (fizzy && buzzy) ? "fizzbuzz\n" :
fizzy ? "fizz\n" :
buzzy ? "buzz\n" :
"%d\n";
printf(fmt, i);
}
}
它可以是好的风格,也可能是更好的asm,有条件地确定你要传递的args然后进行一次调用,而不是用不同的args写出相同的函数调用。如果你要传递的大多数args在不同的分支中是相同的,这可能是好的,这不是这里的情况。
通常最好只使用puts
(附加隐式\n
)或fputs
来打印不需要格式化的常量字符串。编译器知道这一点,并且even optimize printf("Hello World!\n");
or printf("%s\n", "Hello World!")
to puts("Hello World!");
在琐碎的情况下。这个技巧意味着即使固定字符串打印仍然会调用更昂贵的printf
。 (除了可读性之外,这是在这个特定情况下它不是一个很好的选择的具体原因之一。)
gcc和clang compile this into asm that works the way the source does:printf
总是得到两个args(在rdi
和rsi
寄存器中),但有时格式字符串不使用第二个arg。将-O3
更改为-Os
以使gcc使用div
而不是乘法反转。
他们不会展开循环以匹配模数模式,或强度 - 将模数减少到向下计数器,或任何聪明的like you'd do in a hand-written asm FizzBuzz。
有关编写紧凑FizzBuzz的狡猾方法,请参阅CodeGolf.SE,其中%s%s%.d
格式字符串有条件地获取空字符串。 %.d
指定精度为0.非零整数正常打印,但0
打印为空字符串。
答案 2 :(得分:0)
修改强> 对不起......我刚才意识到这个主题是针对C解决方案的
递归实施:
vector<string> FizzBuzz::execute(int n) {
if(n == 0)
return vector<string>();
auto push = n % 15 == 0 ? "fizzbuzz" :
n % 3 == 0 ? "fizz" :
n % 5 == 0 ? "buzz" :
to_string(n);
auto execution = execute(n-1);
execution.push_back(push);
return execution;
}
答案 3 :(得分:-1)
itoa();
。示例代码如下。
#include <stdio.h>
#include <stdlib.h>
int main(){
int num=23;
char snum[3];
itoa(num,snum,10);
printf("%s",snum);
}
itoa用于将int
转换为string
,参数如下。
itoa(int num, char string [], int base);
第一个参数是您要转换的数字。第二个参数是要将转换后的strong存储到的字符串/ char
数组。最后,第三个参数是要转换的数字的基数。