C语言刷题1

📅 2026/7/3 16:48:05
C语言刷题1
1. 变种水仙花题目描述变种水仙花数-Lily Number:把任意的数字从中间拆分成两个数字比如1461可以拆分成(1和461)(14和61)(146和1),如果所有拆分后的乘积之和等于自身则是一个Lily Number。例如:6556 * 55 65 * 51461 1 * 461 14 * 61 146 * 1求出 5位数中的所有Lily Number。输入描述无输出描述:一行5位数中的所有LilyNumber每两个数之间间隔一个空格分析因为要输出5位数中所有的变种水仙花数所以范围是10000到99999之间然后判断是不是变种水仙花数。假设拆分12345这个数会拆成1 2345、12 345、123 45、1234 5如何得到题目中要求的方式呢如1234 5就是12345先%10最后一位数字5先打印下来然后再/10就会得到1234以此类推就能得到相对应的数字然后再根据题目给的示例在进行计算。如下代码所示#includestdio.hintmain(){inti0;for(i10000;i99999;i){intj0;intsum0;for(j10;j10000;j*10){sum(i/j)*(i%j);}if(sumi)printf(%d ,i);}return0;}//结果14610 16420 23610 34420 655002. 使用循环的方法打印菱形分析打印菱形的通用思路是拆成两部分以 * 为例上半部分正三角形从顶端到最宽的一行逐行变宽下半部分倒三角形从次宽行到底端逐行变窄上半部分正三角公式推导步骤 1列出行号与数量的对应表我们先手动数出每一行的「空格组数」和「星号组数」注意代码里 printf( “) 是 2 个空格为 1 组printf(”* ) 是星号 空格为 1 组两者宽度一致保证对齐。行号 i空格组数星号组数规律观察061空格最多星号最少153空格 - 1星号 2245空格 - 1星号 2337空格 - 1星号 2429空格 - 1星号 25111空格 - 1星号 26013空格为 0星号最多最宽行步骤 2推导空格数公式观察空格组数i0 →1i1→2i5→6 规律i 每增加 1空格数减少 1是递减的等差数列 首项i0是 6公差是 - 1 通项公式空格数 6 - i 对应到循环条件循环 j 从 0 开始要执行 6-i 次所以写 j 6 - i步骤 3推导星号数公式观察星号组数i0 → 1i1 → 3i2 → 5i6 →13 规律i 每增加 1星号数增加 2是递增的等差数列 首项i0是 1公差是 2 通项公式星号数 2*i 1 对应到循环条件循环 k 从 0 开始要执行 2*i1 次所以写 k 2 * i 1。下半部分倒三角公式推导步骤 1列出行号与数量的对应表行号 i空格组数星号组数规律观察0111对应上半部分 i5 的行129空格 1星号 - 2237空格 1星号 - 2345空格 1星号 - 2453空格 1星号 - 2561对应上半部分 i0 的行顶端步骤 2推导空格数公式观察空格组数i0 →1i1→2i5→6 规律i 每增加 1空格数增加 1递增的等差数列 首项i0是 1公差是 1 通项公式空格数 i 1 对应循环条件j i 1。步骤 3推导星号数公式观察星号组数i0 →11i1→9i5→1 规律i 每增加 1星号数减少 2递减的等差数列 首项i0是 11公差是 - 2 通项公式星号数 11 - 2*i 对应循环条件k 11 - 2 * i。补充11 这个数字怎么来的最宽行是 13 个星号下半部分第一行比最宽行少 2 个13-211对应 i0 的初始值。intmain(){charc0;scanf(%c,c);inti0;//外层循环变量用来控制总行数。intj0;//内层第一个循环变量用来控制每行开头的空格数量实现菱形的缩进效果。intk0;//内层第二个循环变量用来控制每行打印的字符数量。//打印上半部分7行for(i0;i7;i)//i 从 0 到 6 循环一共执行 7 次对应菱形上半部分的 7 行。{// 循环1打印每行开头的空格for(j0;j6-i;j)//i 越小前面的空格越多i 越大空格越少。{printf( );//每次循环输出 2 个空格}// 循环2打印每行的字符带空格for(k0;k2*i1;k)//i 每增加 1字符数量增加 2 个。{printf(%c ,c);}printf(\n);}//打印下半部分6行for(i0;i6;i){for(j0;ji1;j)//i 越大前面的空格越多字符部分逐行缩进。{printf( );}for(k0;k11-2*i;k)//每次输出字符 字符数量逐行递减 2 个。{printf(%c ,c);}printf(\n);}return0;}输出结果示例假设输入字符为** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *说明程序首先读取一个字符如*上半部分7行每行开头空格递减字符数量递增1, 3, 5, …, 13下半部分6行每行开头空格递增字符数量递减11, 9, 7, …, 1每打印一个字符后都带有一个空格所以显示为字符间有间隔每行开头的空格组实际上是两个空格所以缩进效果明显总结以后遇到任意大小的菱形 / 三角形都按这个固定步骤来定行数确定上半部分几行、下半部分几行给行号 i 取值范围。列表格把 i 从 0 开始的每一行手动数出空格数、字符数填进表格。找公差看相邻两行的数量变化是加几还是减几确定公差。写公式用「首项 公差 * i」写出通项公式。验边界代入首行、末行、中间行验证是否符合预期。举个简单例子5 行菱形对角线 5 个字符上半部分 3 行i0、1、2空格2、1、0 → 公式 2 - i字符1、3、5 → 公式 2 * i 1下半部分 2 行i0、1空格1、2 → 公式 i 1字符3、1 → 公式 3 - 2 * i