本专栏主要是记录一下本人学习C++的历程、备份一下代码,不提供讲解,只有代码(但是里面应该有注释……谁知道呢)
今日(因为24号没时间今天补上)学习内容:
◎高精度乘法:
/*
高精度乘法
10000是最小的5位数,99999 是最大的5位数
10000*10000=100000000(9位数)
99999*99999=9999800001(10位数)
两个乘数的积的位数=他们的位数之和或和减1。
99999 a[0]到a[5](a[i])
* 99999 b[0]到b[5](b[j])
-------------------------------
899991
899991
899991
899991
899991
--------------------------------
9999800001
c[i+j-1]=c[i+j-1]+a[i]*b[j];//个位是1
c[i+j]=c[i+j]+a[i]*b[j];//个位是0
积当前位=乘数相乘每个对应当前位的数的和加进位。
*/
#include <iostream>
#include <cstring>
#define _MAXN 999
const long long int MAXN=_MAXN;
using namespace std;
int main() {
char s1[MAXN],s2[MAXN];
int a[MAXN],b[MAXN],c[MAXN];
long long int lena,lenb,lenc;
cin>>s1>>s2;
memset(c,0,sizeof(c));
lena=strlen(s1);
lenb=strlen(s2);
for(int i=0;i<lena;i++){
a[i]=s1[lena-1-i]-'0';
}
for(int i=0;i<lenb;i++){
b[i]=s2[lenb-1-i]-'0';
}
lenc=lena+lenb;
for(int i=0;i<lena;i++){
for(int j=0;j<lena;j++){
c[i+j]=c[i+j]+a[i]*b[j];
c[i+j+1]=c[i+j+1]+c[i+j]/10;
c[i+j]=c[i+j]%10;
}
}
if(c[lenc-1]==0) lenc--;
for(int i=lenc-1;i>=0;i--){
cout<<c[i];
}
return 0;
}
◎四位压缩高精度乘法:
/*
四位压缩高精度乘法
*/
#include<iostream>
#include <cmath>
#include <cstring>
using namespace std;
int main(){
char s1[440],s2[440];
int a[110],b[110],c[220];
int tot1=1,tox1=0,tot2=1,tox2=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
int lena,lenb,lenc;
cin>>s1>>s2;
lena=strlen(s1);
lenb=strlen(s2);
for(int i=lena-1;i>=0;i--){
if(tox1==4) {
tot1++;
tox1=0;
}
a[tot1]=a[tot1]+(s1[i]-'0')*pow(10,tox1);
tox1++;
}
for(int i=lenb-1;i>=0;i--){
if(tox2==4) {
tot2++;
tox2=0;
}
b[tot2]=b[tot2]+(s2[i]-'0')*pow(10,tox2);
tox2++;
}
lenc=tot1+tot2;
for(int i=1;i<=tot1;i++){
for(int j=1;j<=tot2;j++){
c[i+j-1]=c[i+j-1]+a[i]*b[j];
c[i+j]=c[i+j]+c[i+j-1]/10000;
c[i+j-1]=c[i+j-1]%10000;
}
}
if(c[lenc]==0) lenc--;
cout<<c[lenc];
for(int i=lenc-1;i>=1;i--) printf("%04d",c[i]);
return 0;
}
◎Trie树:
/*
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统
计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本
词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的
字符串比较,查询效率比哈希树高。
*/
/*
输入输出:
10
5
insert:app
insert:apple
insert:app
insert:tea
insert:tell
insert:tell
insert:app
insert:int
insert:float
insert:table
find:app
3
find:tell
2
find:float
1
find:ell
0
find:tel
0
find:dd
*/
#include <iostream>
#include <cstring>
using namespace std;
int tot=0;//记录节点序号(到哪个节点了)
int tree[1000010][30];//trie树
int num[1000010];//统计单词出现次数
void insert(string s){
int u=0;
for(int i=0;i<s.size();i++){
int now=s[i]-'a';//获取序号
if(!tree[u][now]){//不存在下级节点
tree[u][now]=++tot;//创建节点,先加后用
}
u=tree[u][now];
}
num[u]++;
}
int find(string s){
int u=0;
for(int i=0;i<s.size();i++){
int now=s[i]-'a';
if(!tree[u][now]){
return 0;//没有
}
u=tree[u][now];
}
return num[u];//有,返回出现次数
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){//输入n个
cout<<"insert:";
string s;
cin>>s;
insert(s);
}
for(int i=0;i<=m;i++){//查询m个
cout<<"find:";
string s;
cin>>s;
cout<<(find(s))<<endl;
}
return 0;
}
完。