题目:
Oliver进入初中后,觉得自己不能总是玩儿了,应该要好好学习了。正好一次考试结束了,
Oliver想知道自己的语文,数学,英语分别与语文年级第一,数学年级第一,英语年级第一
相差多少。由于Oliver所在年级有N个人,所以Oliver想你编个程序帮帮他。
输入:
共3N+4行,第一~三行分别为Oliver的语文数学英语成绩(位数M),第四行为N
,以下3N行,每行一个数(它们的位数是M),分别为第N个同学的语文,数学,英语成绩。
即:
Oliver的语文
Oliver的数学
Oliver的英语
N
第一个人的语文
数学
英语
第二个人的语文
…
输出:
共一行,有三个数,分别为Oliver的语文数学英语与年级第一的差。
如果Oliver是第一,则输出0.
数据范围与约定:
【数据范围】
对于50%的数据,0<N<1000,0<M<19.
对于100%的数据,0<N<10000,0<M<30.且都为整数
思路:
一看到30位的数字,我马上就起来了,这不是高精度嘛,几天不见,这么拉了!
按照题意去做就好了,注意细节
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<vector>
#define ull unsigned long long
#define VI vector<int>
using namespace std;
struct node
{
VI a;
VI b;
VI c;
}t,oli,fir;
VI max(VI,VI);//vector比大小
VI sub(VI &,VI &);//高精减法
void read(string,VI &);//将字符串存到vector中
void out(VI);//输出vector
void clear(VI &);//清空vector
string y,s,yi;
int n;
int main()
{
//freopen("out.txt","w",stdout);
cin >> y >> s >> yi;
read(y,oli.a);
read(s,oli.b);
read(yi,oli.c);
cin >> n;
for(int i = 1;i <= n;++i)
{
cin >> y >> s >> yi;
read(y,t.a);
read(s,t.b);
read(yi,t.c);
fir.a = max(fir.a,t.a);//打擂台
fir.b = max(fir.b,t.b);
fir.c = max(fir.c,t.c);
clear(t.a);//清空
clear(t.b);
clear(t.c);
}
if(oli.a == max(oli.a,fir.a))//第一名是Oliver,特判
{
putchar('0');
cout << " ";
}
else
{
out(sub(fir.a,oli.a));
cout << " ";
}
if(oli.b == max(oli.b,fir.b))
{
putchar('0');
cout << " ";
}
else
{
out(sub(fir.b,oli.b));
cout << " ";
}
if(oli.c == max(oli.c,fir.c))
{
putchar('0');
cout << endl;
}
else
{
out(sub(fir.c,oli.c));
cout << endl;
}
return 0;
}
VI max(VI a,VI b)
{
if(a.size() < b.size()) return b;
else if(a.size() > b.size()) return a;
for(int i = a.size() - 1;i >= 0;--i)
{
if(a[i] > b[i]) return a;
else if(b[i] > a[i]) return b;
}
return a;
}
void read(string x,VI &a)
{
for(int i = x.size() - 1;i >= 0;--i)
{
a.push_back(x[i] - '0');
}
}
void out(VI a)
{
for(int i = a.size() - 1;i >= 0;--i)
{
cout << a[i];
}
}
VI sub(VI &a,VI &b)
{
VI c;
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();
}
return c;
}
void clear(VI &a)
{
while(a.size())
{
a.pop_back();
}
}
感谢你的阅读,希望这篇题解能帮到你!