高精度题库

1.

【基础】高精度加法

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 16MB,其他语言 32MB
难度:中等
分数:100 OI排行榜得分:12(0.1*分数+2*难度)

描述

计算a+b的值,a,b皆为不超过240位的正整数。

输入描述

两个正整数,每行一个

输出描述

一个数,代表两个整数的和

用例输入 1 

111111111111111111111111111111111111
222222222222222222222222222222222222

用例输出 1 

333333333333333333333333333333333333

关联视频

提交30分钟后可观看解题视频

来源

高精度算法

#include<bits/stdc++.h>
using namespace std;
string n,m;
vector<int>a,b,c;
void add(){
	int t=0;
	for(int i=0;i<a.size();i++){
		t+=a[i];
		if(i<b.size()) t+=b[i];
		c.push_back(t%10);
		t/=10;
	}
	if(t>0)
	c.push_back(t%10);
}
int main(){
	cin>>n>>m;
	if(n.size()<m.size())swap(n,m);
	for(int i=n.size()-1;i>=0;i--)a.push_back(n[i]-'0');
	for(int i=m.size()-1;i>=0;i--)b.push_back(m[i]-'0');

	add();
	for(int i=c.size()-1;i>=0;i--) cout<<c[i];
		return 0;
}

2.

【基础】高精度减法

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 16MB,其他语言 32MB
难度:中等
分数:100 OI排行榜得分:12(0.1*分数+2*难度)

描述

高精度减法,求a-b。a,b都是不超过240位的非负整数。

输入描述

两个非负整数,每行一个。

输出描述

一个整数,代表两个整数相减之后的结果。

用例输入 1 

33333333333333333333333333333333333333333
22222222222222222222222222222222222222222

用例输出 1 

11111111111111111111111111111111111111111

关联视频

提交30分钟后可观看解题视频

来源

高精度算法

#include<bits/stdc++.h>
using namespace std;
vector<int>A,B,C;
bool cmp(string a,string b){
    if(a.size()!=b.size()) return a.size()>b.size();
    for(int i=0;i<a.size();i++){
        if(a[i]!=b[i]){
            return a[i]>b[i];
        } 
    }        
	return true;
}
void add(){
    int t=0;
    for(int i=0;i<A.size();i++){
        t=A[i]-t;
        if(i<B.size()) t-=B[i];
        C.push_back((t+10)%10);
        if(t<0) t=1;
        else t=0;
    }
    while(C.size()>1&&C.back()==0) C.pop_back();
}
int main(){
	string a,b;
	cin>>a>>b;
    if(!cmp(a,b)){
        cout<<"-";
    	swap(a,b);
    } 
    
    
    
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
    for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
    add();
    for(int i=C.size()-1;i>=0;i--) cout<<C[i];
	return 0;
}

3.

【基础】高精度乘单精度
时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 16MB,其他语言 32MB
难度:中等
分数:100 OI排行榜得分:12(0.1*分数+2*难度)

描述

高精度乘单精度,a*b。 a是一个很大的非负整数,但不超过240位,b是一个非负整数不超过10000,求a*b。

输入描述

两行数字, 第一行是a,第二行是b。

输出描述

一行,输出a * b的计算结果。

用例输入 1 

111111111111111111111111111111111111
10

用例输出 1 

1111111111111111111111111111111111110

关联视频

提交30分钟后可观看解题视频

来源

高精度算法

#include<bits/stdc++.h>
using namespace std;
string s1;
int a[250],b;
int main()
{
	int p;
	cin>>s1>>b;
	for(int i=0;i<s1.size();i++)
	{
		a[i]=s1[s1.size()-i-1]-'0';
	}
	for(int i=0;i<s1.size();i++)
	{
		a[i]*=b;
	}
	for(int i=0;i<s1.size()+4;i++)
	{
		if(a[i]>=10)
		{
			a[i+1]+=a[i]/10;
			a[i]%=10;
		}
	}
	for(int i=s1.size()+3;i>=0;i--)
	{
		if(a[i]!=0)
		{
			p=i;
			break;
		}
	}
	for(int i=p;i>=0;i--)cout<<a[i];
	return 0;
}

