C语言从1打印到100再打印到1,该如何编写?

嵌入式ARM 2022-10-11 11:59

C语言从1打印到100再打印到1,该如何编写?

我觉得这是一个送分题,奈何知乎人才太多了,给出了各种古怪的写法。如果是做项目的话,我比较建议一些正常的写法,就是大家都能看得懂的,不要搞什么花里胡哨。不过要是交流的话,既然是交流,我不觉得要多正规,即使你的观点有问题,我觉得也可以拿出来说说,毕竟是交流,各抒己见,发表自己的观点是最重要的。

为什么不建议大家花里胡哨?

我觉得花里胡哨之前首先是你基础非常好了再去花里胡哨,不要自己很多基础的东西还搞不清楚就去花里胡哨。


先来看下这个代码:

看看基础搞不明白的杀伤有多大。

void start_f(int first_start)
{
 char time_buf[512];
 char buf[512];
 if(!first_start)
 {
  sprintf(time_buf,"%s",get_time());
  int len = strlen(time_buf);
  time_buf[len -1 ] = 0;
  printf("time_buf:%s\n",time_buf);
 }
}

这个是在网上看到的一个代码,比较典型的基础不牢靠,对strlen 理解不够。

常规解题代码

我觉得对于这个题目,使用for是非常常规的思考方式,所以我看了所有的回答之后,写了一个常规的代码。

代码如下:

#include "stdio.h"

