之前学习了一些结构体、高精度、快速排序的知识点,在此做一个小总结。
结构体
1.结构体定义:
结构体是由许多数据类型相同或数据类型不同的变量集合在一起构成的。一般定义形式如下:
定义结构体:
struct 类型名{
数据类型1 变量1;
数据类型2 变量2;
......
}[结构体的变量名(可加可不加)];
定义变量:
类型名 结构体的变量名;
2.结构体使用:
结构体中的变量可以像正常的变量一样输入、输出,赋值,运算等,例如:
定义:
struct student{ //定义一个名为student的结构体
int math,chinese;
}
使用:
student a; //定义
cin>>a.math>>a.chinese; //输入
定义一个结构体变量中的成员变量时,格式如下:
//结构体变量名.成员变量(如a.math)
if(a.math>a.chinese)a.math=a.chinese; //运算,比较
cout<<a.math; //输出
3.构造函数:
我们也可以在结构体中定义函数,例如:
struct student{
int aaa,bbb,ccc;
student(int _aaa,int _bbb){
//定义函数
aaa=_aaa;
bbb=_bbb;
ccc=_aaa+_bbb;
//函数体
}
}
像上面这样,在结构体中定义的函数就叫构造函数。需要注意的是,这个函数没有返回值,所以就不需要在函数前面添加返回类型。
不过,如果你在结构体中定义了构造函数,就要注意:如果你要单纯地只定义一个新结构体变量(例如student a;)就需要在定义结构体时在定义一个空的(即没有参数)构造函数,否则就会显示编译错误。
高精度
1.高精度原理:
一般来讲,我们平时遇见的数字一般都在int的范围里,如果有时数据范围较大,可以使用long long,一般也能解决。但有时数据范围太大,long long也存不下了,这时就要使用高精度了。
高精度就是把一个极大的数的各个位分离,依次存到数组里面,再通过数组对这些数进行各种运算。我们可以把高精度运算当做竖式来进行运算。
像是加法就是从最后一位加起,留下得出的结果的个位,将十位除以十后再加到前一位上,以此类推,减法也是同理。
乘法跟上面有些不同,要先用一个乘数去乘另一个乘数的个位,再去乘这个乘数的十位……以此类推,到全部计算完以后,再按照上面所说的方式进行进位,即可得出最终结果。当然,不要忘了计算每一位所在的位数(假设两个乘数的个位都是0位,用一个乘数的i位去乘另一个乘数的j位,该位所在的位数就是i+j位)。
除法也和上面的不太一样(这里只考虑高精度除以低精度),除法要从最高位看起,用该位去除以除数,留下的余数乘10再加到下一位去,以此类推。
2.示例函数
在下面给出部分计算的函数。
<1>加法(不考虑负数):
string gaojia(string s1,string s2){
string s;
int a[506]={};
int s3[505]={},s4[505]={};
int l1=s1.length();
int l2=s2.length();
int lmax=max(l1,l2);
for(int i=0;i<l1;i++)s3[i]=s1[l1-i-1]-'0';
for(int i=0;i<l2;i++)s4[i]=s2[l2-i-1]-'0';
for(int i=0;i<lmax;i++){
a[i]+=s3[i]+s4[i];
a[i+1]=a[i]/10;
a[i]%=10;
}
if(a[lmax]!=0)lmax++;
for(int i=lmax-1;i>=0;i--){
s=s+to_string(a[i]);
}
return s;
}
<2>减法(不考虑负数):
string gaojian(string s1,string s2){
string s;
if(s1==s2)return "0";
int a[10100]={};
int s3[10100]={},s4[10100]={};
int l1=s1.length();
int l2=s2.length();
int lmax=max(l1,l2);
if(l2>l1||l2==l1&&s2>s1){
s="-";
swap(l1,l2);
swap(s1,s2);
}
for(int i=0;i<l1;i++)s3[i]=s1[l1-i-1]-'0';
for(int i=0;i<l2;i++)s4[i]=s2[l2-i-1]-'0';
for(int i=0;i<lmax;i++){
a[i]+=s3[i]-s4[i];
if(a[i]<0){
a[i]+=10;
a[i+1]-=1;
}
}
for(int i=lmax;i>=0;i--){
if(a[i]!=0){
lmax=i;
break;
}
}for(int i=lmax;i>=0;i--){
s=s+to_string(a[i]);
}
return s;
}
<3>乘法(不考虑负数):
string gaocheng(string s1,string s2){
if(s1[0]=='0'||s2[0]=='0')return "0";
string s;
int a[4050]={};
int s3[2010]={},s4[2010]={};
int l1=s1.length();
int l2=s2.length();
int lmax=l1+l2;
for(int i=0;i<l1;i++)s3[i]=s1[l1-i-1]-'0';
for(int i=0;i<l2;i++)s4[i]=s2[l2-i-1]-'0';
for(int i=0;i<l1;i++){
for(int j=0;j<l2;j++){
a[i+j]+=s3[i]*s4[j];
a[i+1+j]+=a[i+j]/10;
a[i+j]%=10;
}
}
for(int i=l1+l2+2;i>=0;i--){
if(a[i]!=0){
lmax=i;
break;
}
}
for(int i=lmax;i>=0;i--){
s=s+to_string(a[i]);
}
return s;
}
<4>除法(只考虑高精度除以低精度,不考虑负数):
string gaochu(string s1,long long s2){
string s;
long long a[10100]={};
long long yv=0;
int u=s1.length();
int s3[5050];
int lmax=u-1;
for(int i=0;i<u;i++)s3[i]=s1[i]-'0';
for(int i=0;i<u;i++){
a[i]=(yv*10+s3[i])/s2;
yv=(yv*10+s3[i])%s2;
}
for(int i=0;i<u;i++){
if(a[i]!=0){
lmax=i;
break;
}
}
for(int i=lmax;i<u;i++){
s=s+to_string(a[i]);
}
return s;
}
快速排序
1.快速排序原理:
快速排序运用了递归思想,但也不难理解。就是从一列数中寻找一个“哨兵数”(哪个都行),定义一个i从左向右找,再定义一个j从右向左找。如果i这边找到某个数比哨兵数大,并且j这边找到某个数比哨兵数小,就将他们交换,直到i超过j。之后再将这个数组分为以i、j为界分别继续寻找,直到分到不可再分为止。
2..快速排序示例函数
void kuai(int b[],int l,int r){
int i=l,j=r;
int k=b[(i+j)/2];
while(i<=j){
while(b[i]<k)i++;
while(b[j]>k)j--;
if(i<=j){
swap(b[i],b[j]);
i++;
j--;
}
}
if(j>l)kuai(b,l,j);
if(i<r)kuai(b,i,r);
}
3.sort函数
在c++中,我们可以sort函数来进行快速排序。假设我们定义了一个a数组,想要从a[0]到a[n-1]进行排序,就可以这样使用:sort(a,a+n),此时我们默认的是从小到大。
如果我们想要在此基础上做一些改变,例如从大到小排序,又例如想要在两个数相同的情况下再进行排序……就需要再自定义一个判断函数了。假设这个判断函数名为pan,那么就可以这样使用:sort(a,a+n,pan);,而具体的判断就要看函数里面的了。例如,我想从大到小排序,就可以这样定义:
bool pan(int a,int b){
return a>b;
}
如果大家有其他想法的,可以补充。
2523

被折叠的 条评论
为什么被折叠?