4.【基础】求2的n次方

显示标签

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 64MB,其他语言 128MB
难度:中等
分数:100 OI排行榜得分:12(0.1*分数+2*难度)

描述

求2的n次方!(0<=n<=100)

输入描述

从键盘读入一个整数n!

输出描述

请输出2的n次方!

用例输入 1 

100

用例输出 1 

1267650600228229401496703205376

关联视频

提交30分钟后可观看解题视频

来源

高精度算法


#include<bits/stdc++.h>
using namespace std;
int a[100];
int main()
{
	int n,k=1;
	cin>>n;
	a[0]=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<k;j++)
		{
			a[j]*=2;
		}
		for(int j=0;j<k;j++)
		{
			
			if(a[j]>=10)
			{
				a[j+1]+=a[j]/10;
				a[j]%=10;
			}
		}
		if(a[k]!=0)
		{
			k++;
		}
	}
	for(int i=k-1;i>=0;i--)cout<<a[i];
	return 0;
}

5.【基础】计算N的阶乘

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 16MB,其他语言 32MB
难度:中等
分数:100 OI排行榜得分:12(0.1*分数+2*难度)

描述

请计算n的阶乘(1<=n<=100)

n的阶乘计算公式为:n!=n*(n-1)*(n-2)*...*1,如:5!=5*4*3*2*1=120

输入描述

一个整数n(1<=n<=100)

输出描述

n的阶乘

用例输入 1 

20

用例输出 1 

2432902008176640000

关联视频

提交30分钟后可观看解题视频

来源

高精度算法

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

int main()
{
    int n;
    cin >> n;
    int a[100000] = {};
    a[0] = 1;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 0; j <= 10000; j++)
            a[j] = a[j] * i;
        for (int j = 0; j <= 10000; j++)
        {
            a[j + 1] += a[j] / 10;
            a[j] %= 10;
        }
    }
    int t = 10000;
    while (a[t] == 0)t--;
    for (int i = t; i >= 0; i--)
        cout << a[i];
    return 0;
}

6.【基础】求2+2*2+2*2*2+…+2*2*2*….*2

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 128MB,其他语言 256MB
难度:中等
分数:100 OI排行榜得分:12(0.1*分数+2*难度)

描述

求2+2*2+2*2*2+…+2*2*2*….*2的和是多少?最后一项有多少2相乘由键盘读入的n决定(1<=n<=100)!

比如:n=3,那么s=2+2*2+2*2*2=14!

输入描述

从键盘读入一个整数n(1<=n<=100)

输出描述

输出求出的和

用例输入 1 

3

用例输出 1 

14

关联视频

提交30分钟后可观看解题视频

来源

高精度算法

#include<bits/stdc++.h>
using namespace std;
int a[100]={1};
int r[1000];
int k=1,k2=1,n,len;

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<k;j++)
        {
            a[j]*=2;
        }
        for(int j=0;j<k;j++)
        {
            if(a[j]>=10)
            {
                a[j+1]+=a[j]/10;
                a[j]%=10;
            }
        }
        if(a[k])  k++;
        len=k;
        if(k2>k) len=k2;
        for(int j=0;j<len;j++)
        {
            r[j]+=a[j];
            if(r[j]>=10)
            {
                r[j+1]+=r[j]/10;
                r[j]%=10;
            }
        }
        if(r[k2]) k2++;
    }
    for(int i=k2-1;i>=0;i--) cout<< r[i];
    return 0;
}

7.【基础】求1!+2!+3!+4!+...+n!

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 32MB,其他语言 64MB
难度:中等
分数:100 OI排行榜得分:12(0.1*分数+2*难度)

描述

请求出1!+2!+3!+4!+...+n!,请注意,n<=50。

n!=n*(n-1)*(n-2)*...*1,如:5!=5*4*3*2*1=120。

