从零开始学编程---第一步-C语言(十四)
再来扩展,输入个数n,打印n长度的等腰三角形,能不能在计算总共有多少个*号?
别以为很难,其实非常简单
我们定义一个计数变量s 只要在每次循环打印*的时候都s++一次就可以拉
记住s必须初始化为0
程序如下:
#include <stdio.h>
main()
{
int a,b,c,n,s=0;
printf("请输入一个数:\n");
scanf("%d",&n);
for(a=1;a<=n;a++)
{
for(b=1;b<=a-1;b++)
{
printf(" ");
}
for(c=1;c<=2*n+1-2*a;c++)
{
printf("*");
s++;
}
printf("\n");
}
printf("\n总共%d个*号",s);
}
就这么简单
大家应该注意到*号的多少就是 n的平方
因为
1+3+5+7+9+11。。。。+n=n奇数的平方
所以如果你要求从1开始第n个奇数的和,只需n*n就OK了
n代表的是总共奇数的个数
我们已经知道输入一个数n可以打印长度为n的等腰三角形的方法
那我们输入一个数n,打印边长为n的菱形
例如我输入n=4
打印出的菱形如下
前4行的循环很简单,就是我们打印等腰三角形的方法
for(a=1;a<=n;a++)
{
for(b=1;b<=n-a;b++)
{
printf(" ");
}
for(c=1;c<=2*a-1;c++)
{
printf("*");
}
printf("\n");
}
后面下半部分的循环要当心了,不能原样照搬打印倒三角形的方法
因为n=4 下半部分却是三行,所以你要改条件
每一行就打印一个空格,n行就打印n的空格,这个条件你得改
我们知道,如果是打印倒等腰三角形 循环条件是c<=2*n+1-2*a
如果n=4 就是c<=9-2*a
但这里是3行
当n=4 循环条件却是c<=7-2*a
如果n=3 就是5-2*a
如果n=2 就是3-2*a
如果n=1 就是1-2*a
4--7
3--5
2--3
1--1
很简单的规律 2*n-1
所以for(c=1;c<=2*n-1-2*a;c++)
下半部分的循环为
for(a=1;a<=n-1;a++)
{
for(b=1;b<=a;b++)
{
printf(" ");
}
for(c=1;c<=2*n-1-2*a;c++)
{
printf("*");
}
printf("\n");
}
另外: for(c=1;c<=2*n-1-2*a;c++)又可写为 for(c=2*n-3;c>=2*a-1;c--)
提示 0,1,3,5,7。。的数列(通项)公式为,a1=0,an=2*n-3 直接取an(是一个大a和一个小n,学过数列的应该都知道)
整个程序为
#include <stdio.h>
main()
{
int a,b,c,n;
printf("请输入一个数:\n");
scanf("%d",&n);
for(a=1;a<=n;a++)
{
for(b=1;b<=n-a;b++)
{
printf(" ");
}
for(c=1;c<=2*a-1;c++)
{
printf("*");
}
printf("\n");
}
for(a=1;a<=n-1;a++)
{
for(b=1;b<=a;b++)
{
printf(" ");
}
for(c=1;c<=2*n-1-2*a;c++)
{
printf("*");
}
printf("\n");
}
}
再来一题
输入一个数n,打印用数字组成的直角三角形,并且按数字规律
1
22
333
4444
55555
666666
。。。
n
这题很简单,不用说,首先换行循环
for(a=1;a<=n;a++)
printf("\n");
接着是每行数字的循环
第1行,打印1个行数
第2行,打印2个行数
。。。
第n行,打印n个行数
for(b=1;b<=a;b++)
printf("%d",a);
程序如下
#include <stdio.h>
main()
{
int a,b,n;
printf("请输入一个数:\n");
scanf("%d",&n);
for(a=1;a<=n;a++)
{
for(b=1;b<=a;b++)
{
printf("%d",a);
}
printf("\n");
}
}
如果要让上面的程序打印成等腰三角形怎么弄,就是这样
很简单,空格循环还是原来那种循环
在循环数字打印的时候,打印一个数字就继续打印一个空格
看程序
#include <stdio.h>
main()
{
int a,b,c,n;
printf("请输入一个数:\n");
scanf("%d",&n);
for(a=1;a<=n;a++)
{
for(b=1;b<=n-a;b++)
{
printf(" ");
}
for(c=1;c<=a;c++)
{
printf("%d",a);
printf(" ");
}
printf("\n");
}
}
注意n不能大于9 大于9格式就不正确了,原因很简单,9以上的数都是两位数
根据上一题,我们继续扩展
输入一个数,求s=1+22+333+4444+55555+。。。。n S的总和
输入一个数n,就扩张n倍个数 输入6 就是 +666666
这题有点难度 先不说别的,你得先找出这些数字的规律
第一数是1 就是 1*1
第2个数是22 就是1*2+10*2
第3数是333 就是1*3+10*3+100*3
接下来的以此类推
先定义变量,数字a,总和s,输入的数n
怎么去用于循环?
首先是数字循环,这个很简单
for(a=1;a<=n;a++) 从1循环到n
然后每循环到后面一个数都要扩大10倍相加
先再定义一个变量x
看规律
1--------x*1 x=1
22-------x*2+x*2 x=1 x=10
333------x*3+x*3+x*3 x=1 x=10 x=100
每循环到一个数 x都要循环从1 开始循环到这个数的次数,例如数字是3,就要循环3次,并且每次循环都要以10倍递增
怎么写循环?
for(x=1;x<=?;x*=10) 这样?
由此可见,你无法预知它的条件,它不知道循环到什么时候停止,所以这个是错的
我们只能用另一个循环去控制x运算的循环
定义一个变量b,专门用来控制x运算的循环
for(b=1;b<=a;b++)
a是几,b就循环几次,也就x执行几次
下面写x运算的表达式
x=10*x+a 这里不能写成x*=10+a x*=10+a等同于x=x*(10+a) *=优先级低于+
x先要在循环里初始化为0,并且每次a循环一次就初始化为0一次
注意这里的x并不是循环1,10,100,1000
a变量存放是1,2,3,4,5。。。。
x就存放的是1,22,333,4444,55555
x=0;
for(b=1;b<=a;b++)
x=10*x+a
a等于几,x=10*x+a这个运算就执行几次
例如a=3
x=10*x+a执行第一次 x=10*0+3 x=3
x=10*x+a执行第2次 x=10*3+3 x=33
x=10*x+a执行第3次 x=10*33+3 x=333
这是零一中过滤
x为什么要初始化为0而不初始化为1,我想你看上面也知道了
经过b循环完成,x就存放了333
程序如下
#include <stdio.h>
main()
{
int a,b,n,s=0,x;
printf("请输入一个数:\n");
scanf("%d",&n);
for(a=1;a<=n;a++)
{
x=0;
for(b=1;b<=a;b++)
{
x=10*x+a;
}
s+=x;
}
printf("s=%d\n",s);
}
当输入n=3
a循环循环3次 b循环总共循环6次
a=1 循环一次 x=0 b循环循环一次 x=1 s=1
a=2 循环一次 x=0 b循环循环2次 一次x=2 2次x=22 s=23
a=3 循环一次 x=0 b循环循环3次 一次x=3 2次x=33 3次x=333 s=356
注意n别超过9 因为定义的数据类型是int,int控制的数字有限
最好可以用long int 类型
还有一种算法逻辑,相对来说比较简单
看程序
#include <stdio.h>
main()
{
long int a,b,s=0;
int n;
printf("请输入一个数:\n");
scanf("%d",&n);
for(a=1,b=1;a<=n;a++)
{
s+=a*b;
b=b*10+1;
}
printf("s=%d\n",s);
}
s+=a*b;看做s=s+(a*b)
这个逻辑很简单,且只有一层循环
当n=3 循环3次
第一次 s=0+(1*1) s=1 b=1*10+1 b=11
第2次 s=1+(2*11) s=23 b=11*10+1 b=111
第3次 s=23+(3*111) s=356 b=111*10+1 b=1111
循环结束
看的出,这个程序采用的规律是11的10倍 递增
数学不太好的看这个题目可能一时无法难以了解透,这需要多加练习
找规律这个能力在编程里很重要
最新内容
热点内容
- QQ群
-
微信
- 返回首页
- 返回顶部