Qt C++春晚刘谦魔术约瑟夫环问题的模拟程序

news2024/12/23 9:56:27

什么是约瑟夫环问题?

约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。
分析:
(1)由于对于每个人只有死和活两种状态,因此可以用布尔型数组标记每个人的状态,可用true表示死,false表示活。
(2)开始时每个人都是活的,所以数组初值全部赋为false。
(3)模拟杀人过程,直到所有人都被杀死为止。

魔术

1、4张牌对折后撕开,就是8张,叠放在一起就是ABCDABCD。注意,ABCD四个数字是完全等价的。
2、根据名字字数,把顶上的牌放到下面,但怎么放都不会改变循环序列的相对位置。譬如2次,最后变成CDABCDAB;譬如3次,最后换成DABCDABC。但无论怎么操作,第4张和第8张牌都是一样的。
3、把顶上3张插到中间任意位置。这一步非常重要!因为操作完之后必然出现第1张和第8张牌是一样的!以名字两个字为例,可以写成BxxxxxxB(这里的x是其他和B不同的牌)。
4、拿掉顶上的牌放到一边,记为B。剩下的序列是xxxxxxB,一共7张牌。
5、南方人/北方人/不确定,分别拿顶上的1/2/3张牌插到中间,但是不会改变剩下7张牌是xxxxxxB的结果。
6、男生拿掉1张,女生拿掉2张。也就是男生剩下6张,女生剩下5张。分别是xxxxxB和xxxxB。
7、把最顶上的放到最底下,循环7次,男生和女生分别会是xxxxBx和xxBxx。
8、最后执行约瑟夫环过程!操作到最后只剩下1张。当牌数为6时(男生),剩下的就是第5张牌;当牌数为5时(女生),剩下的就是第3张牌。就是第4步拿掉的那张牌!

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1157e96989d6436ea8772e76b1130263.png

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <vector>
#include "brand.h"
#include <QPushButton>
#include <QRadioButton>
#include <QLineEdit>
#include <QLayout>
#include <QStackedWidget>
#include <QSplitter>
#include <QButtonGroup>
class Step: public QWidget
{
public:
    Step(QWidget *parent = 0):QWidget(parent){
        QVBoxLayout* vbox = new QVBoxLayout(this);
        QHBoxLayout* hboxLabel = new QHBoxLayout;
        hboxChoose = new QHBoxLayout;
        QHBoxLayout* hboxBtn = new QHBoxLayout;
        label = new QLabel(this);
        hboxLabel->addStretch();
        hboxLabel->addWidget(label);
        hboxLabel->addStretch();
        hboxBtn->addStretch();
        vbox->addLayout(hboxLabel);
        vbox->addLayout(hboxChoose);
        vbox->addLayout(hboxBtn);
    }
    void SetText(QString text){
        label->setText(text);
    }

    QHBoxLayout* GetChooseLayout(){
        return hboxChoose;
    }
    virtual bool Check() {
        return true;
    }
private:
    QLabel* label;
    QHBoxLayout* hboxChoose;
};

class Start: public Step
{
public:
    Start(QWidget *parent = 0):Step(parent)
    {
        SetText("请输入四个数字、字母或汉字");
        edit = new QLineEdit(this);
        edit->setPlaceholderText("请输入四个数字、字母或汉字");
        GetChooseLayout()->addWidget(edit);
    }
    QString GetStr(){
        return edit->text();
    }
    bool Check() {
        return edit->text().size() == 4;
    }

private:
    QLineEdit* edit;
};

class First: public Step
{
public:
    First(QWidget *parent = 0):Step(parent)
    {
        SetText("4张牌对折后撕开");
    }
};

class Second: public Step
{
public:
    Second(QWidget *parent = 0):Step(parent)
    {
        SetText("请输入您的名字");
        edit = new QLineEdit(this);
        edit->setPlaceholderText("请输入您的名字");
        GetChooseLayout()->addWidget(edit);
    }
    int GetNumber(){
        return edit->text().size();
    }
    bool Check() {
        return edit->text().size() > 0;
    }
private:
    QLineEdit* edit;
};


