用C++实现简单随机二元四则运算
让我们想看看二元四则运算都需要实现什么:
(1) 定制题目数量
(2) 是否有乘除法
(3) 题目数值范围
(4) 加减有无负数
(5) 除法有无余数
(6) 是否支持分数(真分数、假分数…)
(7) 是否支持小数(精确到多少位?)
(8) 打印中每行的间隔
为了实现以上功能,并且为了便于后期实现功能拓展,我们可以将其封装成类,通过在外界设置类的参数,实现不同的功能。可以将类定义如下:
class CTitle
{
public:
CTitle();
~CTitle();
void setTitleCount(int titleCount); // 设置题量
void setMD(int hasMD); // 设置乘除法
void setBracket(int hasBracket); // 设置括号
void setNumRand(int numRand); // 设置数值范围
void setMinus(int hasMinus); // 设置负号
void setResidue(int hasResidue); // 设置余数
void setFraction(int hasFraction); // 设置分数
void setFractionType(int fractionType); // 设置是否支持假分数
void setDecimal(int hasDecimal); // 设置小数
void setDecimalLong(int decimalLong); // 设置小数位数
void newTitle(); // 新建题目
private:
int titleCount; // 题目数量
int hasMD; // 是否有乘除法
int hasBracket; // 是否有括号
int numRand; // 数值范围
int hasMinus; // 加减有无负数
int hasResidue; // 除法有无余数
int hasFraction; // 是否支持分数
int fractionType; // 是否支持假分数
int hasDecimal; // 是否支持小数
int decimalLong; // 小数位数
int decimalLongPow; // 小数位数 void newIntegerFormula(); // 新建整数运算公式
void newDecimalFormula(); // 新建小数运算公式
void newFractionFormula(); // 新建分数运算公式
void recordTitle(string szTitle); // 记录题目至文件
void recordAnswer(string szAnswer); // 记录答案至文件
void reduceFraction(int &nume, int &deno);// 化简分数
};
接下来,我们需要实现类的功能接口,并且对类的属性实现初始化
CTitle::CTitle()
{
titleCount = ; // 题量
hasMD = ; // 是否有乘除法
numRand = ; // 数值范围
hasMinus = ; // 加减有无负数
hasResidue = ; // 除法有无余数
hasFraction = ; // 是否支持分数
fractionType = ; // 是否支持假分数
hasDecimal = ; // 是否支持小数
decimalLong = ; // 小数位数
decimalLongPow = ; // 小数位数
}
CTitle::~CTitle()
{
}
// 设置行间距
void CTitle::setTitleCount(int titleCount)
{
this->titleCount = titleCount;
}
// 设置乘除法
void CTitle::setMD(int hasMD)
{
this->hasMD = hasMD;
}
// 设置数值范围
void CTitle::setNumRand(int numRand)
{
this->numRand = numRand;
}
// 设置负号
void CTitle::setMinus(int hasMinus)
{
this->hasMinus = hasMinus;
}
// 设置余数
void CTitle::setResidue(int hasResidue)
{
this->hasResidue = hasResidue;
}
// 设置分数
void CTitle::setFraction(int hasFraction)
{
this->hasFraction = hasFraction;
}
// 设置是否支持假分数
void CTitle::setFractionType(int fractionType)
{
this->fractionType = fractionType;
}
// 设置小数
void CTitle::setDecimal(int hasDecimal)
{
this->hasDecimal = hasDecimal;
}
// 设置小数位数
void CTitle::setDecimalLong(int decimalLong)
{
this->decimalLong = decimalLong;
this->decimalLongPow = pow(, decimalLong);
}
接着,我们为类添加方法,让类可以按需求生成不同类型的运算题目。那么,如何才能使类可以随机生成不同类型的运算呢?通过对题目进行分析,我们发现所有可能出现的运算类型共有4中,他们分别是:
(1)整数运算
(2)整数运算 & 小数运算
(3)整数运算 & 分数运算
(4)整数运算 & 分数运算 & 小数运算
void CTitle::newTitle()
{
srand(time());
int numType = + hasDecimal + hasFraction;
int titleType = ;
for (int i = ; i < titleCount; i++)
{
switch(numType)
{
// 运算中仅有整数运算
case :
newIntegerFormula();
break;
// 运算中包含包含两种运算,整数+小数 或 整数+分数
case :
titleType = rand() % + ;
if (titleType == )
{
newIntegerFormula();
}
else
{
if (hasDecimal == )
{
newDecimalFormula();
}
else if (hasFraction == )
{
newFractionFormula();
}
}
break;
// 运算中包含小数运算和分数运算
case :
titleType = rand() % + ;
if (titleType == )
{
newIntegerFormula();
}
else if (titleType == )
{
newDecimalFormula();
}
else
{
newFractionFormula();
}
break;
}
}
}
接下来我们需要解决的问题就是如何生成整数运算、小数运算以及分数运算并计算其结果。在本例中,我们用文件分别对运算表达式和运算结果进行存储。将表达式存储于Title.txt文件内,将运算结果存储于Answer.txt文件内。
所以,我们先要在Ctitle的构造函数内加入如下代码,以保证每次类初始化时文件内容会被清空。
FILE *fp = NULL;
errno_t err;
if ((err = fopen_s(&fp, "Title.txt", "w")) == )
{
fclose(fp);
}
if ((err = fopen_s(&fp, "Answer.txt", "w")) == )
{
fclose(fp);
}
并且增加写入表达式和写入答案的方法
// 记录题目至文件
void CTitle::recordTitle(string szTitle)
{
FILE *fp = NULL;
errno_t err;
if ((err = fopen_s(&fp, "Title.txt", "a")) == )
{
fprintf_s(fp, "%s\n", szTitle.c_str());
fclose(fp);
}
}
// 记录答案至文件
void CTitle::recordAnswer(string szAnswer)
{
FILE *fp = NULL;
errno_t err;
if ((err = fopen_s(&fp, "Answer.txt", "a")) == )
{
fprintf_s(fp, "%s\n", szAnswer.c_str());
fclose(fp);
}
}
接下来我们实现创建整数运算的方法,在这里与要注意以下问题:
(1)除法运算时,除数不能为0
(2)若运算不能还有余数,要保证生成的除法运算均可以整除
(3)若运算可以还有余数,要保证生成的结果为: 5 ÷ 2 = 2...1 ,而非2.5
// 新建整数运算公式
void CTitle::newIntegerFormula()
{
string szTitle = "";
string szAnswer = "";
char caTitle[] = { "" };
char caAnswer[] = { "" };
int num1 = rand() % numRand + ;// 随机整数1,默认是正数
int num2 = rand() % numRand + ;// 随机整数2,默认是正数
int op = rand() % + ; // 运算符,默认仅有加减运算
// 设置四则运算
if (hasMD == )
{
op = rand() % + ;
}
switch (op)
{
case :
// 加减运算中包含负数
if (hasMinus == )
{
num1 = rand() % (numRand * ) - numRand;
num2 = rand() % (numRand * ) - numRand;
}
if (num2 < )
{
// 记录题目
sprintf_s(caTitle, "%d+(%d)", num1, num2);
szTitle += caTitle;
recordTitle(szTitle);
// 记录答案
sprintf_s(caAnswer, "%d", num1+num2);
szAnswer += caAnswer;
recordAnswer(szAnswer);
}
else
{
// 记录题目
sprintf_s(caTitle, "%d+%d", num1, num2);
szTitle += caTitle;
recordTitle(szTitle);
// 记录答案
sprintf_s(caAnswer, "%d", num1 + num2);
szAnswer += caAnswer;
recordAnswer(szAnswer);
}
break;
case :
// 加减运算中包含负数
if (hasMinus == )
{
num1 = rand() % (numRand * ) - numRand;
num2 = rand() % (numRand * ) - numRand;
}
if (num2 < )
{
// 记录题目
sprintf_s(caTitle, "%d-(%d)", num1, num2);
szTitle += caTitle;
recordTitle(szTitle);
// 记录答案
sprintf_s(caAnswer, "%d", num1 - num2);
szAnswer += caAnswer;
recordAnswer(szAnswer);
}
else
{
// 记录题目
sprintf_s(caTitle, "%d-%d", num1, num2);
szTitle += caTitle;
recordTitle(szTitle);
// 记录答案
sprintf_s(caAnswer, "%d", num1 - num2);
szAnswer += caAnswer;
recordAnswer(szAnswer);
}
break;
case :
// 记录题目
sprintf_s(caTitle, "%d×%d", num1, num2);
szTitle += caTitle;
recordTitle(szTitle);
// 记录答案
sprintf_s(caAnswer, "%d", num1 * num2);
szAnswer += caAnswer;
recordAnswer(szAnswer);
break;
case :
// 除数为0
while (num2 == )
{
num2 = rand() % numRand + ;
}
// 无余数的除法
if(hasResidue == )
{
// 保证可以整除
while (num1 % num2 != )
{
num1 = rand() % numRand + ;
}
// 记录题目
sprintf_s(caTitle, "%d÷%d", num1, num2);
szTitle += caTitle;
recordTitle(szTitle);
// 记录答案
sprintf_s(caAnswer, "%d", num1 / num2);
szAnswer += caAnswer;
recordAnswer(szAnswer);
}
// 有余数的除法
else
{
// 记录题目
sprintf_s(caTitle, "%d÷%d", num1, num2);
szTitle += caTitle;
recordTitle(szTitle);
// 记录答案
sprintf_s(caAnswer, "%d...%d", num1 / num2, num1 % num2);
szAnswer += caAnswer;
recordAnswer(szAnswer);
}
break;
} }
接下来实现小数运算,在这里,小数的位数是可以自主选定的,所以如果小数位数选择的是2位,那么在记录如文件时也要保证多余位数不会被记录。如double类型默认写入文件是2.510000,那我们只能保留2.51,并将保留后的结果写入文件。
// 新建小数运算公式
void CTitle::newDecimalFormula()
{
string szTitle = "";
string szAnswer = "";
string szOp = "";
string szNum1 = "";
string szNum2 = "";
char caTitle[] = { "" };
char caAnswer[] = { "" };
char caNum1[] = { "" };
char caNum2[] = { "" };
double dAnswer = ;
int num1 = rand() % numRand + ;// 随机整数1,默认是正数
int num2 = rand() % numRand + ;// 随机整数2,默认是正数
double dotNum1 = (rand() % (decimalLongPow) +);// 随机小数1
double dotNum2 = (rand() % (decimalLongPow)+);// 随机小数2
int op = rand() % + ; // 运算符,默认仅有加减运算
dotNum1 = dotNum1 / decimalLongPow;
dotNum2 = dotNum2 / decimalLongPow;
sprintf_s(caNum1, "%lf", num1 + dotNum1);
szNum1 += caNum1;
szNum1 = szNum1.substr(, szNum1.length() - + decimalLong);
sprintf_s(caNum2, "%lf", num2 + dotNum2);
szNum2 += caNum2;
szNum2 = szNum2.substr(, szNum2.length() - + decimalLong);
// 设置四则运算
if (hasMD == )
{
op = rand() % + ;
}
switch (op)
{
case :
// 加减运算中包含负数
if (hasMinus == )
{
num1 = rand() % (numRand * ) - numRand;
num2 = rand() % (numRand * ) - numRand;
szNum1 = "";
szNum2 = "";
sprintf_s(caNum1, "%lf", num1 + dotNum1);
szNum1 += caNum1;
szNum1 = szNum1.substr(, szNum1.length() - + decimalLong);
sprintf_s(caNum2, "%lf", num2 + dotNum2);
szNum2 += caNum2;
szNum2 = szNum2.substr(, szNum2.length() - + decimalLong);
}
if (num2 < )
{
// 记录题目
szOp = "+";
szNum2 = "(" + szNum2 + ")";
// 记录答案
dAnswer = num1 + dotNum1 + num2 + dotNum2;
}
else
{
// 记录题目
szOp = "+";
// 记录答案
dAnswer = num1 + dotNum1 + num2 + dotNum2;
}
break;
case :
// 加减运算中包含负数
if (hasMinus == )
{
num1 = rand() % (numRand * ) - numRand;
num2 = rand() % (numRand * ) - numRand;
szNum1 = "";
szNum2 = "";
sprintf_s(caNum1, "%lf", num1 + dotNum1);
szNum1 += caNum1;
szNum1 = szNum1.substr(, szNum1.length() - + decimalLong);
sprintf_s(caNum2, "%lf", num2 + dotNum2);
szNum2 += caNum2;
szNum2 = szNum2.substr(, szNum2.length() - + decimalLong);
}
if (num2 < )
{
// 记录题目
szOp = "-";
szNum2 = "(" + szNum2 + ")";
// 记录答案
dAnswer = num1 + dotNum1 - num2 - dotNum2;
}
else
{
// 记录题目
szOp = "-";
// 记录答案
dAnswer = num1 + dotNum1 - num2 - dotNum2;
}
break;
case :
// 记录题目
szOp = "×";
// 记录答案
dAnswer = (num1 + dotNum1) * (num2 + dotNum2);
break;
case :
// 除数为0
while (num2 == && dotNum2 == )
{
num2 = rand() % numRand + ;
dotNum2 = (rand() % (decimalLong)+);
}
// 记录题目
szOp = "÷";
// 记录答案
dAnswer = (num1 + dotNum1) / (num2 + dotNum2);
break;
}
// 记录题目
szTitle = szNum1 + szOp + szNum2;
recordTitle(szTitle);
// 记录答案
sprintf_s(caAnswer, "%lf", dAnswer);
szAnswer += caAnswer;
szAnswer = szAnswer.substr(, szAnswer.length() - + decimalLong);
recordAnswer(szAnswer); }
最后需要进行的就是生成分数,在这里,我们需要注意:
(1)是否进行假分数的运算
(2)要对分数的运算结果进行约分,将分数化为最简。并且将假分数化简。如5/2要化简为2‘1/2(二又二分之一)
// 新建分数运算
void CTitle::newFractionFormula()
{
string szTitle = "";
string szAnswer = "";
char caTitle[] = { "" };
char caAnswer[] = { "" };
int deno1 = rand() % numRand + ;// 随机分母1,默认是正数
int deno2 = rand() % numRand + ;// 随机分母2,默认是正数
int nume1 = rand() % numRand + ;// 随机分子1,默认是正数
int nume2 = rand() % numRand + ;// 随机分子2,默认是正数
int nweNume = ;
int nweDeno = ;
// 支持假分数
if (fractionType == )
{
// 分母为0或1
while (deno1 == || deno1 == )
{
deno1 = rand() % numRand + ;
}
while (deno2 == || deno1 == )
{
deno2 = rand() % numRand + ;
}
}
// 不支持假分数
if (fractionType == )
{
// 分母为0或1
while (nume1 == || nume1 == )
{
nume1 = rand() % numRand + ;
}
while (nume2 == || nume2 == )
{
nume2 = rand() % numRand + ;
}
if (deno1 < nume1)
{
int temp = deno1;
deno1 = nume1;
nume1 = temp;
}
if (deno2 < nume2)
{
int temp = deno2;
deno2 = nume2;
nume2 = temp;
}
}
int op = rand() % + ; // 运算符,默认仅有加减运算
// 设置四则运算
if (hasMD == )
{
op = rand() % + ;
}
switch (op)
{
case :
// 记录题目
sprintf_s(caTitle, "%d/%d+%d/%d", nume1, deno1, nume2, deno2);
szTitle += caTitle;
recordTitle(szTitle);
// 记录答案
nweNume = nume1*deno2 + deno1*nume2;
nweDeno = deno1*deno2;
break;
case :
// 记录题目
sprintf_s(caTitle, "%d/%d-%d/%d", nume1, deno1, nume2, deno2);
szTitle += caTitle;
recordTitle(szTitle);
// 记录答案
nweNume = nume1*deno2 - deno1*nume2;
nweDeno = deno1*deno2;
reduceFraction(nweNume, nweDeno);
break;
case :
// 记录题目
sprintf_s(caTitle, "%d/%d×%d/%d", nume1, deno1, nume2, deno2);
szTitle += caTitle;
recordTitle(szTitle);
// 记录答案
nweNume = nume1*nume2;
nweDeno = deno1*deno2;
break;
case :
// 记录题目
sprintf_s(caTitle, "%d/%d÷%d/%d", nume1, deno1, nume2, deno2);
szTitle += caTitle;
recordTitle(szTitle);
// 记录答案
nweNume = nume1*deno2;
nweDeno = deno1*nume2;
break;
}
reduceFraction(nweNume, nweDeno); // 化简
if (nweNume == )
{
recordAnswer("");
}
else if (nweDeno == )
{
sprintf_s(caAnswer, "%d", nweNume);
szAnswer += caAnswer;
recordAnswer(szAnswer);
}
else if (nweNume < nweDeno)
{
sprintf_s(caAnswer, "%d/%d", nweNume, nweDeno);
szAnswer += caAnswer;
recordAnswer(szAnswer);
}
else if (nweNume > nweDeno)
{
if (nweNume%nweDeno != )
{
sprintf_s(caAnswer, "%d'%d/%d", nweNume / nweDeno, nweNume%nweDeno, nweDeno);
szAnswer += caAnswer;
recordAnswer(szAnswer);
}
else
{
sprintf_s(caAnswer, "%d", nweNume / nweDeno);
szAnswer += caAnswer;
recordAnswer(szAnswer);
}
}
else
{
recordAnswer("");
}
}
// 化简分数
void CTitle::reduceFraction(int &nume, int &deno)
{
int temp;
int a = nume;
int b = deno;
int gcd = ; // 最大公约式
if (a < b)
{
temp = a;
a = b;
b = temp;
}
while (b != )
{
temp = a % b;
a = b;
b = temp;
}
gcd = a;
nume = nume / gcd;
deno = deno / gcd;
}
至此,我们的类就编写完成了。接下来只需要在主函数生成类,并进行类方法的调用就行了。
#include "iostream"
#include "time.h"
#include "CTitle.h"
#include "CTitle.h"
using namespace std;
void setting();
CTitle title;
int lineSpacing = ;
int main()
{
setting();
title.newTitle();
// 从文件打印题目
FILE *fp = NULL;
FILE *fp2 = NULL;
errno_t err;
char caTitle[];
char caAnsewr[];
char myansewr[];
int mark = ;
if ((err = fopen_s(&fp, "Title.txt", "r")) == && (err = fopen_s(&fp2, "Answer.txt", "r")) == )
{
// 读取题目
while ((fscanf_s(fp, "%s", caTitle, ) != EOF))
{
// 读取答案
fscanf_s(fp2, "%s", caAnsewr, );
do
{
cout << caTitle << " = ";
cin >> myansewr;
if (strcmp(myansewr, caAnsewr) == )
{
cout << "√" << endl;
mark = ;
}
else
{
cout << "×" << endl;
mark = ;
}
for (int i = ; i < lineSpacing; i++)
{
cout << endl;
}
} while (mark == );
}
cout << "恭喜你完成今日作业" << endl;
}
return ;
}
void setting()
{
int input = ;
cout << "请完成如下设置" << endl;
cout << "设置今日题量:";
cin >> input;
title.setTitleCount(input);
cout << endl;
cout << "设置数值范围绝对值:";
cin >> input;
title.setNumRand(input);
cout << endl;
do
{
cout << "加减有无负数,1有0无:";
cin >> input;
}
while (input != && input != );
title.setMinus(input);
cout << endl;
do
{
cout << "是否有乘除法,1有0无:";
cin >> input;
}
while (input != && input != );
title.setMD(input);
cout << endl;
if (input == )
{
do
{
cout << "整数除法有无余数,1有0无:";
cin >> input;
}
while (input != && input != );
title.setResidue(input);
cout << endl;
} do
{
cout << "是否支持小数,1有0无:";
cin >> input;
}
while (input != && input != );
title.setDecimal(input);
cout << endl;
if (input == )
{
cout << "设置小数位数(1~5):";
cin >> input;
title.setDecimalLong(input);
cout << endl;
}
do
{
cout << "是否支持分数,1有0无:";
cin >> input;
}
while (input != && input != );
title.setFraction(input);
cout << endl;
if (input == )
{
cout << "设置是否支持假分数,1有0无:";
cin >> input;
title.setFractionType(input);
cout << endl;
}
cout << "设置打印行间隔:";
cin >> input;
lineSpacing = input;
cout << endl;
}
恩,对于这一次的作业,我只完成了二元式的生成和运算,没有涉及到多元式,所以没有写上括号生成与运算的问题。本来只是想简单写写,好久没有用C++写过程序了,没想到写着写着就写了这么多行,但好像也没有实现什么功能,只是保证了最基础的运行。还是要继续提升啊。
用C++实现简单随机二元四则运算的更多相关文章
- 基于c编写的关于随机生成四则运算的小程序
基于http://www.cnblogs.com/HAOZHE/p/5276763.html改编写的关于随机生成四则运算的小程序 github源码和工程文件地址:https://github.com/ ...
- js实现随机的四则运算题目
老师给出的题,写一个小程序,可以生成随机的四则运算题目给给小学生用.以前自己就写了一个四则运算的简单js小程序,是这样的: 事件 + - * / 这是个自己输入的算法,但要求是自动产生随机数.于是我用 ...
- 结对作业——随机生成四则运算(Core 第7组)
结对作业 ——随机生成四则运算(core第7组) 吕佳玲 PB16060145 涂涵越 PB16060282 GITHUB地址 https://github.com/hytu99/homework_2 ...
- 【ML系列】简单的二元分类——Logistic回归
对于了解机器学习中二元分类问题的来源与分析,我认为王树义老师这篇文章讲的非常好,通俗且易懂: http://blog.sciencenet.cn/blog-377709-1121098.html 但王 ...
- 软件工程课堂作业(二)续——升级完整版随机产生四则运算题目(C++)
一.设计思想: 1.根据题目新设要求,我将它们分为两类:一类是用户输入数目,根据这个数目改变一系列后续问题:另一类是用户输入0或1,分情况解决问题. 2.针对这两类要求,具体设计思路已在上篇博文中写出 ...
- 第二篇——VC++简单随机四则运算
目标:编写最简单的四则运算,类似A+B=C: 想法:建立一个Win32控制台应用程序,A和B用随机数表示,运算符号用0~3的数字对应,然后计算并输出即可: 具体过程: 利用函数rand(),返回一个0 ...
- 小学生二元四则运算(F)
整体功能简介: 1.题目不重复: 2.可以定制数量: 3.可以自己选择输入范围: 4.可以选择是否添加乘除法: 5.可以选择除法结果是取整或商加余数形式表示或小数方式(默认小数点后两位)表示: 6 ...
- 用Java随机生成四则运算
代码链接:https://github.com/devilwjy/Code.Demo 需求分析: 1.程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,运算符 ...
- C语言编写的随机产生四则运算测试题
题目:编写一个四则运算测试题的程序,要求每道题都要随机产生 解题思路: 1.编写测试题,且为30道,就要用到循环函数,因此想到用for()函数 2.随机产生两个数,就想到用rand()函数. 注:1. ...
随机推荐
- Centos7前后台运行jar包
方式一: java -jar lf-test-1.0-SNAPSHOT.jar 前台运行,当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出. 方式二: java -ja ...
- 对大数据的批量导入MySQL数据库
自己的库里有索引在用insert导入数据时会变慢很多 使用事务+批量导入 可以配置使用spring+mybatis整合的方式关闭自动提交事务(地址),选择批量导入每一百条导入使用list存储值传入到m ...
- Hadoop分布式集群搭建_1
Hadoop是一个开源的分布式系统框架 一.集群准备 1. 三台虚拟机,操作系统Centos7,三台主机名分别为k1,k2,k3,NAT模式 2.节点分布 k1: NameNode DataNode ...
- java-spark的各种常用算子的写法
通常写spark的程序用scala比较方便,毕竟spark的源码就是用scala写的.然而,目前java开发者特别多,尤其进行数据对接.上线服务的时候,这时候,就需要掌握一些spark在java中的使 ...
- 调试日志——基于stm32的智能声光报警器(二)
今天调试了音频部分的播放功能,这里我采用的是输出pwm来播放声音的方式. 声音的源文件是一个wav文件,然后用一个软件将wav文件转化为一个数组的文件. 要播放的文件就是这个数组文件里面的数据部分,前 ...
- # 20155224 实验四 Android程序设计
20155224 实验四 Android程序设计 任务一 Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for And ...
- MyOD课堂实践(5月31日)20155318
MyOD课堂实践(5月31日)20155318 编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 (码云链接) 代码 import java.io ...
- bzoj1854 [Scoi2010]游戏 ([SCOI2010]连续攻击游戏)
bzoj1854 [Scoi2010]游戏 ([SCOI2010]连续攻击游戏) 据说正解是并查集???我不会 这不是一道匈♂牙利好题吗??? 一个装备的两个属性都向它连边,然后跑一遍匈♂牙利 注意: ...
- MAVEN相关文章
Maven入门指南① :Maven 快速入门及简单使用 Maven入门指南② :Maven 常用命令,手动创建第一个 Maven 项目 Maven入门指南③:坐标和依赖 Maven入门指南④:仓库 M ...
- 利用 Python 分析微信好友性别和位置
今天用到一个非常有意思的库——itchat,它已经完成了 wechat 的个人账号API接口,使爬取个人微信信息更加方便. 下载 爬取微信好友信息 这样就将你所有微信好友的信息都返回了,我们并不需要 ...