考前说明:
高精度的题目其实可以选择用python或者java之类自带高精度运算的语言来做,但是这里希望大家能提升代码能力,所以强制使用c和c++。
高精度的实现其实很简单,用一个数组来存储一个数,数字123可以用数组{1, 2, 3}来存储(也可以逆序存储)。
最后用小学老师教过的方法来实现加减乘除即可。
希望没接触过高精度的同学能看完这些提示后独立写出。
7-1 h0094. 乒乓球
国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。
其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。
华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响。
在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。
华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录末尾)。
比如现在有这么一份记录,(其中W表示华华获得一分,L表示华华对手获得一分):
WWWWWWWWWWWWWWWWWWWWWWLW
在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。
而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比分2比1。
如果一局比赛刚开始,则此时比分为0比0。
你的程序就是要对于一系列比赛信息的输入(WL形式),输出正确的结果。
输入格式:
每个输入文件包含若干行字符串(每行至多20个字母),字符串由大写的W、L和E组成。
其中E表示比赛信息结束,程序应该忽略E之后的所有内容。
输出格式:
输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。
其中第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。
#include<bits/stdc++.h>
using namespace std;
char a[10086],flag;
int n,H,A,x;
int main()
{
while(cin>>flag)
{
a[n]=flag;
if(a[n]=='W')H++;
if(a[n]=='L')A++;
x=fabs(H-A);//计算分差
if((H==11&&x>=2)||(A==11&&x>=2))//分差要大于二
{
cout<<H<<":"<<A<<endl;
H=0,A=0,x=0;
}
if(a[n]=='E')//接受到“E”则结束
{
cout<<H<<":"<<A<<endl<<endl;
H=0,A=0,x=0;
break;
}
n++;
}
for(int i=0;i<n;i++)
{
if(a[i]=='W')H++;
if(a[i]=='L')A++;
x=fabs(H-A);
if((A>=21||H>=21)&&x>=2)
{
cout<<H<<":"<<A<<endl;
H=0,A=0;
}
if(a[i]=='E')
{
cout<<H<<":"<<A<<endl;
break;
}
}
}
7-2 高精度加法(竖式运算即可,小学学过)
分数 15
对于输入的两个不超过100位数字的非负整数,给出两数之和。
输入格式:
在两行中分别给出两个不超过100位数字的非负整数
输出格式:
在一行中输出两数之和
#include<bits/stdc++.h>
using namespace std;
char a[199],b[199];
int A[199],B[199],C[199];
int main()
{
cin>>a>>b;
int m=strlen(a),n=strlen(b);
for(int i=0;i<m;i++)
{
A[m-i]=a[i]-'0';//将以字符串形式输入的数字倒叙存入数组
}
for(int i=0;i<n;i++)
{
B[n-i]=b[i]-'0';
// cout<<B[n-i]<<endl;
}
int y=m>n?m:n;//y是两者中大的
for(int i=1;i<=y;i++)
{
C[i]=B[i]+A[i]+C[i];//进位
C[i+1]+=C[i]/10;
C[i]%=10;
}
if(C[y+1]!=0)y++;
for(int i=y;i>=1;i--)
{
cout<<C[i];
}
}
7-3 高精度求累加和
分数 25
使用求和公式求1到N的累加和大家都会,但是如果把N值变大呢,比如100位的整数,那该怎么求?
输入格式:
输入在一行中给出1个位数不超过100位的整数N。
输出格式:
对每一组输入,在一行中输出1+2+3+……+N的值。tips:(使用等差数列求和公式)
#include<bits/stdc++.h>
using namespace std;
char ch[220];
int A[220],B[220],C[220],flag,L;
int main()
{
cin>>ch;
int n=strlen(ch);
for(int i=0;i<n;i++)
{
A[n-i]=ch[i]-'0';//将字符串倒序转化为数字并存入整型数组A
B[n-i]=ch[i]-'0';//
}
A[1]++;
for(int i=1;i<=n;i++)//判断+1后是否存在进位情况
{
if(A[1]<10)break;
A[i+1]+=A[i]/10;
A[i]=A[i]%10;
if(A[i+1]<10)break;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++){
C[i+j-1]=A[j]*B[i]+C[i+j-1];//本位乘法
C[i+j]+=C[i+j-1]/10;//进位
C[i+j-1]%=10;//进位后的本位
}
}
for(int i=2*n;i>=1;i--)
{
if(C[i]!=0)
{
flag=i;
break;
}
}//判断(n+1)n的位数
for(int i=flag;i>=1;i--)
{
if(C[i]%2==0)C[i]/=2;
else
{
C[i-1]+=10;
C[i]/=2;
}
}
for(int i=flag;i>=1;i--)
{
if(C[i]!=0)
{
flag=i;
break;
}
}//判断(n+1)n/2的位数 (因为都用的是flag存储长度)
for(int i=flag;i>=1;i--)
{
cout<<C[i];
}
}