class Third: public Step
{
public:
    Third(QWidget *parent = 0):Step(parent)
    {
        SetText("把顶上3张插到中间任意位置");
        radio = new QRadioButton("第一张后面",this);
        radio1 = new QRadioButton("第二张后面",this);
        radio2 = new QRadioButton("第三张后面",this);
        radio3 = new QRadioButton("第四张后面",this);
        GetChooseLayout()->addWidget(radio);
        GetChooseLayout()->addWidget(radio1);
        GetChooseLayout()->addWidget(radio2);
        GetChooseLayout()->addWidget(radio3);
        radio->setChecked(true);
    }
    int GetChoose(){
        if(radio->isChecked())
            return 1;
        if(radio1->isChecked())
            return 2;
        if(radio2->isChecked())
            return 3;
        if(radio3->isChecked())
            return 4;
        return 1;
    }
private:
    QRadioButton* radio;
    QRadioButton* radio1;
    QRadioButton* radio2;
    QRadioButton* radio3;
};

class Four: public Step
{
public:
    Four(QWidget *parent = 0):Step(parent)
    {
        SetText("拿掉顶上的牌放到一边");
    }
};

class Five: public Step
{
public:
    Five(QWidget *parent = 0):Step(parent)
    {
        SetText("南方人/北方人/不确定,分别拿顶上的1/2/3张牌插到中间");
        QVBoxLayout* vbox = new QVBoxLayout;
        QHBoxLayout* hbox = new QHBoxLayout;
        QHBoxLayout* hbox1 = new QHBoxLayout;
        QButtonGroup* group = new QButtonGroup(this);
        QButtonGroup* group1 = new QButtonGroup(this);
        radio = new QRadioButton("南方人",this);
        radio1 = new QRadioButton("北方人",this);
        radio2 = new QRadioButton("不确定",this);
        radio3 = new QRadioButton("第一张后面",this);
        radio4 = new QRadioButton("第二张后面",this);
        radio5 = new QRadioButton("第三张后面",this);
        hbox->addWidget(radio);
        hbox->addWidget(radio1);
        hbox->addWidget(radio2);
        hbox1->addWidget(radio3);
        hbox1->addWidget(radio4);
        hbox1->addWidget(radio5);
        group->addButton(radio);
        group->addButton(radio1);
        group->addButton(radio2);
        group1->addButton(radio3);
        group1->addButton(radio4);
        group1->addButton(radio5);
        vbox->addLayout(hbox);
        vbox->addLayout(hbox1);
        GetChooseLayout()->addLayout(vbox);
        radio2->setChecked(true);
        radio3->setChecked(true);
    }
    int GetChoose(){
        if(radio->isChecked())
            return 1;
        else if(radio1->isChecked())
            return 2;
        else if(radio2->isChecked())
            return 3;
        return 1;
    }
    int GetChoose1(){
        if(radio3->isChecked())
            return 1;
        else if(radio4->isChecked())
            return 2;
        else if(radio5->isChecked())
            return 3;
        return 1;
    }
private:
    QRadioButton* radio;
    QRadioButton* radio1;
    QRadioButton* radio2;
    QRadioButton* radio3;
    QRadioButton* radio4;
    QRadioButton* radio5;
};

class Six: public Step
{
public:
    Six(QWidget *parent = 0):Step(parent)
    {
        SetText("男生拿掉1张,女生拿掉2张");
        radio = new QRadioButton("男生",this);
        radio1 = new QRadioButton("女生",this);
        GetChooseLayout()->addWidget(radio);
        GetChooseLayout()->addWidget(radio1);
        radio->setChecked(true);
    }
    int GetChoose(){
        if(radio->isChecked())
            return 1;
        if(radio1->isChecked())
            return 2;
        return 1;
    }
private:
    QRadioButton* radio;
    QRadioButton* radio1;
};

class Seven: public Step
{
public:
    Seven(QWidget *parent = 0):Step(parent)
    {
        SetText("把最顶上的放到最底下,循环7次");
    }
};

class Last: public Step
{
public:
    Last(QWidget *parent = 0):Step(parent){
        SetText("好运留下来");
        flag = 1;
    }
    void Init(){
        SetText("好运留下来");
        flag = 1;
    }

