论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

C趣味程序百例(03)

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:44:54


8.借书方案知多少
9.杨辉三角形
10.数制转换



8.借书方案知多少
    小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?
*问题分析与算法设计
    本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数。首先对五本书从1至5进行编号,然后使用穷举的方法。假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就是满足题意的一种借阅方法。
*程序说明与注释
void main()
{
    int a,b,c,count=0;
    printf("There are diffrent methods for XM to distribute books to 3 readers:\n");
    for(a=1;a<=5;a++)             /*穷举第一个人借5本书中的1本的全部情况*/
        for(b=1;b<=5;b++)         /*穷举第二个人借5本书中的一本的全部情况*/
            for(c=1;a!=b&&c<=5;c++)    /*当前两个人借不同的书时,穷举第三个人借5本书
                                         中的1本的全部情况*/
                if(c!=a&&c!=b)         /*判定第三人与前两个人借的书是否不同*/
                    printf(count%8?"%2d:%d,%d,%d  ":"%2d:%d,%d,%d\n  ",++count,a,b,c);
                                       /*打印可能的借阅方法*/
}
*运行结果
    There are diffrent methods for XM to distribute books to 3 readers:
    1: 1,2,3        2: 1,2,4        3: 1,2,5        4: 1,3,2        5: 1,3,4
    6: 1,3,5        7: 1,4,2        8: 1,4,3        9: 1,4,5        10:1,5,2
    11:1,5,3        12:1,5,4        13:2,1,3        14:2,1,4        15:2,1,5
    16:2,3,1        17:2,3,4        18:2,3,5        19:2,4,1        20:2,4,3
    21:2,4,5        22:2,5,1        23:2,5,3        24:2,5,4        25:3,1,2
    26:3,1,4        27:3,1,5        28:3,2,1        29:3,2,4        30:3,2,5
    31:3,4,1        32:3,4,2        33:3,4,5        34:3,5,1        35:3,5,2
    36:3,5,4        37:4,1,2        38:4,1,3        39:4,1,5        40:4,2,1
    41:4,2,3        42:4,2,5        43:4,3,1        44:4,3,2        45:4,3,5
    46:4,5,1        47:4,5,2        48:4,5,3        49:5,1,2        50:5,1,3
    51:5,1,4        52:5,2,1        53:5,2,3        54:5,2,4        55:5,3,1
    56:5,3,2        57:5,3,4        58:5,4,1        59:5,4,2        60:5,4,3

----------------------------------------------------------------------------

9.杨辉三角形
    在屏幕上显示杨辉三角形

                            1
                         1      1
                      1     2      1
                   1     3     3      1
               1      4     6      4     1
            1     5     10     10     5     1
          ......................................

*问题分析与算法设计
    杨辉三角形中的数,正是(x+y)的N次方幂展开式各项的系数。本题作为程序设计中具有代表性的题目,求解的方法很多,这里仅给出一种。
    从杨辉三角形的特点出发,可以总结出:
    1)第N行有N+1个值(设起始行为第0行)
    2)对于第N行的第J个值:(N>=2)
        当J=1或J=N+1时:其值为1
        J!=1且J!=N+1时:其值为第N-1行的第J-1个值与第N-1行第J个值之和
    将这些特点提炼成数学公式可表示为:
                 1                          x=1或x=N+1
     c(x,y)= 
                 c(x-1,y-1)+c(x-1,y)        其它

    本程序应是根据以上递归的数学表达式编制的。
*程序说明与注释
#include<stdio.h>
void main()
{
    int i,j,n=13;
    printf("N=");
    while(n>12)
        scanf("%d",&n);     /*控制输入正确的值以保证屏幕显示的图形正确*/
    for(i=0;i<=n;i++)       /*控制输出N行*/
    {
        for(j-0;j<24-2*i;j++) printf(" ");  /*控制输出第i行前面的空格*/
        for(j=1;j<i+2;j++) printf("%4d",c(i,j));    /*输出第i行的第j个值*/
        printf("\n");
    }
}

void int c(int x,int y)     /*求杨辉三角形中第x行第y列的值*/
{
    int z;
    if((y==1)||(y==x+1))  return 1;  /*若为x行的第1或第x+1列,则输出1*/
    z=c(x-1,y-1)+c(x-1,y);          /*否则,其值为前一行中第y-1列与第y列值之和*/
    return z;
}
*运行结果
输入:N=12
输出:


*思考题
自行设计一种实现杨辉三角形的方法。

------------------------------------------------------------------------------

10.数制转换
    将任一整数转换为二进制形式
*问题分析与算法设计
     将十进制整数转换为二进制的方法很多,这里介绍的实现方法利用了C语言能够对位进行操作的特点。对于C语言来说,一个整数在计算机内就是以二进制的形式存储的,所以没有必要再将一个整数经过一系列的运算转换为二进制形式,只要将整数在内存中的二进制表示输出即可。
*程序说明与注释
#include<stdio.h>
void printb(int,int);
void main()
{
    int x;printf("Input number:");
    scanf("%d",&x);
    printf("number of decimal form:%d\n",x);
    printf("      it's binary form:");
    printb(x,sizeof(int)*8);  /*x:整数  sizeof(int):int型在内存中所占的字节数
                                 sizeof(int)*8:int型对应的位数*/
    putchar('\n');
}

void printb(int x,int n)
{
    if(n>0)
    {
        putchar('0'+((unsigned)(x&(1<<(n-1)))>>(n-1)));  /*输出第n位*/
        printb(x,n-1);      /*归调用,输出x的后n-1位*/
    }
}
*运行结果
输入:8
输出:
number of decimal form:8
    it's bunary form:0000000000001000
输入:-8
输出:number of decimal form:-8
it's binary form:1111111111111000
输入:32767
输出:number of decimal form:32767
    it's binary form:0111111111111111
输入:-32768
输出:number of decimal form:-32768
    it's binary form:1000000000000000
输入:128
输出:number of decimal form:128
    it's binary form:0000000010000000
*问题的进一步讨论
    充分利用C语言可以对位进行操作的特点,可以编写许多其它高级语言不便于编写甚至根本无法编写的程序。位操作是C语言的一大特点,在深入学习C语言的过程中应力求很好把握。
    程序中使用的位运算方法不是最佳的,也可以不用递归操作,大家可以自行对程序进行优化。

*思考题
    将任意正整数转换为四进制或八进制数
上一篇:{实例}C趣味程序百例(02) 人气:7257
下一篇:{实例}C趣味程序百例(04) 人气:5768
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程