目录
基础数学问题
质因子分解
质因子分解是指将一个正整数n写成一个或多个质数的乘积的形式。
思路:可以先把素数表打印出来
定义一个结构体数组factor用来存放质因子
struct factor{
int x,cnt; //x为质因子,cnt为其个数
}fac[10];
思路
- 枚举1到sqrt(n)的所有质因子p,判断p是否是n的因子,是则加入,不是跳过
- 如果最后的n不等于1,说明有一个大于sqrt(n)的质因子,也要加入
例题
大整数的运算
思路:大整数存储使用以下结构体
bign{
int d[1000];//低位从0开始存
int len;//数组长度
bign(){
memset(d,0,sizeof(d));
len=0;
}
}
大整数比较:比较两个bign的大小将数组从高位依次向下比较,直到出现某一位不等。
加法
bign add(bign a,bign b) {
bign c;
int carry = 0;//carry是进位
for(int i=0;i<a.len||i<b.len;i++) {//以较长的为界限
int temp = a.d[i]+b.d[i]+carry;
c.d[c.len++]=temp%10;
carry=temp/10;
}
if(carry!=0)
{
c.d[c.len++] = carry;
}
return c;
}
减法
bign sub(bign a,bign b)
{
bign c;
for(int i=0;i<a.len||i<b.len;i++)
{
if(a.d[i]<b.d[i])
{
a.d[i+1]--;
a.d[i]+=10;
}
c.d[c.len++]=a.d[i]-b.d[i];
}
while(c.len-1>=1&&c.d[c.len-1]==0)//去处高位0,但至少保留一位最低位
{
c.len--;
}
return c;
}
注:使用sub函数时之前要比较两个数的大小,如果被减数小于减数,需要交换两个变量,然后输出负号,再使用sub函数。
乘法
bign multi(bign a,int b){
bign c;
int carry = 0;//进位
for(int i=0;i<a.len;i++){
int temp=a.d[i]*b+carry;
c.d[c.len++] = temp%10;
carry=temp/10;//高位部分作为新的进位
}
while(carry!=0)
{
c.d[c.len++]=carry%10;
carry/=10;
}
return c;
}
除法
bign divide(bign a,int b,int& r)//r为余数
{
bign c;
c.len=a.len;
for(int i=a.len-1;i>=0;i--)
{
r=r*10+a.d[i];
if(r<b)c.d[i]=0;
else{
c.d[i]=r/b;
r=r%b;
}
}
while(c.len-1>=1&&c.d[c,len-1]==0)
{
c.len--;
}
return c;
}
例题
C++标准模板库
vector的常见用法详解
定义
vector<typename> name;
访问方式
- 通过下标访问
- 通过迭代器访问
迭代器定义
vector<typename>::iterator it;
遍历方法
//第一种
vector<int>::iterator it = vi.begin();
for(int i=0;i<5;i++){
printf("%d",*(it+i));
}
//第二种
for(vector<int>""iterator it=vi.begin();it!=vi.end();it++){
printf("%d",*it);
}
例题
1039 Course List for Student (25 分)
set的常见用法详解
定义
set<typename> name;
使用迭代器遍历
for(set<typename>::iterator it=st.begin();it!=st.end();it++)
{
printf("%d",*it);
}
例题