    void ChangeText(){
        switch(flag){
            case 0:
                flag = 1;
                SetText("好运留下来");
                break;
            case 1:
                flag = 0;
                SetText("烦恼都丢掉");
                break;
            default:
                break;
        }

    }
    int GetFlag(){
        return flag;
    }

private:
    int flag;
};

class Widget : public QSplitter
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    void StartGetData();
    void FirstStep();
    void SecondStep();
    void ThridStep();
    void FourStep();
    void FiveStep();
    void SixStep();
    void SevenStep();
    void LastStep();

    void UpdateData();
protected slots:
    void OnClicked(bool);
private:
    std::vector<Brand*> m_vecBrand;
    QString m_firstCard;

    QLabel* label;
    QPushButton* btn;
    QStackedWidget* m_stackedWidget;

    bool bOver;
};

#endif // WIDGET_H

.cpp

#pragma execution_character_set("utf-8")
#include "widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QSplitter(parent)
{
    setOrientation(Qt::Vertical);
    label = new QLabel("qweqwe",this);
    QWidget* widget = new QWidget(this);
    m_stackedWidget = new QStackedWidget(this);
    addWidget(label);
    addWidget(widget);
    setStretchFactor(1,2);

    m_stackedWidget->addWidget(new Start);
    m_stackedWidget->addWidget(new First);
    m_stackedWidget->addWidget(new Second);
    m_stackedWidget->addWidget(new Third);
    m_stackedWidget->addWidget(new Four);
    m_stackedWidget->addWidget(new Five);
    m_stackedWidget->addWidget(new Six);
    m_stackedWidget->addWidget(new Seven);
    m_stackedWidget->addWidget(new Last);

    QHBoxLayout* hbox = new QHBoxLayout;
    QVBoxLayout* vbox = new QVBoxLayout;
    btn = new QPushButton("下一步",this);
    hbox->addStretch();
    hbox->addWidget(btn);
    vbox->addWidget(m_stackedWidget);
    vbox->addLayout(hbox);
    widget->setLayout(vbox);
    connect(btn, SIGNAL(clicked(bool)), this, SLOT(OnClicked(bool)));

    bOver = false;
}

Widget::~Widget()
{

}

void Widget::StartGetData()
{
    Start* start = (Start*)m_stackedWidget->widget(0);
    QString str = start->GetStr();
    for(int i=0; i<str.length(); i++){
        Brand* brand = new Brand(QString(str[i]));
        m_vecBrand.push_back(brand);
    }
}

void Widget::FirstStep()
{
    Start* start = (Start*)m_stackedWidget->widget(0);
    QString str = start->GetStr();
    for(int i=0; i<str.length(); i++){
        Brand* brand = new Brand(QString(str[i]));
        m_vecBrand.push_back(brand);
    }
}

void Widget::SecondStep()
{
    Second* second = (Second*)m_stackedWidget->widget(2);
    int number = second->GetNumber();
    for(int i=0; i<number; i++){
        Brand* brand = m_vecBrand[0];
        m_vecBrand.erase(m_vecBrand.begin());
        m_vecBrand.push_back(brand);
    }
}

void Widget::ThridStep()
{
    Third* third = (Third*)m_stackedWidget->widget(3);
    int number = third->GetChoose();

    Brand* brand = m_vecBrand[0];
    Brand* brand1 = m_vecBrand[1];
    Brand* brand2 = m_vecBrand[2];

    m_vecBrand.erase(m_vecBrand.begin());
    m_vecBrand.erase(m_vecBrand.begin());
    m_vecBrand.erase(m_vecBrand.begin());

    std::vector<Brand*> vecBrand;
    for(int i=0; i<m_vecBrand.size(); i++){
        vecBrand.push_back(m_vecBrand[i]);
        if(number == i + 1){
            vecBrand.push_back(brand);
            vecBrand.push_back(brand1);
            vecBrand.push_back(brand2);
        }
    }
    m_vecBrand = vecBrand;
}

void Widget::FourStep()
{
    m_firstCard = m_vecBrand[0]->GetStr();
    setWindowTitle("当前选择牌为:"+ m_firstCard);
    m_vecBrand.erase(m_vecBrand.begin());
}

