1195 交替打印字符串

题目描述:
编写一个可以从 1 到 n 输出代表这个数字的字符串的程序,但是:

如果这个数字可以被 3 整除,输出 “fizz”。
如果这个数字可以被 5 整除,输出 “buzz”。
如果这个数字可以同时被 3 和 5 整除,输出 “fizzbuzz”。
例如,当 n = 15,输出: 1, 2, fizz, 4, buzz, fizz, 7, 8, fizz, buzz, 11, fizz, 13, 14, fizzbuzz。

假设有这么一个类:

class FizzBuzz {
public FizzBuzz(int n) { … } // constructor
public void fizz(printFizz) { … } // only output “fizz”
public void buzz(printBuzz) { … } // only output “buzz”
public void fizzbuzz(printFizzBuzz) { … } // only output “fizzbuzz”
public void number(printNumber) { … } // only output the numbers
}
请你实现一个有四个线程的多线程版 FizzBuzz, 同一个 FizzBuzz 实例会被如下四个线程使用:

线程A将调用 fizz() 来判断是否能被 3 整除,如果可以,则输出 fizz。
线程B将调用 buzz() 来判断是否能被 5 整除,如果可以,则输出 buzz。
线程C将调用 fizzbuzz() 来判断是否同时能被 3 和 5 整除,如果可以,则输出 fizzbuzz。
线程D将调用 number() 来实现输出既不能被 3 整除也不能被 5 整除的数字。

方法1:使用信号量实现
主要思路:
(1)使用四个信号量标识四个函数,将其中的一个信号量初始化为 1,另外的三个信号量初始化为0;
(2)在初始化为1 的信号量标识的函数中,用来判断需要调用哪个函数实现打印输出,将对应的信号量post,既加一,唤醒该打印函数;
(3)然后,在进入打印函数时,同样需要先进行该对应的信号量的wait操作,避免重复调用,然后在打印结束之后,调用原始的初始化为 1 的那个信号量的post函数,便于继续判断下一个数字的输出情形;

