Oliver的成绩(vector)

题目:

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();
	}
}

感谢你的阅读,希望这篇题解能帮到你!

上一篇:IOS免签封包,仿fir二开分发平台源码


下一篇:创建并操作循环链表