周而复始的循环之道测试

1. 若变量已正确定义,要求程序段完成求5!的计算,不能完成此操作的程序段是

A.

#include <stdio.h>
int main( )
{
    int i;
    int p;
    for(i=1;i<=5;i++ )
    {
        p=1;
        p*=i;
    }
    printf("5!=%d\n", p);
    return 0;
}

    每次执行循环体时, 变量p的值都重新置为1, 这不符合阶乘运算的规则.

 

 

B.

#include <stdio.h>
int main( )
{
    int i;
    int p;
    i=1;
    p=1;
    while(i<=5)
    {
        p*=i;
        i++;
    }
    printf("5!=%d\n", p);
    return 0;
}

 

C.

#include <stdio.h>
int main( )
{
    int i;
    int p;
    for(i=1,p=1;i<=5;i++)
    {
        p*=i;
    }
    printf("5!=%d\n", p);
    return 0;
}

 

D.

#include <stdio.h>
int main( )
{
    int i;
    int p;
    i=1;
    p=1;
    do{
        p*=i;
        i++;
    }while(i<=5);
    printf("5!=%d\n", p);
    return 0;
}

 

 2. 以下程序执行后的输出结果是

#include <stdio.h>
int main( )
{
    int x=0,y=5,z=3;
    while(z-->0 && ++x<5)
    {
        y=y-1;
    }
    printf("%d, %d, %d", x, y, z);
    return 0;
}

[分析] 

    对程序做出修改, 使得每一次进入循环后程序都输出当前x、y、z的值.

#include <stdio.h>
int main( )
{
    int x=0,y=5,z=3;
    while(z-->0 && ++x<5)
    {
        y=y-1;
        printf("x=%d, y=%d, z=%d\n", x, y, z);
    }
    printf("%d, %d, %d", x, y, z);
    return 0;
}

 

[运行结果] 

 

    对题目所给程序做出修改, 观察两个程序的运行结果是否相同(z的值不同).

#include <stdio.h>
int main( )
{
    int x=0,y=5,z=3;
    while(z>0 && x<5)
    {
        y=y-1;
        z--;
        x++;
        printf("x=%d, y=%d, z=%d\n", x, y, z);
    }
    printf("%d, %d, %d", x, y, z);
    return 0;
}

 

3.

 

4. 我国古代的《张丘建算经》中有这样一道著名的百鸡问题:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”其意为:公鸡每只5元,母鸡每只3元,小鸡3只1元。用100元买100只鸡,问公鸡、母鸡和小鸡各能买多少只?

[解法1]

#include<stdio.h>
int main()
{
    short x, y;//x -> 公鸡, y -> 母鸡
    short counter=0;
    printf("公鸡    母鸡    小鸡\n");
    for(x=0;x<=20;x++)
    {
        for(y=0;y<=33;y++)
        {
            //若小鸡的数量能被3整除, 则小鸡的钱数为整数.
            //反之若小鸡的数量不能被3整除, 则小鸡的钱数会带小数, 加上母鸡和公鸡的钱数不可能为整数.
            if((100-x-y)%3==0)
            {
                if(x*5+y*3+(100-x-y)/3==100)
                {
                    printf("%5d%5d%5d\n", x, y, 100-x-y);
                }
            }
            counter++;
        }
    }
    printf("求解过程共执行%hd次循环.\n", counter);
    //
    return 0;
}

 

[解法2](程序执行效率大幅提升)

#include<stdio.h>
int main()
{
    short x, y;//x -> 公鸡, y -> 母鸡
    short counter=0;
    printf("公鸡    母鸡    小鸡\n");
    for(x=0;x<=20;x++)
    {
        for(y=0;y<=33;y++)
        {
            //若当前的钱数已超过100元, 直接跳出内层循环
            if(x*5+y*3+(100-x-y)/3.0>100)
            {
                break;
            }
            //
            //若小鸡的数量能被3整除, 则小鸡的钱数为整数.
            //反之若小鸡的数量不能被3整除, 则小鸡的钱数会带小数, 加上母鸡和公鸡的钱数不可能为整数.
            if((100-x-y)%3==0)
            {
                if(x*5+y*3+(100-x-y)/3==100)
                {
                    printf("%5d%5d%5d\n", x, y, 100-x-y);
                }
            }
            counter++;
        }
    }
    printf("求解过程共执行%hd次循环.\n", counter);
    //
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好梦成真Kevin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值