C++实验二:流程控制(求最大公约数、质数判断、质因子分解、百钱百雉问题、案件嫌疑推理)

实验目的

1、学习选择语句(包括if-else 语句和switch 语句)的语法和使用。

2、学习循环结构(包括for 语句、while 语句和do-while 语句)的语法和使用,以及不同的循环语句之间的联系和区别。

3、学习break 语句和continue 语句在流程控制中的作用。

4、学习选择语句和结构语句的嵌套。

5、学习Visual Studio Debug 功能。

实验内容

1、设计程序,输入为两个正整数,输出为这两个正整数的最大公约数。

2、给出一个大于1 的正整数a,设计一个使用for 循环的程序判断这个数是否为质数。

3、设计程序,输入为一个正整数,给出这个整数的质因子分解(如。提示:质因子从小到大排列的分解更容易实现。

4.用本章学习的逻辑运算和流程控制的知识,求解我国古代数学中经典的“百钱百雉”问题:公元5 世纪末,我国古代数学家张丘建在《算经》中提出了如下问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。凡百钱买百鸡,问鸡翁、母、雏各几何?

5.某地发生了一起犯罪案件,警局经过审问,做出了以下判断:

   1) A、B 至少有1 人作案。

   2) A、E、F 中至少有2 人参与作案。

   3) A、D 不可能都是案犯。

   4) B、C 或同时作案,或与本案无关。

   5) C、D 中有且仅有1 人作案。

   6) 如果D 没有参与作案,那么E 也不可能参与作案。

请利用学过的关于逻辑运算和流程控制的方法,设计解答方案,并编程输出所有的案犯。

 

实验过程

实验一(最大公约数)

#include <iostream>

using namespace std;

int main()
{

    int a,b,i,t;
    cout << "Please input 2 numbers:" << endl;
    cin >> a >> b;

    if(a<b) //判断a、b大小
        t=b;
    else
        t=a;

    for(i=t;i>1;i--) //从a、b中较小的数开始找公约数
    {
        if(a%i==0 && b%i==0)
        {
            cout << "最大公约数为" << i;
            break;
        }
    }
    return 0;
}

运行结果

 

实验二(判断是否为质数)

代码

#include <iostream>
#include <cmath>

using namespace std;

int isPrime(int n) //判断n是否是质数
{
    float sqrt_n;
    int i,t = 1;
    for(i=3;i<sqrt(n);i+=2) //从3开始判断偶数
    {
        if(n%i==0)
            t = 0;
    }
    return t;
}
int main()
{
    int a;
    cout << "Please input a number:" << endl;
    cin >> a;
    if(a%2!=0 && isPrime(a)==1) //当不能被2整除用函数判断
        cout << a << "是质数" << endl;
    else
        cout << a << "不是质数" << endl;

    return 0;
}

运行结果

 

实验三(质因数分解)

代码

#include <iostream>

using namespace std;

int main()
{
    int n,k,i;
    cout << "Please input a number:" ;
    cin >> n;
    cout << n << "=";
    k = n;
    if(n<2)      //小于2的数不能分解
        return 0;
    for(i=2;i*i<k;i++) //从小到大用质数分解合数
    {
        while(k%i==0)
        {
            k = k/i;
            cout << i;
            if(k!=1)
                cout << "*";
        }
    }
    if(k!=1) //若为质数,输出
        cout << k;
    return 0;
}

运行结果

 

实验四(百钱百雉问题)

代码

#include <iostream>

using namespace std;

int main()
{
    int x,y,t=1;
    float z;
    for(x=0;(5*x)<=100;x++)
    {
        for(y=0;(3*y)<=100;y++)
        {
            for(z=0;(z/3.0)<100;z++) //注意到数据类型转换
            {
                if(5*x+3*y+z/3.0==100) //“百钱百雉”条件
                {
                    cout <<"第"<<t<<"种情况:鸡翁"<< x << "只;鸡母" << y << "只;鸡雏" << z <<"只"<< endl;
                    t++;
                }
            }
        }
    }
    return 0;
}

运行结果

 

实验五(案犯推理)

代码

#include <iostream>

using namespace std;

int main()
{
    int a,b,c,d,e,f,i;

    for(a=0;a<2;a++) //分别以0、1表示不犯罪、犯罪
    {
        for(b=0;b<2;b++)
        {
            for(c=0;c<2;c++)
            {
                for(d=0;d<2;d++)
                {
                    for(f=0;f<2;f++)
                    {
                        e = d;
                        if(a+b>0 && a+d+f>1 && a+d!=2 && c+d ==1 && (b+c==2 || b+c==0)) //将推理条件转化为编程语言
                        {
                            cout << "推断结果:" << endl;
                            if(a==1)
                                cout << "A是案犯"<< endl;
                            if(b==1)
                                cout << "B是案犯"<< endl;
                            if(c==1)
                                cout << "C是案犯"<< endl;
                            if(d==1)
                                cout << "D是案犯"<< endl;
                            if(e==1)
                                cout << "E是案犯"<< endl;
                            if(f==1)
                                cout << "F是案犯"<< endl;
                        }
                    }
                }
            }
        }
    }

    return 0;
}

运行结果

 

总结

这次实验完成了最大公约数、质数判断、质因数分解、百钱百雉及案犯推理几个实验,主要练习了C++流程控制结构。

通过本次实验,学习了C++的顺序、选择、循环结构的使用,其流程控制的代码形式与C语言基本一致;练习了C++用类的方法输入输出cin、cout。本次实验有几个重要的知识点:①从几种判断质数的算法中,找到复杂度较低的算法;②设计判断质数的函数,合理设置函数返回值;②百钱百雉问题包含隐含强制类型转换,需要使用浮点型数据保证正确输出;③案犯推理的问题,将文字叙述合理地转换为编程语言。

实验代码已经检查并优化,但依然存在重复,不够优雅。实验后,深入学习使用数组“储存”变量进行遍历等知识,对实验代码继续改进。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值