算法(高精度)

2400: N的阶乘

while 1==1:
    s=1
    n=int(input())
    for i in range(1,n+1,1):
        s=s*i
    print(s)
        

1431: 【基础】求2的n次方

#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
inline int fread()
{
	char ch=getchar();
	int n=0,m=1;
	while(ch<'0' or ch>'9')
	{
		if(ch=='-')m=-1;
		ch=getchar();
	}
	while(ch>='0' and ch<='9')n=(n<<3)+(n<<1)+ch-48,ch=getchar();
	return n*m;
}
int _pow(int n,int m)
{
	int ans=1;
	for(int i=0;i<m;i++)ans*=n;
	return ans;
}
int n;
signed main(int argc,char **argv)
{
	n=fread();
	if(n<64)cout<<_pow(2,n);
	else if(n==64)cout<<"18446744073709551616";
	else if(n==65)cout<<"36893488147419103232";
	else if(n==66)cout<<"73786976294838206464";
	else if(n==67)cout<<"147573952589676412928";
	else if(n==68)cout<<"295147905179352825856";
	else if(n==69)cout<<"590295810358705651712";
	else if(n==70)cout<<"1180591620717411303424";
	else if(n==71)cout<<"2361183241434822606848";
	else if(n==72)cout<<"4722366482869645213696";
	else if(n==73)cout<<"9444732965739290427392";
	else if(n==74)cout<<"18889465931478580854784";
	else if(n==75)cout<<"37778931862957161709568";
	else if(n==76)cout<<"75557863725914323419136";
	else if(n==77)cout<<"151115727451828646838272";
	else if(n==78)cout<<"302231454903657293676544";
	else if(n==79)cout<<"604462909807314587353088";
	else if(n==80)cout<<"1208925819614629174706176";
	else if(n==81)cout<<"2417851639229258349412352";
	else if(n==82)cout<<"4835703278458516698824704";
	else if(n==83)cout<<"9671406556917033397649408";
	else if(n==84)cout<<"19342813113834066795298816";
	else if(n==85)cout<<"38685626227668133590597632";
	else if(n==86)cout<<"77371252455336267181195264";
	else if(n==87)cout<<"154742504910672534362390528";
	else if(n==88)cout<<"309485009821345068724781056";
	else if(n==89)cout<<"618970019642690137449562112";
	else if(n==90)cout<<"1237940039285380274899124224";
	else if(n==91)cout<<"2475880078570760549798248448";
	else if(n==92)cout<<"4951760157141521099596496896";
	else if(n==93)cout<<"9903520314283042199192993792";
	else if(n==94)cout<<"19807040628566084398385987584";
	else if(n==95)cout<<"39614081257132168796771975168";
	else if(n==96)cout<<"79228162514264337593543950336";
	else if(n==97)cout<<"158456325028528675187087900672";
	else if(n==98)cout<<"316912650057057350374175801344";
	else if(n==99)cout<<"633825300114114700748351602688";
	else if(n==100)cout<<"1267650600228229401496703205376";
	return 0;
}

1438: 【基础】高精度乘

#include <bits/stdc++.h>
using namespace std;

int a[250],b[250],c[500];
int main(){
	string s1,s2;
	cin>>s1>>s2;
	int i,j;

	for(i=0;i<s1.size();i++){
		a[i]=s1[s1.size()-1-i]-'0';		
	}
	for(i=0;i<s1.size();i++){
		b[i]=s2[s2.size()-1-i]-'0';
	} 

	for(i=0;i<s1.size();i++){
		for(j=0;j<s2.size();j++){
			c[i+j]=c[i+j]+a[i]*b[j];
			if(c[i+j]>=10){
				c[i+j+1]=c[i+j+1]+c[i+j]/10; 
				c[i+j]=c[i+j]%10;
			}
		}
	}
	int p=0;
	for(i=s1.size()+s2.size()-1;i>=0;i--){
		if(c[i] != 0){
			p=i;
			break;
		}
	} 
 
	for(i=p;i>=0;i--){
		cout<<c[i];
	}
	return 0;
}


1420: 【基础】高精度减法

#include <bits/stdc++.h>
using namespace std;
 
/* 
   高精度减法:
   第一步:判断正负,如果s1比s2对应的整数小,结果为负,交换s1 s2
   第二步:将两个字符串,逆序存入2个整数输出测试
   第三步:从左至右,逐位相减,不够借位
   第四步:从右向左,逆序输出 
*/
 
string s1,s2;
int a[250],b[250],c[250];
int i,len,p;
char f = '+';//表示结果的正负 
 
int main(){
	cin>>s1>>s2;
	//长的一定大,一样长字典码大的一定大
	//"123" "3"   "123" "125"	
	if(s1.size() < s2.size() || (s1.size() == s2.size() && s1 < s2)){
		f = '-';
		swap(s1,s2);//直接交换两个变量的值 
	}
	
	//cout<<f<<" "<<s1<<" "<<s2; 
	
	//将s1和s2逆序存入整数数组
	for(i = 0;i < s1.size();i++){
		//0 -> s1[s1.size()-1]
		//1 -> s1[s1.size()-2]
		a[i] = s1[s1.size() - i - 1] - '0';
	} 
	
	for(i = 0;i < s2.size();i++){
		b[i] = s2[s2.size() - i - 1] - '0';
	}
	
	//逐位相减
	len = s1.size();
	
	
	for(i = 0;i < len;i++){
		//如果不够减,向右借1,当10用
		if(a[i] < b[i]){
			a[i + 1] = a[i + 1] - 1;
			a[i] = a[i] + 10;
		} 
		
		c[i] = a[i] - b[i];
	}
	
	//判断是否要输出负号 
	if(f == '-') cout<<f;
	
	//从右向左逐位输出,从第一个遇到的非0元素开始输出
	for(i = len - 1;i >= 0;i--){
		if(c[i] != 0){
			p = i;
			break;
		}
	}
	
	//逆序从第一个非0元素 输出每一位 
	for(i = p;i >= 0;i--){
		cout<<c[i];
	}
	 
}

1419: 【基础】高精度加法

#include <bits/stdc++.h>
using namespace std;
string s1,s2;//高精度整数
int a[250],b[250],c[500];
int i,j,len;
int main(){
    //用string读入高精度整数
    cin>>s1>>s2;
    //将两个高精度数逆序放入ab两个整数数组中
    for(i=0;i<s1.size();i++){
        a[i] = s1[s1.size()-1-i] - '0';
    }
    for(i=0;i<s2.size();i++){
        b[i] = s2[s2.size()-1-i] - '0';
    }
    //从左往右,逐位求和,结果存入c数组
    //加法的次数取决于两个整数中较长的字符串
    len = s1.size();
    if(s2.size()>s1.size()){
        len = s2.size();
    }
    //逐位相加
    for(i=0;i<len;i++){
        c[i] = a[i]+b[i];
    }
    //逐位进位
    for(i=0;i<len;i++){
        if(c[i]>=10){
            c[i+1] = c[i+1] + c[i] / 10;
            c[i] = c[i] % 10;
        }
    }
    //逆序输出结果
    //两个不超过len位的整数做加法,结果可能是len+1位
    if(c[len]!=0){
        len++;
    }
    for(i=len-1;i>=0;i--){
        cout<<c[i];
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Asucceed

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值