大数模板

大数模板我统一用字符串形式string
大数相加

#include<bits/stdc++.h>
using namespace std;
string a,b;

string add(string a,string b){
	if(a.size()<b.size()) return add(b,a);
    string A,B,C,c;
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]);
    for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]);
    int t=0;
    for(int i=0;i<A.size();i++){
        t+=A[i]-'0';
        if(i<B.size()) t+=B[i]-'0';
        C.push_back(t%10+'0');
        t/=10;
    }
    if(t)	C.push_back(t+'0');
    int cot=C.size()-1;
    while(cot>=0)	c.push_back(C[cot--]);
    A.clear();	B.clear();	C.clear();
    return c;
}

int main(){
    cin>>a>>b;
	string f=add(a,b);
	cout<<f;
}

大数相乘

#include <bits/stdc++.h>
using namespace std;
string a,b;

const int MAXN=10005;
string mult(string A,string B){
	int x[MAXN],y[MAXN],z[MAXN<<1];
	string c; 
	memset(x,0,sizeof(x));	memset(y,0,sizeof(y));	memset(z,0,sizeof(z));
	for(int i=A.size()-1,cnt=0;i>=0;i--) x[cnt++]=A[i]-'0';
    for(int i=B.size()-1,cnt=0;i>=0;i--) y[cnt++]=B[i]-'0';
	for(int i=0;i<A.size();i++)	for(int j=0;j<B.size();j++)	z[i+j]+=x[i]*y[j];
	for(int i=0;i<MAXN*2;i++){
		if(z[i]>=10){
			z[i+1]=z[i+1]+z[i]/10;
			z[i]=z[i]%10;
		}
	}
	int cot=MAXN*2-1;
	while(z[cot]==0)	cot--;
	while(cot>=0)	c.push_back(z[cot--]+'0');
	return c;
}

int main(){
	cin>>a>>b;
	string f=mult(a,b);
	cout<<f;
}

将整型换成string

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
string change(ll i){
	string a,b;
	while(i){
		b.push_back(i%10+'0');
		i/=10;
	}
	int cot=b.size()-1;
    while(cot>=0)	a.push_back(b[cot--]);
    b.clear();
    return a;
}

int main(){
	cin>>n;
	string f=change(n);
	cout<<f;
}

大数相减

#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
string BigSub(string a,string b){
    if(a==b)	return "0";
    int singnal=0;
    int len1=a.size();
    int len2=b.size();
    if(len1<len2||len1==len2&&a<b){
        string c=a;
        a=b;
        b=c;
        singnal=1;
    }
    int i,n=len1-len2;
    for(i=len2-1;i>=0;i--)	a[len1-1-i]='0'+a[len1-1-i]-b[len2-1-i];
    for(i=len1-1;i>=0;i--){
        if(a[i]<'0'){
            a[i] +=10;
            a[i-1]--;
        }
    }
    i=0;
    while('0'==a[i])	i++;
    a.erase(0,i);
    if(singnal)	a='-'+a;
    return a;
}
int main(){
    string str1,str2;
    cin>>str1>>str2;
    string f=BigSub(str1,str2);
    cout<<f;
}

大数相除
(这里result为商,s为余数,还要考虑前导零,本质还是大数减法)

#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;

bool Compare(string first,string second){
    int i=0;	while('0'==first[i])	i++;	first.erase(0,i);
    i=0;	while('0'==second[i])	i++;	second.erase(0,i);
    int len1=first.size();
    int len2=second.size();
    if(len1<len2)	return false;
    else if(len1==len2&&first<second)	return false;
    return true;
}
string Subtraction(string s1,string s2){
    if(s1==s2)	return "0";
    int len1=s1.size();
    int len2=s2.size();
    for(int i=len2-1;i>=0;i--)	s1[len1-1-i]='0'+s1[len1-1-i]-s2[len2-1-i];
    for(int i=len1-1;i>=0;i--){
        if(s1[i]<'0'){
            s1[i]+=10;
            s1[i-1]--;
        }
    }
    int i=0;	while(s1[i]=='0')i++;	s1.erase(0,i);
    return s1;
}
void BigDivision(string a,string b){
    string result,s;
    int count,i;
    if("0"==b){
        cout<<"NULL"<<endl;
        return;
    }
    if(!Compare(a,b)){
        cout<<0<<" "<<a<<endl;
        return;
    }
    int len=a.size();
    for(int i=0;i<len;i++){
        count=0;
        s.push_back(a[i]);
        while(Compare(s,b)){
            s=Subtraction(s,b);
            count++;
        }
        result+=char(count+'0');
    }
    i=0;	while('0'==result[i])	i++;	result.erase(0,i);
    i=0;	while('0'==s[i])	i++;	s.erase(0,i);
    cout<<result<<" "<<s<<endl;
}

int main(){
    string str1,str2;
    cin>>str1>>str2;
	BigDivision(str1,str2);
}

大数阶乘

#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
const int maxn=1e5+7;
string fac(int n){
    string ans;
    if(n==0) return "1";
    int a[maxn];
    memset(a,0,sizeof(a));
    int s=0,m=n;
    while(m) a[++s]=m%10,m/=10;
    for(int i=n-1;i>=2;i--){
        int w=0;
        for(int j=1;j<=s;j++) a[j]=a[j]*i+w,w=a[j]/10,a[j]=a[j]%10;
        while(w) a[++s]=w%10,w/=10;
    }
    while(!a[s]) s--;
    while(s>=1) ans+=a[s--]+'0';
    return ans;
}
int main(){
    int n;
	cin>>n;
	cout<<fac(n)<<endl;
}

以上代码都是在输入的是非负数的情况下。如果遇到负数,减变加,乘或除后前面加个‘-’。

顺便提一下,一般高精度的题出的数据格外大(注意是超级大),如果遇到数据在1e18附近,复杂度在n^2, n^3等等类似情况在long long int最大值下面的,尽量用long long int,别用高精度。

附张表ing

unsigned int 04294967295   
int   -21474836482147483647 
unsigned long 04294967295
long   -21474836482147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
旅游社交小程序功能有管理员和用户。管理员有个人中心,用户管理,每日签到管理,景点推荐管理,景点分类管理,防疫查询管理,美食推荐管理,酒店推荐管理,周边推荐管理,分享圈管理,我的收藏管理,系统管理。用户可以在微信小程序上注册登录,进行每日签到,防疫查询,可以在分享圈里面进行分享自己想要分享的内容,查看和收藏景点以及美食的推荐等操作。因而具有一定的实用性。 本站后台采用Java的SSM框架进行后台管理开发,可以在浏览器上登录进行后台数据方面的管理,MySQL作为本地数据库,微信小程序用到了微信开发者工具,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得旅游社交小程序管理工作系统化、规范化。 管理员可以管理用户信息,可以对用户信息添加修改删除。管理员可以对景点推荐信息进行添加修改删除操作。管理员可以对分享圈信息进行添加,修改,删除操作。管理员可以对美食推荐信息进行添加,修改,删除操作。管理员可以对酒店推荐信息进行添加,修改,删除操作。管理员可以对周边推荐信息进行添加,修改,删除操作。 小程序用户是需要注册才可以进行登录的,登录后在首页可以查看相关信息,并且下面导航可以点击到其他功能模块。在小程序里点击我的,会出现关于我的界面,在这里可以修改个人信息,以及可以点击其他功能模块。用户想要把一些信息分享到分享圈的时候,可以点击新增,然后输入自己想要分享的信息就可以进行分享圈的操作。用户可以在景点推荐里面进行收藏和评论等操作。用户可以在美食推荐模块搜索和查看美食推荐的相关信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值