void main(void)
{
 int i=0;
 for(i=1;i<=100;i++)
 {
  printf("%d ",i);
 }
 for(i=99;i>=1;i--)
 {
  printf("%d ",i);
 }

代码输出:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
--------------------------------
Process exited after 0.04664 seconds with return value 2
请按任意键继续. . .

为什么是 void main ,而不是Int main?

这个是一个知乎留言提到的,很多人也对这个有疑惑,main 的写法有几种,有的被认为是正规的,有的被认为是不正规的。

main是一个函数,既然是一个函数,就遵从函数的规则就好。

所以,这样写输出并没有什么问题。

#include 

char * main()
{
 printf("hhh\n"); 
    return (char * )NULL;
}

我们还要知道比较常见的几种:

int main(int argc,char **argv){}
int main(int argc,char *argv[]){}
int main(void){}

对于返回值的认知:

main 函数是被操作系统调用的,既然是被操作系统调用的,操作系统会判断函数的返回值,通过返回值来判断程序是否正确运行,所以main函数的返回值是有意义的,我示例中的写法并不规范。

对main的解读:

比较玄乎的写法:

#include "stdio.h"
void fun(int n)
{
 if(n<100)
 {
  printf("%d ",n); 
  fun(n+1);
 } 
 printf("%d ",n);
}

int main(void)
{
 fun(1);
 return 0;
}

程序输出:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
--------------------------------
Process exited after 0.05336 seconds with return value 0
请按任意键继续. . .

这里涉及到递归,如果没有这个概念的人,脑子可能弯不过来~

大概是这样执行顺序的:

fun(1)
->fun(2)
--->fun(3)
........
---->fun(99)

把上面的代码修改下:

#include "stdio.h"
void fun(int n)
{
 if(n<100)
 {
  printf("fun(%d) ",n); 
  fun(n+1);
 } 
 printf("fun(%d) ",n);
}

int main(void)
{
 fun(1);
 return 0;
}

代码输出:

fun(1) fun(2) fun(3) fun(4) fun(5) fun(6) fun(7) fun(8) fun(9) fun(10) fun(11) fun(12) fun(13) fun(14) fun(15) fun(16) fun(17) fun(18) fun(19) fun(20) fun(21) fun(22) fun(23) fun(24) fun(25) fun(26) fun(27) fun(28) fun(29) fun(30) fun(31) fun(32) fun(33) fun(34) fun(35) fun(36) fun(37) fun(38) fun(39) fun(40) fun(41) fun(42) fun(43) fun(44) fun(45) fun(46) fun(47) fun(48) fun(49) fun(50) fun(51) fun(52) fun(53) fun(54) fun(55) fun(56) fun(57) fun(58) fun(59) fun(60) fun(61) fun(62) fun(63) fun(64) fun(65) fun(66) fun(67) fun(68) fun(69) fun(70) fun(71) fun(72) fun(73) fun(74) fun(75) fun(76) fun(77) fun(78) fun(79) fun(80) fun(81) fun(82) fun(83) fun(84) fun(85) fun(86) fun(87) fun(88) fun(89) fun(90) fun(91) fun(92) fun(93) fun(94) fun(95) fun(96) fun(97) fun(98) fun(99) fun(100) fun(99) fun(98) fun(97) fun(96) fun(95) fun(94) fun(93) fun(92) fun(91) fun(90) fun(89) fun(88) fun(87) fun(86) fun(85) fun(84) fun(83) fun(82) fun(81) fun(80) fun(79) fun(78) fun(77) fun(76) fun(75) fun(74) fun(73) fun(72) fun(71) fun(70) fun(69) fun(68) fun(67) fun(66) fun(65) fun(64) fun(63) fun(62) fun(61) fun(60) fun(59) fun(58) fun(57) fun(56) fun(55) fun(54) fun(53) fun(52) fun(51) fun(50) fun(49) fun(48) fun(47) fun(46) fun(45) fun(44) fun(43) fun(42) fun(41) fun(40) fun(39) fun(38) fun(37) fun(36) fun(35) fun(34) fun(33) fun(32) fun(31) fun(30) fun(29) fun(28) fun(27) fun(26) fun(25) fun(24) fun(23) fun(22) fun(21) fun(20) fun(19) fun(18) fun(17) fun(16) fun(15) fun(14) fun(13) fun(12) fun(11) fun(10) fun(9) fun(8) fun(7) fun(6) fun(5) fun(4) fun(3) fun(2) fun(1)

本文的重点在于,只有if 判断为假后,才结束递归,但递归不能无限大,太大了会撑爆栈空间的哦~

比如这样:

再看一个高赞的奇葩写法:

作者:已注销了
链接:https://www.zhihu.com/question/420856018/answer/1474402510
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

#include 
int main() {
 printf("1");
 printf(" ");
 printf("2");
 printf(" ");
 printf("3");
 printf(" ");
 printf("4");
 printf(" ");
 printf("5");
 printf(" ");
 printf("6");
 printf(" ");
 printf("7");
 printf(" ");
 printf("8");
 printf(" ");
 printf("9");
 printf(" ");
 printf("10");
 printf(" ");
 printf("11");
 printf(" ");
 printf("12");
 printf(" ");
 printf("13");
 printf(" ");
 printf("14");
 printf(" ");
 printf("15");
 printf(" ");
 printf("16");
 printf(" ");
 printf("17");
 printf(" ");
 printf("18");
 printf(" ");
 printf("19");
 printf(" ");
 printf("20");
 printf(" ");
 printf("21");
 printf(" ");
 printf("22");
 printf(" ");
 printf("23");
 printf(" ");
 printf("24");
 printf(" ");
 printf("25");
 printf(" ");
 printf("26");
 printf(" ");
 printf("27");
 printf(" ");
 printf("28");
 printf(" ");
 printf("29");
 printf(" ");
 printf("30");
 printf(" ");
 printf("31");
 printf(" ");
 printf("32");
 printf(" ");
 printf("33");
 printf(" ");
 printf("34");
 printf(" ");
 printf("35");
 printf(" ");
 printf("36");
 printf(" ");
 printf("37");
 printf(" ");
 printf("38");
 printf(" ");
 printf("39");
 printf(" ");
 printf("40");
 printf(" ");
 printf("41");
 printf(" ");
 printf("42");
 printf(" ");
 printf("43");
 printf(" ");
 printf("44");
 printf(" ");
 printf("45");
 printf(" ");
 printf("46");
 printf(" ");
 printf("47");
 printf(" ");
 printf("48");
 printf(" ");
 printf("49");
 printf(" ");
 printf("50");
 printf(" ");
 printf("51");
 printf(" ");
 printf("52");
 printf(" ");
 printf("53");
 printf(" ");
 printf("54");
 printf(" ");
 printf("55");
 printf(" ");
 printf("56");
 printf(" ");
 printf("57");
 printf(" ");
 printf("58");
 printf(" ");
 printf("59");
 printf(" ");
 printf("60");
 printf(" ");
 printf("61");
 printf(" ");
 printf("62");
 printf(" ");
 printf("63");
 printf(" ");
 printf("64");
 printf(" ");
 printf("65");
 printf(" ");
 printf("66");
 printf(" ");
 printf("67");
 printf(" ");
 printf("68");
 printf(" ");
 printf("69");
 printf(" ");
 printf("70");
 printf(" ");
 printf("71");
 printf(" ");
 printf("72");
 printf(" ");
 printf("73");
 printf(" ");
 printf("74");
 printf(" ");
 printf("75");
 printf(" ");
 printf("76");
 printf(" ");
 printf("77");
 printf(" ");
 printf("78");
 printf(" ");
 printf("79");
 printf(" ");
 printf("80");
 printf(" ");
 printf("81");
 printf(" ");
 printf("82");
 printf(" ");
 printf("83");
 printf(" ");
 printf("84");
 printf(" ");
 printf("85");
 printf(" ");
 printf("86");
 printf(" ");
 printf("87");
 printf(" ");
 printf("88");
 printf(" ");
 printf("89");
 printf(" ");
 printf("90");
 printf(" ");
 printf("91");
 printf(" ");
 printf("92");
 printf(" ");
 printf("93");
 printf(" ");
 printf("94");
 printf(" ");
 printf("95");
 printf(" ");
 printf("96");
 printf(" ");
 printf("97");
 printf(" ");
 printf("98");
 printf(" ");
 printf("99");
 printf(" ");
 printf("100");
 printf(" ");
 printf("99");
 printf(" ");
 printf("98");
 printf(" ");
 printf("97");
 printf(" ");
 printf("96");
 printf(" ");
 printf("95");
 printf(" ");
 printf("94");
 printf(" ");
 printf("93");
 printf(" ");
 printf("92");
 printf(" ");
 printf("91");
 printf(" ");
 printf("90");
 printf(" ");
 printf("89");
 printf(" ");
 printf("88");
 printf(" ");
 printf("87");
 printf(" ");
 printf("86");
 printf(" ");
 printf("85");
 printf(" ");
 printf("84");
 printf(" ");
 printf("83");
 printf(" ");
 printf("82");
 printf(" ");
 printf("81");
 printf(" ");
 printf("80");
 printf(" ");
 printf("79");
 printf(" ");
 printf("78");
 printf(" ");
 printf("77");
 printf(" ");
 printf("76");
 printf(" ");
 printf("75");
 printf(" ");
 printf("74");
 printf(" ");
 printf("73");
 printf(" ");
 printf("72");
 printf(" ");
 printf("71");
 printf(" ");
 printf("70");
 printf(" ");
 printf("69");
 printf(" ");
 printf("68");
 printf(" ");
 printf("67");
 printf(" ");
 printf("66");
 printf(" ");
 printf("65");
 printf(" ");
 printf("64");
 printf(" ");
 printf("63");
 printf(" ");
 printf("62");
 printf(" ");
 printf("61");
 printf(" ");
 printf("60");
 printf(" ");
 printf("59");
 printf(" ");
 printf("58");
 printf(" ");
 printf("57");
 printf(" ");
 printf("56");
 printf(" ");
 printf("55");
 printf(" ");
 printf("54");
 printf(" ");
 printf("53");
 printf(" ");
 printf("52");
 printf(" ");
 printf("51");
 printf(" ");
 printf("50");
 printf(" ");
 printf("49");
 printf(" ");
 printf("48");
 printf(" ");
 printf("47");
 printf(" ");
 printf("46");
 printf(" ");
 printf("45");
 printf(" ");
 printf("44");
 printf(" ");
 printf("43");
 printf(" ");
 printf("42");
 printf(" ");
 printf("41");
 printf(" ");
 printf("40");
 printf(" ");
 printf("39");
 printf(" ");
 printf("38");
 printf(" ");
 printf("37");
 printf(" ");
 printf("36");
 printf(" ");
 printf("35");
 printf(" ");
 printf("34");
 printf(" ");
 printf("33");
 printf(" ");
 printf("32");
 printf(" ");
 printf("31");
 printf(" ");
 printf("30");
 printf(" ");
 printf("29");
 printf(" ");
 printf("28");
 printf(" ");
 printf("27");
 printf(" ");
 printf("26");
 printf(" ");
 printf("25");
 printf(" ");
 printf("24");
 printf(" ");
 printf("23");
 printf(" ");
 printf("22");
 printf(" ");
 printf("21");
 printf(" ");
 printf("20");
 printf(" ");
 printf("19");
 printf(" ");
 printf("18");
 printf(" ");
 printf("17");
 printf(" ");
 printf("16");
 printf(" ");
 printf("15");
 printf(" ");
 printf("14");
 printf(" ");
 printf("13");
 printf(" ");
 printf("12");
 printf(" ");
 printf("11");
 printf(" ");
 printf("10");
 printf(" ");
 printf("9");
 printf(" ");
 printf("8");
 printf(" ");
 printf("7");
 printf(" ");
 printf("6");
 printf(" ");
 printf("5");
 printf(" ");
 printf("4");
 printf(" ");
 printf("3");
 printf(" ");
 printf("2");
 printf(" ");
 printf("1");
 printf(" ");
 return 0;
}


END

来源:嵌入式Linux


版权归原作者所有,如有侵权,请联系删除。

推荐阅读
一个蓝牙实战项目的掏肺总结
I2C接口通讯实现方式,你掌握了几种?
printf()是如何与UART外设驱动函数“勾搭”起来的?

→点关注,不迷路←
嵌入式ARM 关注这个时代最火的嵌入式ARM,你想知道的都在这里。
评论
  • 文:杜杰编辑:侯煜当地时间7月28日,美国特朗普政府落地最新科技封锁政策,美国联邦通信委员会(FCC)正式更新《受管制清单》,新增两大类设备——境外生产的先进机器人设备、境外生产的联网电力逆变器。FCC在官方情况说明书中明确,该类境外制造产品,“会对美国国家安全或美国民众的人身安全构成无法承受的风险”。本次新规设置明确豁免机制:经美国国防部(DoW)、电力逆变器品类经美国国土安全部(DHS)审核并授予“有条件批准”,认定对应设备品类不存在重大安全风险,即可获得准入豁免。同时政策严格执行新老划断原
    华尔街科技眼 2026-08-03 21:28 325浏览
  • ​摘要:低价大流量卡正全面退市,政策收紧已成定局。面对传统号卡的不确定性,随身WiFi凭借稳定连接、多设备共享、独立设备和灵活套餐等优势,成为务实可靠的备选方案。1、流量卡黄金时代要结束了通信行业正迎来一场前所未有的“地震式”调整——曾让无数用户追捧的低价大流量卡,正在全速退出各大平台。这早已不是一次普通的竞合,而是一场趋势性的行业洗牌。回望过去,19元200G的神卡,那时真是“睡着都能笑醒”,便宜到不敢相信,爽到忍不住炫耀。那些日子,好像随便刷、随便看,流量自由触手可及。可如今,回头再看,那种
    爱上电路设计 2026-08-03 10:21 128869浏览
  • 产品使用18V供电,配套4串锂离子电池,需要设计一个充电器。因为输入18V,电池最高 16.8V,压差仅 1.2V。因为压差太小。使用开关型的充电控制芯片不稳定。尝试自行设计一个。整体采用分立三极管 + TL431架构,分4个功能单元:使能控制回路、限流环路、TL431 精密恒压反馈环路、PNP 功率管主功率输出回路;实现完整锂电池充电逻辑。使能控制回路按键按下:5V 电压经 R12 (2kΩ) 送入 NPN 管 Q3 基极,Q3 饱和导通,对地拉低 R1、R2 组成的分压控制节点电位;该节点直
    southcreek 2026-08-07 13:45 316浏览
  •                                                                        
    广州铁金刚 2026-08-06 17:44 99922浏览
  • 在前六期中,我们已经分别讨论了 CRA 的适用范围、整体影响、漏洞通报义务、风险评估与技术文档证据链、第三方组件与 SBOM 供应链治理,以及产品上市后的支持期、安全更新、用户说明和终止支持管理。到这里,企业已经能够回答几个核心问题:产品是否落入 CRA 适用范围,产品由哪些组件构成,企业如何证明自己在设计、开发和上市前采取了必要的安全措施,以及产品上市后如何持续维护和安全下线。但对于真正准备落地 CRA 合规的企业来说,还有一个更现实的问题:CRA 的法规条文相对原则化,企业应当如何把“网络安
    虹科云科技 2026-08-03 16:51 148809浏览
  •        很多人只见过封装在SMD外壳里的小尺寸晶振,却不知道一颗2016、1612甚至1210封装的微型石英晶振,从一块巴掌大的石英原矿,到最终能稳定起振的成品,要经过十几道精密工序。它内部的石英晶片厚度最薄不到20微米,比普通A4纸的1/5还薄,整个生产过程里哪怕0.1微米的误差,都会直接废掉整批产品,这也是小尺寸晶振过去长期依赖进口,国内厂商花了十几年才啃下量产硬骨头的核心原因。1. 原石定向切割:0.01度的角度误差都不能有小尺寸晶振的第一步,
    TKD泰晶科技 2026-08-07 08:43 374浏览
  • 在物联网从“万物互联”迈向“万物智联”的进程中,LTE Cat.1凭借其在速率、成本与网络覆盖之间的完美平衡,正成为中低速物联网市场的绝对主力。随着2G/3G网络的逐步退网以及新国标对终端设备智能化、定位功能的强制要求,Cat.1模组迎来了爆发式的增长窗口。在这一关键节点,基于华为海思Hi2131芯片设计的LTE Cat.1模组,凭借其在能效、射频、架构及物理规格上的底层创新,成功打破了“高性能必高功耗”的传统魔咒,为行业提供了极具竞争力的连接最优解。核心技术优势:重塑Cat.1能效与连接标杆海
    用户1778981989717 2026-08-05 21:04 169浏览
  • 摘要在防爆电气设计中,只参照芯数选型而忽略额定载流量,长期满负荷运行会出现插头发热、接触面氧化、IP67 密封受热老化等问题。结合常用 3 针 3 孔、4 芯、5PIN、8PIN 圆形防爆连接器,制作分级电流参数对照表,区分冷压免焊接、焊接两种接线结构的安全载流数值,设置合理电流冗余系数,搭配使用环境修正参数,规范防爆接近开关连接器、防爆法兰插座的选型计算方式。关键词圆形防爆连接器,载流参数表,防爆法兰插座,防爆端子接头,IP67 防爆防水接插件1 产品概述圆形防爆连接器触点载流能力由插针直径、
    kyfbest科迎法电气 2026-08-03 09:18 128641浏览
  • 做蓝牙音箱的工程师大概都碰过这个局面。产品要连手机放歌,要本地播开机提示音和按键音,还要接 App 做配网和状态上报。三件事拆开,早先的常规做法是音频蓝牙一颗料、数传蓝牙一颗料、本地播放再挂一颗小 MCU 加一片 Flash。板子越画越大,BOM 越算越贵,待机电流和固件工作量也跟着涨。WT2605C 出来以后,这套需求可以集成到一颗芯片,就是 WT2605C-32N,该芯片采用QFN32 封装,4×4 毫米,把音频蓝牙、BLE 数传和 MP3 本地播放三样全包了。对蓝牙音箱来说,最实在的好处就
    唯创知音语音芯片 2026-08-06 15:14 284浏览
  • 导语在现代高速数字电路设计中,信号的完整性已不仅是理想波形推演,而是一场与物理非理想特性正面博弈的工程实践。滤波器芯片作为净化传输链路的关键屏障,其核心挑战在于:能否有效识别并滤除那些隐匿在电平跳变过程中的亚纳秒级瞬态脉冲干扰,这类干扰持续极短,却足以在高速链路中引发误触发。然而,传统函数发生器受限于采样率与边沿速率,根本无法忠实复现如此狭窄且陡峭的异常波形。针对此困境,德思特TS-AWG7000系列任意波形发生器以17 GS/s采样率与50 ps原生边沿速度,为瞬态脉冲提供精细刻画,配合SPG
    德思特测试测量 2026-08-05 14:06 5浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