1081. Rational Sum

来源:互联网 发布:大华网络监控安装步骤 编辑:程序博客网 时间:2024/06/06 04:42
#include <stdio.h>#include <math.h>#include <string.h>/*能不能不用字符串转化为整数?*/typedef struct Number {long long integer;long long numerator;long long denominator;}Number;long long Convert(char num[], int begin, int end);Number AddNum(Number x, Number y);int main(){Number x, y;int n,i,j;char num[100];scanf("%d", &n);scanf("%s", num);for (j = 0; num[j] != '/'; j++);if (num[0] == '-') {x.numerator = Convert(num, 1, j - 1);x.numerator*=-1;}else x.numerator = Convert(num, 0, j - 1);x.denominator = Convert(num, j + 1, strlen(num) - 1);x.integer = x.numerator/x.denominator;x.numerator %=x.denominator;for (i = 0; i < n-1; i++) {scanf("%s", num);for (j = 0; num[j] != '/'; j++);if (num[0] == '-') {y.numerator = Convert(num, 1, j - 1);y.numerator *= -1;}elsey.numerator = Convert(num, 0, j - 1);y.denominator = Convert(num, j + 1, strlen(num) - 1);y.integer = y.numerator / y.denominator;y.numerator %=y.denominator;x = AddNum(x, y);//printf("_%d %ld/%ld_", y.integer, y.numerator, y.denominator);}if (x.integer)printf("%lld", x.integer);if (x.numerator) {if (x.integer)printf(" ");if(x.integer<0)printf("%lld/%lld", -x.numerator, x.denominator);if(x.integer>=0)printf("%lld/%lld", x.numerator, x.denominator);}if (!x.integer&&!x.numerator)printf("0");return 0;}long long Convert(char num[], int begin, int end){int i;long long ans=0;for (i = end; i >= begin; i--) ans += (num[i]-'0') * pow(10, end-i);return ans;}Number AddNum(Number x, Number y){Number z;z.integer = x.integer + y.integer;long long deno = x.denominator*y.denominator;long long numer = x.numerator*y.denominator + x.denominator*y.numerator;z.integer += numer / deno;numer %= deno;while (!(deno % 2) && !(numer % 2)) {deno /= 2;numer /= 2;}long long factor;for (factor = 3; factor < numer; factor += 2) {while (!(deno % factor) && !(numer % factor)) {deno /= factor;numer /= factor;}}z.denominator = deno;z.numerator = numer;return z;}

0 0
原创粉丝点击