关于高精度算法可以看看笔者的这篇文章:高精度算法(加减乘除)
1.h0094乒乓球
题目
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
getline(cin, s, 'E');
int c1 = 0, c2 = 0, cha = 0;
if (s.length() == 0)
{
cout << "0:0" << endl
<< endl;
cout << "0:0";
return 0;
}
bool begin = true;
for (int i = 0; i < s.length(); ++i)
{
if (s[i] == 'W')
{
begin = false;
c1++;
cha++;
}
else if (s[i] == 'L')
{
begin = false;
c2++;
cha--;
}
if (((c1 >= 11 || c2 >= 11) && abs(cha) >= 2))
{
cout << c1 << ':' << c2 << endl;
c1 = 0;
c2 = 0;
cha = 0;
begin = true;
}
if ((begin == true || c1 != 0 || c2 != 0) && i + 1 == s.length())
{
cout << c1 << ':' << c2 << endl;
c1 = 0;
c2 = 0;
cha = 0;
}
}
cout << endl;
begin = true;
for (int i = 0; i < s.length(); ++i)
{
if (s[i] == 'W')
{
begin = false;
c1++;
cha++;
}
else if (s[i] == 'L')
{
begin = false;
c2++;
cha--;
}
if (((c1 >= 21 || c2 >= 21) && abs(cha) >= 2))
{
cout << c1 << ':' << c2 << endl;
c1 = 0;
c2 = 0;
cha = 0;
begin = true;
}
if ((begin == true || c1 != 0 || c2 != 0) && i + 1 == s.length())
{
cout << c1 << ':' << c2 << endl;
c1 = 0;
c2 = 0;
cha = 0;
}
}
return 0;
}
2.高精度加法
题目
代码
#include <bits/stdc++.h>
using namespace std;
int a[105],b[105],c[105];
int main()
{
string s;
cin>>s;
for(int i=0;i<s.length();++i)
a[i+1]=s[s.length()-1-i]-'0';
int lena=s.length();
cin>>s;
for(int i=0;i<s.length();++i)
b[i+1]=s[s.length()-1-i]-'0';
int lenb=s.length();
int lenc=1;
int yu=0;
while(lenc<=lena||lenc<=lenb)
{
c[lenc]=a[lenc]+b[lenc]+yu;
yu=c[lenc]/10;
c[lenc]%=10;
lenc++;
}
c[lenc]=yu;
if(c[lenc]==0)
lenc--;
for(int i=lenc;i>=1;--i)
cout<<c[i];
cout<<endl;
return 0;
}
3.高精度累加求和
题目
代码
#include <bits/stdc++.h>
using namespace std;
int a[105],b[105],c[205],d[205];
int main()
{
//a为N
string s;
cin>>s;
for(int i=0;i<s.length();++i)
a[i+1]=s[s.length()-1-i]-'0';
int lena=s.length();
//b为N+1
int lenb=1;
int yu=0;
while(lenb<=lena)
{
if(lenb==1)
b[lenb]=1+a[lenb]+yu;
else
b[lenb]=a[lenb]+yu;
yu=b[lenb]/10;
b[lenb]%=10;
lenb++;
}
b[lenb]=yu;
if(b[lenb]==0)
lenb--;
//c为N*(N+1)
int lenc;
for(int i=1;i<=lena;++i)
{
yu=0;
for(int j=1;j<=lenb;++j)
{
c[i+j-1]+=a[i]*b[j]+yu;
yu=c[i+j-1]/10;
c[i+j-1]%=10;
}
c[i+lenb]=yu;
}
lenc=lena+lenb;
while(c[lenc]==0&&lenc>1)
lenc--;
//将数组c逆向排序
yu=0;
for(int i=1;i<=(lenc+1)/2;++i)
{
int temp=c[i];
c[i]=c[lenc+1-i];
c[lenc+1-i]=temp;
}
//d为c/2
for(int i=1;i<=lenc;++i)
{
d[i]=(yu*10+c[i])/2;
yu=(yu*10+c[i])%2;
}
int lend=1;
while(d[lend]==0&&lend<lenc)
lend++;
for(int i=lend;i<=lenc;++i)
cout<<d[i];
cout<<endl;
return 0;
}