#include<semaphore.h>
class FizzBuzz {
   
private:
    int n;//输出的范围
    int cur_num;//当前需要判断的数字
    //标识四个函数的四个信号量
    sem_t sem_fizz;
    sem_t sem_buzz;
    sem_t sem_fizzbuzz;
    sem_t sem_num;

public:
    FizzBuzz(int n) {
   
    	//初始化
        this->n = n
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: AI:非常感谢您的提问!以下是给出的完整 C 代码,实现合并两个字符串的功能。 ```C #include <stdio.h> #include <string.h> // 合并两个字符串的函数 char* mergeStrings(char* word1, char* word2) { int i=0, j=0, k=0; char* merge_str = (char*)malloc(strlen(word1)+strlen(word2)+1); // 申请新的字符串内存 while (i<strlen(word1) && j<strlen(word2)) { merge_str[k++] = word1[i++]; merge_str[k++] = word2[j++]; } while (i<strlen(word1)) { // 将 word1 剩下的所有字符全部追加到合并后的字符串末尾 merge_str[k++] = word1[i++]; } while (j<strlen(word2)) { // 将 word2 剩下的所有字符全部追加到合并后的字符串末尾 merge_str[k++] = word2[j++]; } merge_str[k] = '\0'; // 字符串最后必须以 null 结尾 return merge_str; } int main() { char* word1 = "Hello"; char* word2 = "World"; char* result = mergeStrings(word1, word2); printf("合并后的字符串是:%s\n", result); free(result); // 释放之前申请的新的字符串内存 return 0; } ``` 指针变量 `word1` 和 `word2` 存储了输入的两个字符串, `mergeStrings()` 函数则负责将这两个字符串合并成一个新的字符串。首先在函数内部申请了一个长度为 `strlen(word1)+strlen(word2)+1` 的 char 数组类型的新字符串 `merge_str`,该字符串的长度应该足够长以接受两个参数字符串的任意组合。 然后,在 while 循环内部,函数将字符串 word1 中的第一个字符追加在新字符串 `merge_str` 的末尾,并且将字符串 word2 中的第一个字符追加在 `merge_str` 的后面,然后 i 和 j 分别加 1 表示当前处理的是 input1 和 input2 字符串的下一个字母。 然后根据长度的差异将字符串 `word1` 或字符串 `word2` 的剩余字符追加到字符串 `merge_str` 的末尾。最后,函数在新的字符串 `merge_str` 的末尾插入 null 结尾,以实现字符串最后必须以 null 结尾的要求。 在 `main()` 函数中,指针变量 `result` 存储了函数的返回值,并最终输出了字符串 result。 以上是完整的 C 代码和注释。我希望这可以回答您的问题。如果您还有其他问题,请继续提问! ### 回答2: 以下是用C语言实现合并两个字符串并返回合并后的字符串的代码。 ```c #include <stdio.h> #include <string.h> char* mergeStrings(char* word1, char* word2) { int len1 = strlen(word1); int len2 = strlen(word2); int i, j; char* merged = (char*)malloc((len1 + len2 + 1) * sizeof(char)); // 创建足够大的内存空间来容纳合并后的字符串 i = j = 0; // 交替添加字母直到其中一个字符串遍历完 while (i < len1 && j < len2) { merged[i + j] = word1[i]; merged[i + j + 1] = word2[j]; i++; j++; } // 如果 word1 还有剩余字符,则将其追加到合并后的字符串末尾 while (i < len1) { merged[i + j] = word1[i]; i++; } // 如果 word2 还有剩余字符,则将其追加到合并后的字符串末尾 while (j < len2) { merged[i + j] = word2[j]; j++; } merged[i + j] = '\0'; // 在合并后的字符串末尾添加字符串结束符 return merged; } int main() { char word1[] = "Hello"; char word2[] = "World"; char* merged = mergeStrings(word1, word2); printf("合并后的字符串为:%s\n", merged); free(merged); // 释放申请的内存空间 return 0; } ``` 这段代码首先通过 `strlen` 函数获取了两个字符串的长度,然后创建了足够大的内存空间来容纳合并后的字符串。接着使用两个指针 `i` 和 `j` 来分别追踪两个字符串的当前遍历位置,通过循环交替将字符添加到合并后的字符串中。最后,将剩余字符添加到合并后的字符串末尾,并在末尾添加字符串结束符。最终,返回合并后的字符串。 在 `main` 函数中,我们定义了两个要合并的字符串 `word1` 和 `word2`,然后调用 `mergeStrings` 函数来获取合并后的字符串,并打印出来。最后,记得使用 `free` 函数释放申请的内存空间。 ### 回答3: 下面是用C语言实现的代码,实现了将两个字符串交替添加字母合并为一个字符串的功能: ```c #include <stdio.h> #include <string.h> char* mergeStrings(char* word1, char* word2) { int len1 = strlen(word1); int len2 = strlen(word2); int maxLen = len1 > len2 ? len1 : len2; // 计算两个字符串的最大长度 char* merge = (char*)malloc((len1 + len2 + 1) * sizeof(char)); // 分配合并后字符串的内存空间 int i, j, k; i = j = k = 0; while (i < len1 || j < len2) { if (i < len1) { // 将word1中的字母添加到合并后字符串 merge[k++] = word1[i++]; } if (j < len2) { // 将word2中的字母添加到合并后字符串 merge[k++] = word2[j++]; } } merge[k] = '\0'; // 在合并后字符串的末尾添加结束符 return merge; } int main() { char word1[] = "hello"; char word2[] = "world"; char* result = mergeStrings(word1, word2); printf("%s\n", result); // 输出合并后的字符串 free(result); // 释放分配的内存空间 return 0; } ``` 代码中的`mergeStrings`函数用于将两个字符串合并为一个字符串,`main`函数用于测试。首先,通过`strlen`函数获取了`word1`和`word2`的长度,然后根据最大长度分配了合并后字符串的内存空间。接着,使用两个指针`i`和`j`分别指向`word1`和`word2`的首字母,通过一个循环将两个字符串的字母按序交替添加到合并后字符串中。最后,在合并后字符串的末尾添加了结束符,并将合并后的字符串返回。在`main`函数中,将两个字符串`"hello"`和`"world"`传入`mergeStrings`函数进行测试,并将结果打印出来。最后,通过`free`函数释放了分配的内存空间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值