【C语言进阶】 菱形图案打印、水仙花数、买汽水
目录
菱形图案打印
题目要求
其实呢这道题很多人想到直接用printf()进行输出,我想说的是,这样写不但麻烦、代码难看,而且实用性极低,所以当我们遇到这种类似循环输出题目是,不建议printf()输出;
接下来我就为大家简单介绍一下此题的做法,对于这类型的题其实我们只需要找到规律,就非常简单,仔细观察图形,可以发现,此图形中是由空格和*按照不同个数的输出组成的。我们这里将这个图案分为两个部分从上往下,按照2*(line-1-i)-1的方式减少,其中:line表示总共有多少行 按照上述方式,将上三角和下三角中的空格和*分别输出即可。
上三角
上三角:先输出空格,后输出*,每行中 空格:从上往下,一行减少一个 *:2*i+1的方式递增
代码实现如下
int main()
{
int line = 0;
int i = 0;
scanf("%d", &line);//可自己选择打印图案的大小
//打印上半部分
for(i=0; i<line; i++)
{
//打印一行
//打印空格
int j = 0;
for(j=0; j<line-1-i; j++)
{
printf(" ");
}
//打印*
for(j=0; j<2*i+1; j++)
{
printf("*");
}
printf("\n");
}
下三角
下三角:先输出空格,后输出*,每行中 空格:从上往下,每行多一个空格
代码实现如下
//打印下半部分
for(i=0; i<line-1; i++)
{
//打印一行
int j = 0;
for(j=0; j<=i; j++)
{
printf(" ");
}
for(j=0; j<2*(line-1-i)-1; j++)
{
printf("*");
}
printf("\n");
}
拓展:带空格直角三角形图案
题目要求
示例展示
这里博主就不做过多讲解了,这种找规律的题,还需要宝子们多勤加练习,这里给出两个解题代码
代码一
int main()
{
int n = 0;
while(scanf("%d", &n) != EOF)
{
int i = 0;
//行数控制
for(i=0; i<n; i++)
{
//空格
int j = 0;
for(j=0; j<n-1-i; j++)
{
printf(" ");
}
//*
for(j=0; j<=i; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
代码二
int main()
{
int n = 0;
while(scanf("%d", &n) != EOF)
{
int i = 0;
int j = 0;
//行数
for(i=0; i<n; i++)
{
//一行
for(j=0; j<n; j++)
{
//行和列的和
//这里可以把行数和列数标出来就能看明白
if(i+j<n-1)
{
printf(" ");
}
else
{
printf("* ");
}
}
printf("\n");
}
}
return 0;
}
水仙花数
题目要求
求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”
解题思路
我们将此题进行拓展一下,我们想加入我们想要求100以内的呢?或者更大呢?
所以我们改为我们只需要输入我们想要的n,便就可以输出你想要的0~n之间的水仙花数
int n = 0;
scanf("%d", &n);
首先水仙花数要用自身的位数为次方,所以我们需要求出它的位数,实现如下
int panduan(int n)
{
if (n / 10 != 0)
return 1 + panduan(n / 10);
else return 1;//整数最少也为一位
}
其次我们需要剥离每一位并进行求和,代码如下
int jisuan(int a, int b)
{
if (a / 10 != 0)
{
return pow(a % 10, b) + jisuan(a / 10,b);
}
else return pow(a % 10, b);
}
最后 我们就只要再进行遍历每一个数并判断就好,代码如下
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0;
for (i = 0; i < n; i++)
{
int w = panduan(i);
int sn = jisuan(i, w);
if (sn == i)
printf("%d ", i);
}
return 0;
}
拓展:变种水仙花数
题目要求
这里博主就不做过多解释了,如果看代码有不懂的宝子可以私信博主,或者评论留言,代码如下
#include <stdio.h>
#include<math.h>
int main() {
int i = 0;
int n = 0;
int s = 0;
for (i =10000; i <= 99999; i++)
{
int b = 0;
int a = 1;
while (a != 0)
{
a = i / pow(10, b);
b++;
}
s = 0;
for (n = 1; n<b - 1; n++)
{
int d = pow(10, n);
s =s+i/d * (i % d);
}
if(s==i)
printf("%d ", i);
}
return 0;
}
买汽水
题目要求:
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。
思路
1. 20元首先可以喝20瓶,此时手中有20个空瓶子 2. 两个空瓶子可以喝一瓶,喝完之后,空瓶子剩余:汽水数/2(两个空瓶子换的喝完后产生的瓶子) + 汽水数%2(不够换的瓶子) 3. 如果瓶子个数超过1个,可以继续换,即重复2
先来看看博主写的代码:
#include<stdio.h>
int maiqishui(int n)
{
int count = n;
while (n / 2 != 0)
{
count = count + n / 2;
n = n / 2 + n % 2;
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int sn = maiqishui(n);
printf("%d", sn);
return 0;
}
博主在这二再提供两种代码,供宝子们理解
代码一
int main()
{
int money = 0;
int total = 0;
int empty = 0;
scanf("%d", &money);
//方法1
total = money;
empty = money;
while(empty>1)
{
total += empty/2;
empty = empty/2+empty%2;
}
return 0;
}
代码二
// 方法二:按照上述喝水和用瓶子换的规则的话,可以发现,其实就是个等差数列:money*2-1
int main()
{
int money = 0;
int total = 0;
int empty = 0;
scanf("%d", &money);
//方法2
if(money <= 0)
{
total = 0;
}
else
{
total = money*2-1;
}
printf("total = %d\n", total);
return 0;
}
妙用汽水瓶
我们想一个事,加入你有一个汽水瓶,然后你向老板借一个空汽水瓶,然后现在你有两个空汽水瓶,又可以换一瓶汽水,喝完后再换给老板!!!
博主将消失一段时间进行备战期末考试,感谢各位的支持,记得三连哦