C++:专题三实验(求最大公约数、质数判断、质因子分解、百钱百雉问题、罪犯问题)

C++:专题三实验(求最大公约数、质数判断、质因子分解、百钱百雉问题、罪犯问题)

实验目的:

  1. 学习选择语句(包括if-else语句和switch语句)的语法和使用。
  2. 学习循环结构(包括for语句、while语句和do-while语句)的语法和使用,以及不同的循环语句之间的联系和区别。
  3. 学习break语句和continue语句在流程控制中的作用。
  4. 学习选择语句和结构语句的嵌套。
  5. 学习Visual Studio的Debug功能。

实验内容:

  1. 设计程序,输入为两个正整数,输出为这两个正整数的最大公约数。基本的算法为:从这两个数中的小数开始向下遍历,直到找到一个同时能被两个正整数整除的数为止。
  2. 给出一个大于1的正整数a,设计一个使用for循环的程序判断这个数是否为质数。
  3. 设计程序,输入为一个正整数,给出这个整数的质因子分解(如60=22235)。提示:质因子从小到大排列的分解更容易实现。
  4. 用本章学习的逻辑运算和流程控制的知识,求解我国古代数学中经典的“百钱百雉”问题:公元5世纪末,我国古代数学家张丘建在《算经》中提出了如下问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。凡百钱买百鸡,问鸡翁、母、雏各几何?
  5. 某地发生了一起犯罪案件,警局经过审问,做出了以下判断:
    ① A、B至少有1人作案。
    ② A、E、F中至少有2人参与作案。
    ③ A、D不可能都是案犯。
    ④ B、C或同时作案,或与本案无关。
    ⑤ C、D中有且仅有1人作案。
    ⑥ 如果D没有参与作案,那么E也不可能参与作案。 请利用学过的关于逻辑运算和流程控制的方法,设计解答方案,并编程输出所有的案犯。
(一)设计程序,输入为两个正整数,输出为这两个正整数的最大公约数。基本的算法为:从这两个数中的小数开始向下遍历,直到找到一个同时能被两个正整数整除的数为止。
#include <iostream>
using namespace std;

int main()
{
    int m, n, t;
    cout << "请输入两个数m,n:" << endl;
    cin >> m >> n;
    t = m < n ? m : n;

    for(int i = t; i > 0; i--)
    {
        if(m % i == 0 && n % i == 0)
        {
            cout << i << "是" << m << "和" << n << "的最大公约数" << endl;
            break;
        }
    }
}

在这里插入图片描述

(二)给出一个大于1的正整数a,设计一个使用for循环的程序判断这个数是否为质数。
#include <iostream>
using namespace std;

int main()
{
    int m;
    cout << "请输入一个大于一的数:" << endl;
    cin >> m;

    if(m <= 1)
        cout << "输入有误!" << endl;

    for(int i = 2; i <= m ; i++)
    {
        if(i == m - 1 || m == 2)
        {
            cout << m << "是质数。" << endl;
            break;
        }
        else if(m % i == 0)
        {
            cout << m << "是合数。" << endl;
            break;
        }
    }
}

在这里插入图片描述

(三)设计程序,输入为一个正整数,给出这个整数的质因子分解(如60=2*2*2*3*5)。提示:质因子从小到大排列的分解更容易实现。
#include <iostream>
using namespace std;

int main()
{
    int m;
    cout << "请输入一个大于1的正整数:" << endl;
    cin >> m;
    if(m <= 1)
        cout << "输入有误!" << endl;
    else
    {
        cout << m << "=";
        for(int i = 2; i * i < m; i++)
        {
            /*
            (1)这里i只会取到质数,因为任何合数都能由质数相乘得到,
            当i取到合数时它已经被它前面的质数表示过了。
            
            (2)条件为什么是i*i<m,因为i只会取到质数,如果i*i=m,
            那么比i更大的质数就不能用来表示m了。但是这样会导致一个问题,
            m最后有可能成为1或者一个比i更大的质数,
            如果成为1会被忽略,而成为一个更大的质数需要最后再输出。
            这其中也包括了m本身就是一个质数的情况,所以这种设计很巧妙。
            */
            while(m % i == 0) 
            //为什么用循环结构而不用条件结构呢?因为用质数表示合数时会出现重复的质数。
            {
                m /= i;
                cout << i;
                if(m != 1)
                    cout << "*";
            }
        }
        if(m != 1)
            cout << m << endl;
    }
}

在这里插入图片描述

(四)鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。凡百钱买百鸡,问鸡翁、母、雏各几何?
#include <iostream>
using namespace std;

int main()
{
    int a, b, c;

    for(a = 0; a <= 100; a++)
    {
        for(b = 0; b <= 100 - a; b++)
        {
            c = 100 - a - b;

            if((c % 3 == 0 ) && (a * 5 + b * 3 + c / 3 == 100))
                cout << "鸡翁:" << a << "\t鸡母:" << b << "\t鸡雏:" << c << endl;
        }
    }
}

在这里插入图片描述

(五)请利用学过的关于逻辑运算和流程控制的方法,设计解答方案,并编程输出所有的案犯。
#include <iostream>
using namespace std;

int main()
{
    int a, b, c, d, e, f;    //这里我们用1和0表示是否作案。
    for(a = 0; a < 2; a++)
        for(b = 0; b < 2; b++)
            for(c = 0; c < 2; c++)
                for(d = 0; d < 2; d++)
                    for(e = 0; e < 2; e++)
                        for(f = 0; f < 2; f++)
                            if((a + b >= 1) && ( a + e + f >= 2) && (a + d != 2 ) && (c + d == 1))
                                if((b + c == 0) || (b + c == 2))
                                    if((d + e == 0) || (d == 1))
                                    {
                                        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;

                                        cout << "\n" << endl;
                                    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值