1081__部分正确

一个4分case浮点错误

而且注意:

1:PAT上不识别<math.h>的abs, labs

要用<cmath>+namespace才能用abs!

2:另外求最大公约数的欧几里得法

#include <stdio.h>
#include <cmath>//干你娘, PAT对<math.h> 的abs, labs都识别不了!用<cmath>+namespace就行!
int n;

long num,den;

long intPart;

long ns[102], ds[102];

long getMaxFactor(long a, long b){//最大公约数
	while(a != b){
		if(a > b){
			a -= b;
		}else{
			b -= a;
		}
	}
	return a;
}


int main(){
	freopen("in.txt","r",stdin);
	scanf("%d", &n);

	intPart = 0;

	long   commonDen = 1;

	int pos = 0;//提取整数部分后,分数部分非0的记录下来
	for(int i = 0 ; i < n; i++){
		scanf("%ld/%ld", &num, &den);

		if(den == 0){//居然有逗比的分母是0
			continue;
		}

		//long absNum = num >= 0 ? num : (0-num);

		if(labs(num) >= den){//分子大于等于分母, 将整数部分提取
			intPart += num/den;
			num = num%den;
		}

		if(num == 0){//分母能整除分子
			continue;
		}

		//absNum = num >= 0 ? num : (0-num);//再求一次绝对值
		long maxFactor = getMaxFactor(labs(num), den);

		num = num/maxFactor;//分子分母约分
		den = den/maxFactor;

		commonDen *= den;//通分分母

		ns[pos] = num;
		ds[pos] = den;//两个都写成[pos++],造成pos+2,you fucking idiot!
		pos++;

		 
	
	}


	long    totalNum = 0;//通分后分子相加
	//long absTotalNum;

	for(int i = 0; i < pos; i++){
		totalNum += (commonDen/ds[i])*ns[i];

		//absTotalNum = totalNum >= 0 ? totalNum : (0-totalNum);

		if(labs(totalNum) >= commonDen){//累加的过程中就要提取整数, 以防溢出
				intPart += totalNum/commonDen;
				totalNum = totalNum%commonDen;
		}
	}


	if(totalNum != 0){ //分子分母约分
		//absTotalNum = totalNum >= 0 ? totalNum : (0-totalNum);
		long maxFactor = getMaxFactor(labs(totalNum), commonDen);

		totalNum = totalNum/maxFactor;
		commonDen = commonDen/maxFactor;		 

	}

	if(intPart != 0 && totalNum != 0){
		printf("%ld %ld/%ld",intPart, totalNum, commonDen);
	}else if(intPart == 0 && totalNum != 0){
		printf("%ld/%ld", totalNum, commonDen);
	}else {
		printf("%ld", intPart);
	} 

	

	
		

	return 0;
}


你可能感兴趣的:(1081__部分正确)