【jzoj2008】【高精度】【2015.10.17普及模拟】Oliver的成绩(score)

题目描述

Oliver进入初中后,觉得自己不能总是玩儿了,应该要好好学习了。正好一次考试结束了,Oliver想知道自己的语文,数学,英语分别与语文年级第一,数学年级第一,英语年级第一相差多少。由于Oliver所在年级有N个人,所以Oliver想你编个程序帮帮他。

输入
score.in共3N+4行,第一~三行分别为Oliver的语文数学英语成绩(位数M),第四行为N,以下3N行,每行一个数(它们的位数是M),分别为第N个同学的语文,数学,英语成绩。
即:
Oliver的语文
Oliver的数学
Oliver的英语
N
第一个人的语文
数学
英语
第二个人的语文

输出
score.out共一行,有三个数,分别为Oliver的语文数学英语与年级第一的差。
如果Oliver是第一,则输出0.

样例输入

10 
10
10               
3 
0
80
0
40
0
0
0
0 
100

样例输出

30 70 90

数据范围限制
【数据范围】
对于50%的数据,0<N<1000,0<M<19.
对于100%的数据,0<N<10000,0<M<30.且都为整数。


解题思路

很明显的高精度


#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
string s1,s2,s3,x1,x2,x3,max1,max2,max3;
int n,a[60],b[60],c[60],len;
string Max(string x,string y)
{
    int lenx=x.size(),leny=y.size();
    if(lenx==leny){
        if(x<y)return y;
        else return x;
    }
    else if(lenx<leny)
            return y;
    else return x;
}
void demo(string x,string y)//高精度减法
{
   memset(a,0,sizeof(a));
   memset(b,0,sizeof(b));
   memset(c,0,sizeof(c));
   int lenx=x.size(),leny=y.size();
   if(lenx>leny||(lenx==leny&&x>y))
   {
       for(int i=lenx-1;i>=0;i--)
           a[lenx-i-1]=x[i]-'0';
       for(int i=leny-1;i>=0;i--)
           b[leny-i-1]=y[i]-'0';
       len=lenx;
       for(int i=0;i<len;i++)
       {
           c[i]+=(a[i]-b[i]);
           if(c[i]<0)
            {
                c[i]+=10;
                c[i+1]--;
            }
       }
       while(c[len]==0)len--;
    }
    else
    {
        c[0]=0;
        len=0;
    }
}
int main()
{
	//freopen("score.in","r",stdin);
	//freopen("score.out","w",stdout);
    cin>>s1>>s2>>s3;
    max1=s1;
    max2=s2;
    max3=s3;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x1>>x2>>x3;
        max1=Max(max1,x1);//
        max2=Max(max2,x2);//
        max3=Max(max3,x3);//比较出第一名
    }
    demo(max1,s1);
    for(int i=len;i>=0;i--)
       printf("%d",c[i]);
    printf(" ");
    demo(max2,s2);
    for(int i=len;i>=0;i--)
        printf("%d",c[i]);
    printf(" ");
    demo(max3,s3);
    for(int i=len;i>=0;i--)
       printf("%d",c[i]);
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值