刷题常用技巧C++
常用头文件
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include<bits/stdc++.h>
这个是万能头文件,但是部分编译器不支持,个人建议还是不要依赖它,它还会延长你的编译时间。
短除法
数学意义上的短除法运算方法是先用一个除数除以能被它除尽的一个质数,以此类推,除到商是质数为止
常用于求最大公约数和最小公倍数
int MaxComDiv(int a,int b)//大的值为b
{
for(int i=a;i>=1;i--) //两个数互质时,最大公约数为1
if(a%i==0 && b%i==0)
return i;
}
最小公倍数 = a*b /最大公约数
int MinComMulti(int a,int b)
{
return a*b/MaxComDiv(a,b);
}
递归辗转除法也可以用于上述问题
int MaxComDiv(int a,int b)//a,b大小关系不定
{
if(a==0)
return b;
return MaxComDiv(b%a,a);
}
数组
定义动态数组(根据键盘输入的值来创建数组)
int n;
cin>>n;
int *a=new int[n];
计算数组中元素个数的三种方法
①使用库函数strlen()
len = strlen(str);
②使用while循环
int i=0;
while(a[i++]!='\0');
③使用函数sizeof()
len = sizeof(a)/sizeof(a[0]);
但是并不能直接计算一个数组中输入的数据的个数,因为没有输入数据的单元会被赋值为0(相当于我们手动输入了0进去,所以上面的方法不能直接得出我们真正输入的数据的个数),可以考虑使用队列Q,因为队列用多少就申请多少空间,Q.size()函数可以计算出当前输入的数据的个数。
队列
声明一个队列以及队列中常用的一些函数
#include <queue>
#include <iostream>
using namespace std;
int main()
{
int i;
queue <int> myQ;
for(i=0; i<10; i++)
myQ.push(i);
cout<<"myQ size is: "<<myQ.size()<<endl;
for(i=0; i<myQ.size(); i++)
{
cout << myQ.front()<<endl;
myQ.pop();
}
cout<<"myQ size is: "<<myQ.size()<<endl;
cout<<"myQ last is: "<<myQ.back()<<endl;
return 0;
}
使用EXCEL表格取巧求值
有的题目给出一些很麻烦且繁多的数据,不方便利用代码求解时,我们可以直接利用Excel里面自带的函数直接进行计算,非常方便。
如下图所示
①给定两列初始数据,求他们的乘积
②先点击一个单元格,用来输出计算的结果(如上:C1单元格)点击左上角的插入函数
可以在搜索函数中输入公式的描述,点击转到,会直接给出相近描述的公式,这里我们要用到PRODUCT函数,计算所有参数的乘积。如果不知道怎么描述,也可以自己对照下面给出的中文释义找合适的函数,就是很麻烦
当然也可以直接在后面的单元格中直接输入 = A1 * B1,再按回车,就可以得出结果了,但是这需要我们很熟悉这个函数在excel里面的公式,有的公式我们也不知道excel里面是怎么定义的
③A1:B1是从单元格A1到单元格B1中间所有的单元格数据(包括A1,B1)按照该函数进行计算
④点击确定,然后就可以得出结果了
⑤长按C1单元格往下拉,就可以将剩下的行数据按照第一行的函数计算出来了
⑥使用“自动求和”域名中的函数进行计算
先选中需要计算的单元格,然后点击相应的函数即可求值
(1)求之前的结果的总和
(2)求之前的结果的最大值
文件的读写
有一些题目,它会给一个存储了许多数据的文本文件,让我们去读取它,亦或者我们自己需要利用文件读写去方便的输入数据进行测验,这时就需要利用文件读写方面的函数了。
程序所用的数据可以从磁盘文件读取(称为读文件),程序运行的结果可以存到磁盘文件(称为写文件)。
①从键盘文件读取数据,写到磁盘文件
#include <iostream>
using namespace std;
void main()
{
FILE *fp; //定义文件指针
char ch;
fp=fopen("11.txt","w"); //以“写”的方式打开工程目录下的文件,如果没有该文件,则系统会自动创建
if(!fp) //判断文件是否可以打开,注意:文件是否能打开的前提是文件已经存在,只要不出现下面的提示信息,就说明文件已经存在于工程目录之中
{
cout<<"File could not be opened !";
exit(1);
}
cout<<"input a text (to end with'#')"<<endl;//输入提示,输入一段文本(以#结束)
ch = getchar(); //读入第一个字符
while(ch!='#')
{
fputc(ch,fp);
ch = getchar(); //继续读入下一个字符
}
fclose(fp); //关闭文件
}
还要注意的一点是:如果原来的文件中已经有了数据,则我们这次输入的数据会覆盖掉之前的数据。
②从磁盘文件读取数据,写到显示器
#include <iostream>
using namespace std;
void main()
{
FILE *fp; //定义文件指针
char ch;
fp=fopen("11.txt","r"); //以“读”的方式打开工程目录下的文件
if(!fp) //判断文件是否可以打开,注意:文件是否能打开的前提是文件已经存在,只要不出现下面的提示信息,就说明文件已经存在于工程目录之中
{
cout<<"File could not be opened !";
exit(1);
}
ch = fgetc(fp); //先从文件中读取第一个字符
while(! feof(fp))
{
putchar(ch); //输出该字符
ch = fgetc(fp); //继续从文件中读取下一个字符
}
fclose(fp); //关闭文件
}