C++学习笔记(一) 12.24:高精度乘法、四位压缩高精度乘法、Trie树。

本专栏主要是记录一下本人学习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;
} 

完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值