从零开始学编程---第一步-C语言(十四)

时间:2014-03-05 21:18    点击:

再来扩展,输入个数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倍 递增



数学不太好的看这个题目可能一时无法难以了解透,这需要多加练习
找规律这个能力在编程里很重要

来源:幻想编程//所属分类:站长原创/更新时间:2014-03-05 21:18
顶一下
(19)
95%
踩一下
(1)
5%
上一篇:从零开始学编程---第一步-C语言(十三)
下一篇:从零开始学编程---第一步-C语言(十五)
相关内容