习题:Fizz Buzz(C语言) 《初级算法》<数学>部分开始

题目

写一个程序,输出从 1 到 n 数字的字符串表示。

1.如果 n 是3的倍数,输出“Fizz”;

2.如果 n 是5的倍数,输出“Buzz”;

3.如果 n 同时是3和5的倍数,输出 “FizzBuzz”。

示例:

n = 15,

返回: [
“1”,
“2”,
“Fizz”,
“4”,
“Buzz”,
“Fizz”,
“7”,
“8”,
“Fizz”,
“Buzz”,
“11”,
“Fizz”,
“13”,
“14”,
“FizzBuzz” ]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fizz-buzz

自己写的普通方法,在非3、5倍数的时候赋值比较复杂,用了数字转字符串

//普通方法
//字符串反转(逆置)"abc"->"cba"
void Reverse(char* str)
{
	int t;
	int len = strlen(str);
	for (int i = 0, j = len - 1; i < j; i++, j--)
	{
		t = str[i];
		str[i] = str[j];
		str[j] = t;
	}
}
//数字转字符串
char* Myitoa(char* str, int n)
{
	int i = 0;
	while (n != 0)
	{
		str[i++] = n % 10 + '0';
		n /= 10;
	}
	str[i] = '\0';
	Reverse(str);
	return str;
}
char** fizzBuzz(int n, int* returnSize)
{
	*returnSize = n;
	char** s = (char**)malloc(sizeof(char*) * n);
	char tmp;
	for (int i = 1; i <= n; i++)
	{
		if (i % 3 == 0 && i % 5 == 0)
		{
			s[i - 1] = (char*)malloc(9);
			strcpy(s[i - 1], "FizzBuzz");
		}
		else if (i % 3 == 0)
		{
			s[i - 1] = (char*)malloc(5);
			strcpy(s[i - 1], "Fizz");
		}
		else if (i % 5 == 0)
		{
			s[i - 1] = (char*)malloc(5);
			strcpy(s[i - 1], "Buzz");
		}
		else
		{
			s[i - 1] = (char*)malloc(n + 1);
			Myitoa(s[i - 1], i);
		}
	}
	return s;
}

itoa函数在VS可以直接用,但在leecode貌似不行
实际上,有说明:itoa并不是一个标准的C函数,它是Windows特有的,如果要写跨平台的程序,请用sprintf。标准库中有sprintf,功能比这个更强,用法跟printf类似:

char str[255];

sprintf(str, “%x”, 100); //将100转为16进制表示的字符串。

进阶一下,只把自己写的Myitoa函数换成sprintf

char** fizzBuzz(int n, int* returnSize)
{
	*returnSize = n;
	char** s = (char**)malloc(sizeof(char*) * n);
	char tmp;
	for (int i = 1; i <= n; i++)
	{
		if (i % 3 == 0 && i % 5 == 0)
		{
			s[i - 1] = (char*)malloc(9);
			strcpy(s[i - 1], "FizzBuzz");
		}
		else if (i % 3 == 0)
		{
			s[i - 1] = (char*)malloc(5);
			strcpy(s[i - 1], "Fizz");
		}
		else if (i % 5 == 0)
		{
			s[i - 1] = (char*)malloc(5);
			strcpy(s[i - 1], "Buzz");
		}
		else
		{
			s[i - 1] = (char*)malloc(n + 1);
			sprintf(s[i - 1], "%d", i);
		}
	}
	return s;
}

评论区也有不使用strcpy,一直使用sprintf的操作

char** fizzBuzz(int n, int* returnSize)
{
    char* fizz = (char*)malloc(sizeof("Fizz"));
    char* buzz = (char*)malloc(sizeof("Buzz"));
    char* fizzbuzz = (char*)malloc(sizeof("FizzBuzz"));
    sprintf(fizz, "%s", "Fizz");
    sprintf(buzz, "%s", "Buzz");
    sprintf(fizzbuzz, "%s", "FizzBuzz");
    char** res = (char**)malloc(sizeof(char*) * n);
    *returnSize = n;
    for (int i = 1; i <= n; i++) 
    {
        if (i % 15 == 0)      
            res[i - 1] = fizzbuzz;
        else if (i % 5 == 0)  
            res[i - 1] = buzz;
        else if (i % 3 == 0)  
            res[i - 1] = fizz;
        else 
        {
            res[i - 1] = (char*)malloc(10);
            sprintf(res[i - 1], "%d", i);
        }
    }
    return res;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值