void Widget::FiveStep()
{
    Five* five = (Five*)m_stackedWidget->widget(5);
    int number = five->GetChoose();
    int number1 = five->GetChoose1();

    std::vector<Brand*> vecBrand;
    switch (number) {
    case 1:
        vecBrand.push_back(m_vecBrand[0]);
        m_vecBrand.erase(m_vecBrand.begin());
        break;
    case 2:
        vecBrand.push_back(m_vecBrand[0]);
        vecBrand.push_back(m_vecBrand[1]);
        m_vecBrand.erase(m_vecBrand.begin());
        m_vecBrand.erase(m_vecBrand.begin());
        break;
     case 3:
        vecBrand.push_back(m_vecBrand[0]);
        vecBrand.push_back(m_vecBrand[1]);
        vecBrand.push_back(m_vecBrand[2]);
        m_vecBrand.erase(m_vecBrand.begin());
        m_vecBrand.erase(m_vecBrand.begin());
        m_vecBrand.erase(m_vecBrand.begin());
        break;
    default:
        break;
    }

    std::vector<Brand*> vecBrand1;
    for(int i=0; i<m_vecBrand.size(); i++){
        vecBrand1.push_back(m_vecBrand[i]);
        if(number1 == i + 1){
            vecBrand1.insert(vecBrand1.end(), vecBrand.begin(), vecBrand.end());
        }
    }
    m_vecBrand = vecBrand1;
}

void Widget::SixStep()
{
    Six* six = (Six*)m_stackedWidget->widget(5);
    int number = six->GetChoose();
    switch (number) {
    case 1:
        m_vecBrand.erase(m_vecBrand.begin());
        break;
    case 2:
        m_vecBrand.erase(m_vecBrand.begin());
        m_vecBrand.erase(m_vecBrand.begin());
        break;
    default:
        break;
    }
}

void Widget::SevenStep()
{
    for(int i=0; i<7; i++){
        Brand* brand = m_vecBrand[0];
        m_vecBrand.erase(m_vecBrand.begin());
        m_vecBrand.push_back(brand);
    }
}

void Widget::LastStep()
{
    Last* last = (Last*)m_stackedWidget->widget(8);
    int flag = last->GetFlag();
    switch (flag) {
    case 0:
        m_vecBrand.erase(m_vecBrand.begin());
        break;
    case 1:
        Brand* brand = m_vecBrand[0];
        m_vecBrand.erase(m_vecBrand.begin());
        m_vecBrand.push_back(brand);
        break;
    }

    last->ChangeText();
}

void Widget::UpdateData()
{
    QString str;
    for(int i=0; i<m_vecBrand.size(); i++){
        str+= m_vecBrand[i]->GetStr();
    }
    label->setText(str);
}

