在C语言中能否不使用循环实现将'1'打印n次?
在C语言中实现类似Python
print("1"*n) 的高效方法 要在C语言里实现高效重复打印单个字符(或字符串)且时间复杂度为O(n),可以用以下几种实用方法:
方法1:memset + fwrite(推荐,跨平台且高效)
这是性能最优的方案之一,利用底层优化的内存填充函数批量生成字符,再通过批量写入函数输出,避免多次I/O调用的开销。
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int n = 10; // 替换为你需要的重复次数 char *buf = malloc(n + 1); // 额外分配1字节用于换行符(可选) if (!buf) { perror("malloc failed"); return 1; } memset(buf, '1', n); // 将buf前n个字节填充为'1' buf[n] = '\n'; // 若不需要换行可删除此行,并调整fwrite的长度 // 一次性写入所有内容到标准输出 fwrite(buf, sizeof(char), n + 1, stdout); free(buf); return 0; }
- 优势:
memset和fwrite都是经过编译器/系统优化的函数,执行效率极高,时间复杂度严格为O(n)。 - 注意:记得检查
malloc的返回值,避免内存分配失败。
方法2:利用GNU C扩展的printf格式技巧
如果你使用GNU C环境(比如GCC),可以借助格式符的扩展特性实现,但兼容性稍差:
#include <stdio.h> int main() { int n = 10; // 利用复合字面量生成足够长的'1'字符串,再通过%.*s截取前n个字符输出 printf("%.*s\n", n, (char[1024]){[0 ... 1023] = '1'}); return 0; }
- 注意:复合字面量的长度要大于等于
n,否则会读取越界内存。这种方式适合小范围的n值。
方法3:循环写入(简单但性能稍差)
如果不想使用动态内存,直接循环调用字符输出函数也是可行的,但频繁的系统调用会增加开销:
#include <stdio.h> int main() { int n = 10; for (int i = 0; i < n; i++) { putchar('1'); } putchar('\n'); return 0; }
- 优化点:如果是单线程环境,可以用
putchar_unlocked替代putchar,减少线程安全带来的开销。
内容的提问来源于stack exchange,提问作者Mohamed Afsal
相关产品推荐
相关产品推荐

