7-1 h0094. 乒乓球
思路简单,直接写
#include<bits/stdc++.h>
using namespace std;
int a1[100000],b1[100000],a2[100000],b2[100000];//比分统计
int top1,top2;//进行比赛数;1为11分制,2为21分制
int main()
{
char c;
top1=top2=1;
while((c=getchar())!='E')//读入
{
{
if(c=='W')//a胜
a1[top1]++,a2[top2]++;
else if(c=='L')//b胜
b1[top1]++,b2[top2]++;
//判断是否下一局
if((a1[top1]>=11||b1[top1]>=11)&&abs(a1[top1]-b1[top1])>=2)
{
++top1;
}
if((a2[top2]>=21||b2[top2]>=21)&&abs(a2[top2]-b2[top2])>=2)
{
++top2;
}
}
}
for(int i=1;i<=top1;++i)
printf("%d:%d\n",a1[i],b1[i]);
printf("\n");
for(int i=1;i<=top2;++i)
printf("%d:%d\n",a2[i],b2[i]);
return 0;
}
7-2 高精度加法
如题
#include<bits/stdc++.h>
using namespace std;
int a[1000],b[1000].
int k[1000];
string aa,bb;
int main()
{
cin>>aa>>bb;//以字符串输入a,b
int l1=aa.length();
int l2=bb.length();//长度
int l;
l=max(l1,l2);//用于对齐
int t=0;
for(int i=l-1;i>=0;--i)
{
++t;
if(i-l+l1>=0) a[t]=aa[i-l+l1]-'0';//转化为数字并倒序存储
if(i-l+l2>=0) b[t]=bb[i-l+l2]-'0';//倒序防止最高位进位
}
int f=0;判断最高位是否进位
for(int i=1;i<=t;++i)
{
k[i]+=a[i]+b[i];相加
if(k[i]>=10)//判断是否进位,由于只可能进一,并未考虑通式
{
k[i]-=10;
k[i+1]+=1;
if(i==t) f=1;
}
}
for(int i=t+f;i>=1;--i) printf("%d",k[i]);
return 0;
}
7-3 高精度求累加和
利用1+2+3+······+(n-1)+n=n*(n-1)/2公式,先高精求n*(n-1),再/2即可。
#include<bits/stdc++.h>
using namespace std;
int a[1000],b[1000];//a代指n;b代指n+1
int ans[100000];//结果
string n;//输入
int ll;//结果长度,输出用
int main()
{
cin>>n;
int l=n.length();
int t=l;
for(int i=0;i<l;++i)
{
a[t]=n[i]-'0';
b[t]=a[t];
--t;
}//读入并转化
b[++t]++;//n+1(b)=n(a)+1;
while(b[t]>=10)
{
b[t]-=10;
b[++t]++;
}
if(t==l+1) l++;//处理9+1进位问题
for(int i=1;i<=l;++i)//n
{
for(int j=1;j<=l;++j)//n+1
{
ans[i-1+j]+=a[i]*b[j];
int k=0;
k=ans[i-1+j]/10;
ans[i-1+j]%=10;
ans[i+j]+=k;//进位
}
}
//高精乘
ll=2*l;
for(int i=ll;i>=1;--i)
{
if(ans[i]%2!=0) ans[i-1]+=10;
ans[i]/=2;
}
//ans/2;
while(ans[ll]==0&&ll!=0) ll--;//处理首位0
for(int i=ll;i>=1;--i)
printf("%d",ans[i]);
return 0;
}