void Widget::OnClicked(bool)
{
    if(bOver){
        setWindowTitle("magic");
        Last* last = (Last*)m_stackedWidget->widget(8);
        last->Init();
        bOver = false;
        btn->setText("下一步");
        m_stackedWidget->setCurrentIndex(0);
        return;
    }

    Step* step = (Step*)m_stackedWidget->currentWidget();
    if(!step->Check())
        return;

    if(m_vecBrand.size() == 1){
        m_vecBrand.clear();
        Last* last = (Last*)m_stackedWidget->widget(8);
        last->SetText("之前的牌为:"+ m_firstCard+ " 对上否?");
        bOver = true;
        btn->setText("重新开始");
        return;
    }

    switch (m_stackedWidget->currentIndex()) {
    case 0://4张牌
        StartGetData();
        break;
    case 1://对折撕开
        FirstStep();
        break;
    case 2://根据名字字数,把顶上的牌放到下面
        SecondStep();
        break;
    case 3://把顶上3张插到中间任意位置
        ThridStep();
        break;
    case 4://拿掉顶上的牌放到一边
        FourStep();
        break;
    case 5://南方人/北方人/不确定,分别拿顶上的1/2/3张牌插到中间
        FiveStep();
        break;
    case 6://男生拿掉1张,女生拿掉2张
        SixStep();
        break;
    case 7://把最顶上的放到最底下,循环7次
        SevenStep();
        break;
    case 8://好运留下来 烦恼都丢掉
        LastStep();
        break;
    default:
        break;
    }
    UpdateData();

    if(m_stackedWidget->currentIndex() + 1 < m_stackedWidget->count())
        m_stackedWidget->setCurrentIndex(m_stackedWidget->currentIndex() + 1);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1457898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何利用Idea创建一个Servlet项目(新手向)

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;如何利用Idea创建一个Servlet项目(新手向) Servlet是tomcat的api,利用Servlet进行webapp开发很方便,本文将介绍如何通过Idea创建一个Servlet项目(一共分为七步,这可能是我们写过的…

备战蓝桥杯---动态规划(应用1)

话不多说&#xff0c;直接看题&#xff1a; 首先我们考虑暴力&#xff0c;用二维前缀和即可&#xff0c;复杂度为o(n^4). 其实&#xff0c;我们不妨枚举任意2行&#xff0c;枚举以这个为边界的最大矩阵。 我们把其中的每一列前缀和维护出来&#xff0c;相当于把一个矩阵压缩成…

观察者模式和发布订阅模式的区别

从下图中可以看出&#xff0c;观察者模式中观察者和目标直接进行交互&#xff0c;而发布订阅模式中统一由调度中心进行处理&#xff0c;订阅者和发布者互不干扰。这样一方面实现了解耦&#xff0c;还有就是可以实现更细粒度的一些控制。比如发布者发布了很多消息&#xff0c;但…

【Vue3】搭建Pinia环境及其基本使用

下载 npm i pinia引入并注册 App.vue import { createApp } from vue import { createPinia } from pinia import App from ./App.vue // 1. 引入 import { createPinia } from piniaconst app createApp(App) // 2. 创建 const pinia createPinia() // 3. 注册 app.use(p…

python----面向对象

这里写目录标题 面向对象思想类类的定义类名的定义类的构造函数的定义类的属性类的方法定义 继承语法关于构造函数问题 文件操作绝对路径相对路径pycharm获取绝对路径和相对路径文件读写读文件open&#xff08;&#xff09;read&#xff08;&#xff09;readline&#xff08;&a…

2021年CSP-J认证 CCF信息学奥赛中小学初级组 第一轮真题-单项选择题解析

2021年 中小学信息学奥赛CSP-J真题解析 1、以下不属于面向对象程序设计语言的是 A、c B、python C、java D、c 答案&#xff1a;D 考点分析&#xff1a;主要考查编程语言&#xff0c;ABC都是面向对象语言&#xff0c;D选项c语言是面向过程语言&#xff0c;答案D 2、以下奖…

202427读书笔记|《猫的自信:治愈系生活哲学绘本》——吸猫指南书,感受猫咪的柔软慵懒与治愈

202427读书笔记|《猫的自信&#xff1a;治愈系生活哲学绘本》——吸猫指南书&#xff0c;感受猫咪的柔软慵懒与治愈 《猫的自信&#xff1a;治愈系生活哲学绘本》作者林行瑞&#xff0c;治愈系小漫画绘本&#xff0c;10分钟可以读完的一本书&#xff0c;线条明媚&#xff0c;自…

SQL注入工具之SQLmap入门操作

了解SQLmap 基础操作 SQLmap是一款自动化的SQL注入工具&#xff0c;可以用于检测和利用SQL注入漏洞。 以下是SQLmap的入门操作步骤&#xff1a; 1.下载SQLmap&#xff1a;可以从官方网站&#xff08;https://sqlmap.org/&#xff09;下载最新版本的SQLmap。 2.打开终端&#…

CDP和Chrome

CDP和Chrome CDP和WebDriver Protocol WebDriver和 Chrome DevTools Protocol&#xff08;CDP&#xff09; 是用于自动化浏览器的两个主要协议&#xff0c;大多数的浏览器自动化工具都是基于上述其中之一来实现的。可以通过这两种形式来和浏览器交互&#xff0c;通过代码来控…

使用maven集成spring在测试的时候报出了如下的异常:version 60

使用maven集成spring在测试的时候报出了如下的异常&#xff1a; Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 60 解决&#xff1a;

MAC M1安装vmware和centos7虚拟机并配置静态ip

一、下载vmware和centos7镜像 1、VMWare Fusion 官网的下载地址是&#xff1a;下载地址 下载好之后注册需要秘钥&#xff0c;在官网注册后使用免费的个人秘钥 2、centos7 下载地址&#xff1a; https://biosyxh.cn:5001/sharing/pAlcCGNJf 二、虚拟机安装 直接将下…

比特币正在蚕食黄金

号外&#xff1a;教链内参2.19《内参&#xff1a;蹭热点、骗流量、割韭菜》 众所周知&#xff0c;自从美国SEC批准比特币现货ETF登陆美股市场之后&#xff0c;打开了美国金融市场泛滥的流动性向比特币流入的大门。只用了短短的30个交易日&#xff0c;比特币ETF就从零膨胀到了近…

基于RBAC的权限管理的理论实现和权限管理的实现

权限管理的理论 首先需要两个页面支持&#xff0c;分别是角色管理和员工管理&#xff0c;其中角色管理对应的是角色和权限的配合&#xff0c;员工管理则是将登录的员工账号和员工所处的角色进行对应&#xff0c;即通过新增角色这个概念&#xff0c;让权限和员工并不直接关联&a…

Ubuntu18.04有线连接后,无法设置ip地址以及显示网口设置

前提&#xff1a;首先测试过网线是完全没问题的 桌面端找不到设置网口 终端输入&#xff1a; ifconfig 没有找到网口设置和对应IP 然后查询网口驱动是否正常安装&#xff0c;输入&#xff1a; lspci | grep Ethernet 有输出说明网口驱动正常安装 然后查询电脑的ip地址&am…

2023年全球软件开发大会(QCon北京站2023)2月:核心内容与学习收获(附大会核心PPT下载)

本次峰会是一个汇集了最新技术趋势、最佳实践和创新思维的盛会。对于从事软件开发和相关领域的专业人士来说&#xff0c;参加这样的大会将有助于他们了解行业动态、提升技能水平、拓展职业视野&#xff0c;并与同行建立联系和合作。 本次峰会包含&#xff1a;AI基础架构、DevO…

Stable Diffusion 绘画入门教程(webui)-lora

通过前边的文章&#xff0c;相信大家已经能够自己产出好看的小姐姐或者小哥哥了&#x1f923; 不知道有没有发现每次生成的脸、身材、衣服、环境、风格等等可能都会有所差异&#xff0c;那么如果这个问题不解决&#xff0c;实用性将大大降低&#xff0c;因此lora诞生了。 文章…

人工智能_普通服务器CPU_安装清华开源人工智能AI大模型ChatGlm-6B_001---人工智能工作笔记0096

使用centos安装,注意安装之前,保证系统可以联网,然后执行yum update 先去更新一下系统,可以省掉很多麻烦 20240219_150031 这里我们使用centos系统吧,使用习惯了. ChatGlm首先需要一台个人计算机,或者服务器, 要的算力,训练最多,微调次之,推理需要算力最少 其实很多都支持C…

SpringBoot常见问题

1 引言 Spring Boot是一个基于Spring框架的快速开发脚手架&#xff0c;它简化了Spring应用的初始化和搭建过程&#xff0c;提供了众多便利的功能和特性&#xff0c;比如自动配置、嵌入式Tomcat等&#xff0c;让开发人员可以更加专注于业务逻辑的实现。   Spring Boot还提供了…

IO进程线程作业day2

使用fread和fwrite完成两个图片文件的拷贝 #include <myhead.h> #define high 541 #define wide 541 int main(int argc, const char *argv[]) {//以只读的方式打开图片文件1.bmpFILE *fp NULL;if((fp fopen("./1.bmp", "r")) NULL){perror(&qu…

数据分析 - 机器学习

1&#xff1a;线性回归 线性回归是一种统计技术用于对输出变量与一个或多个输入变量之间的关系进行建模 用外行人的话来说&#xff0c;将其视为通过某些数据点拟合一条线&#xff0c;如下所示 以便在未知数据上进行预测&#xff0c;假设变量之间存在线性关系 点和线之间存在微小…