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++ 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++ 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;
}
制作不易,点赞关注作者哦!