输入描述

请输入一个整数n(n<=50)

输出描述

输出求和的结果

用例输入 1 

10

用例输出 1 

4037913

关联视频

提交30分钟后可观看解题视频

来源

高精度算法

//额,怎么说呢,我也不会啊!

8.【提高】Pell数列2

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 16MB,其他语言 32MB
难度:简单
分数:100 OI排行榜得分:10(0.1*分数+2*难度)

描述

有一种数列,它的前10项的值分别为:1 2 5 12 29 70 169 408 985 2378,这个数列被称为Pell数列,请问该数列的第n项的值是多少?(n<=1000)

输入描述

一个整数n

输出描述

第n项的值

用例输入 1 

10

用例输出 1 

2378

关联视频

提交30分钟后可观看解题视频

来源

递推

#include<bits/stdc++.h>
using namespace std;
string he(string s1,string s2){
	int a[1001]={0},b[1001]={0},c[1001]={0};
	string r;
	int x1=s1.size(),x2=s2.size(),i,k;
	for(i=0;i<x1;i++){
		a[i]=s1[x1-i-1]-'0';
	}
	for(i=0;i<x2;i++){
		b[i]=s2[x2-i-1]-'0';
	}
	k=x1;
	if(x2>x1) k=x2;
	for(i=0;i<k;i++){
		c[i]=a[i]+b[i];
	}
	for(i=0;i<k;i++){
		if(c[i]>=10){
			c[i+1]=c[i+1]+c[i]/10;
			c[i]=c[i]%10;
		}
	}
	if(c[k]!=0) k++;
	char f;
	for(i=k-1;i>=0;i--){
		f=c[i]+'0';
		r=r+f;
	}
	return r;
}
string cheng(string s){
	string r;
	int a[1100]={0},i,x=s.size(),k;
	for(i=0;i<x;i++){
		a[i]=s[x-i-1]-'0';
	}
	k=x;
	for(i=0;i<x;i++){
		a[i]=a[i]*2;
	}
	for(i=0;i<x;i++){
		if(a[i]>=10){
			a[i+1]=a[i+1]+a[i]/10;
			a[i]=a[i]%10;
		}
	}
	if(a[k]!=0) k++;
	char f;
	for(i=k-1;i>=0;i--){
		f=a[i]+'0';
		r=r+f;
	}
	return r;
}
int main()
{
	string x,y,z;
    int n;
    cin>>n;
    x="1";
    y="2";
    for(int i=3;i<=n;i++){
		z=he(cheng(y),x);
		x=y;
		y=z;
	}
	if(n==1){
 		cout<<x;
	}else if(n==2){
		cout<<y;
	}else{
		cout<<z;
	}
    return 0;
}

9.大整数加法

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 256MB,其他语言 512MB
难度:简单
分数:100 OI排行榜得分:10(0.1*分数+2*难度)

描述

求两个不超过200位的非负整数的和。

输入描述

有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

输出描述

一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

用例输入 1 

22222222222222222222
33333333333333333333

用例输出 1 

55555555555555555555

用例输入 2 

0325
123

用例输出 2 

448

关联视频

提交30分钟后可观看解题视频

#include<bits/stdc++.h>
using namespace std;
string n,m;
vector<int>a,b,c;
void add(){
	int t=0;
	for(int i=0;i<a.size();i++){
		t+=a[i];
		if(i<b.size()) t+=b[i];
		c.push_back(t%10);
		t/=10;
	}
	if(t>0)
	c.push_back(t%10);
}
int main(){
	cin>>n>>m;
	if(n.size()<m.size())swap(n,m);
	for(int i=n.size()-1;i>=0;i--)a.push_back(n[i]-'0');
	for(int i=m.size()-1;i>=0;i--)b.push_back(m[i]-'0');

	add();
	for(int i=c.size()-1;i>=0;i--) cout<<c[i];
		return 0;
}

制作不易,点赞关注作者哦!

  • 33
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值