C语言竞赛练习题1
1.求最大数
    问555555的约数中最大的三位数是多少?
*问题分析与算法设计
    根据约数的定义,对于一个整数N,除去1和它自身外,凡能整除N的数即为N的约数。因此,最简单的方法是用2到N-1之间的所有数去除N,即可求出N的全部约数。本题只要求取约数中最大的三位数,则其取值范围可限制在100到999之间。
*程序说明与注释
#include<stdio.h>
void main()
{
    long i;
    int j;
    printf("Please input number:");
    scanf("%ld",&i);
    for(j=999;j>=100;j--)
        if(i%j==0)
        {
            printf("The max factor with 3 digits in %ld is:%d,\\n",i,j);
            break;
        }
}
*运行结果
    输入:555555
    输出:The max factor with 3 digits in 555555 is:777
2.高次方数的尾数
    求13的13次方的最后三位数
*问题分析与算法设计
    解本题最直接的方法是:将13累乘13次方截取最后三位即可。
    但是由于计算机所能表示的整数范围有限,用这种“正确”的算法不可能得到正确的结果。事实上,题目仅要求最后三位的值,完全没有必要求13的13次方的完整结果。
    研究乘法的规律发现:乘积的最后三位的值只与乘数和被乘数的后三位有关,与乘数和被乘数的高位无关。利用这一规律,可以大大简化程序。
*程序说明与注释
#include<stdio.h>
void main()
{
    int i,x,y,last=1;    /*变量last保存求X的Y次方过程中的部分乘积的后三位*/
    printf("Input X and Y(X**Y):");
    scanf("%d**%d",&x,&y);
    for(i=1;i<=y;i++)                /*X自乘Y次*/
        last=last*x%1000;    /*将last乘X后对1000取模,即求积的后三位*/
    printf("The last 3 digits of %d**%d is:%d\\n",x,y,last%1000); /*打印结果*/
}
*运行结果
    Input X and Y(X**Y):13**13
    The last 3 digits of 13**13 is:253
    Input X and Y(X**Y):13**20
The last 3 digits of 13**20 is:801
3.借书方案知多少
    小明有五本新书,要借给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
4.数制转换
    将任一整数转换为二进制形式
*问题分析与算法设计
    将十进制整数转换为二进制的方法很多,这里介绍的实现方法利用了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:0
输入:32767
输出:number of decimal form:32767
    it\'s binary form:0
输入:-32768
输出:number of decimal form:-32768
    it\'s binary form:0
输入:128
输出:number of decimal form:128
    it\'s binary form:00000000
5.打鱼还是晒网
    中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。数学二进制的算法
*问题分析与算法设计
    根据题意可以将解题过程分为三步:
1)计算从1990年1月1日开始至指定日期共有多少天;
2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
3)根据余数判断他是在“打鱼”还是在“晒网”;
    若  余数为1,2,3,则他是在“打鱼”
    否则  是在“晒网”
    在这三步中,关键是第一步。求从1990年1月1日至指定日期有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。闰年的方法可以用伪语句描述如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。