题目一 在屏幕上输出以下图案:
*
***
*****
*******
*********
***********
*************
***********
*********
*******
*****
***
*
- 分析
通过观察这个图形的 * 的最大个数为13
一共13行,第7行为对称轴
由对称轴分割,可以看出 * 个数规律不同
上片,是等差数列 2i + 1
下片,是等差数列 2n-(1+2*i) - 思路
需要for循环嵌套,最外层循环,控制行。
循环内部 分为 上片和下片两种不同循环结构。 - 实现
void printPhoto() {
for (int i = 0; i < 13; i++)//控制行
{
//上片
if (i <= 6) {
for (int j = 0; j <13 -i ; j++)
{
printf(" ");
}
for (int k = 0; k < 2*i + 1 ; k++)
{
printf("*");
}
}
if (i > 6) //下片
{
for (int m = 0; m < i + 1; m++)
{
printf(" ");
}
for (int n = 0; n < 2 * (12 - i) + 1; n++)
{
printf("*");
}
}
printf("\n");
}
}
- 更优解
我们可以看出,菱形是对称的,其下片每行 * 的个数与上片对称行的 * 个数相同
所以其打印规律与上片打印规律应相同。
但是我们最外层循环控制行数,行数是递增的,与 * 数规律并不相符,所以应该增加一个变量,存贮对应行的参数。
CorrespondingLine = line < 7 ? line : 13 - line + 1 //通过这个我们可以获得对应行
题目二 求出0~999之间的所有“水仙花数”并输出
- 分析
在数论中,水仙花数(Narcissistic number)也称为自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),是指一N位数,其各个数之N次方和等于该数。
例如153、370、371及407就是三位数的水仙花数,其各个数之立方和等于该数:
153 = 1^3 + 5^3 + 3^3。
370 = 3^3 + 7^3 + 0^3。
371 = 3^3 + 7^3 + 1^3。
407 = 4^3 + 0^3 + 7^3 - 思路
分解三位数,对各个数三次方的和与该数对比 - 实现
void narcissisticNumber() {
for (int i = 100; i < 1000; i++)
{
int tem1 = i / 100;
int remainder = i % 100;
int tem2 = remainder / 10;
int tem3 = (remainder % 10);
if (pow(tem1, 3)+pow(tem2, 3)+pow(tem3, 3) == i)
{
printf("水仙花数:%d\n", i);
}
}
}
题目三 求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,
例如:2+22+222+2222+22222
- 分析
数的位数每次加一,逐渐递增 - 思路
通过for循环,实现递增
每一次循环,数的位数都会加1。所以设置位数变量,作为基准。 - 实现
void sumMore() {
int item = 0; //基数
printf("请输入:");
int bit = 0; //位数
scanf("%d", &item);
int sum = 0;
for (int i = 1; i < 6; i++)
{
bit = bit * 10 + item;
sum += bit;
printf("bit:%d\n", bit);
}
printf("结果 = %d\n", sum);
}
写在最后
最近推出了公众号 coding趣谈,一位在读学生的技术提升之路,为您提供一系列我在学习路上的笔记,经验,以及感悟。往与君共勉,共同进步! 欢迎大家来关注哦!