代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
int leftHand;
int rightHand;
} person;
double max(person *, person *);
int compare(const void *, const void *);
void creatBigNumber(char *, int);
int compareBigNumber(char *, char *);
void multiplyBignumber(char *, int);
void divideBignumber(char *, char *, int);
int main(void) {
int n;
scanf("%d", &n);
person people[n + 1];
for (int i = 0; i < n + 1; ++i) {
scanf("%d %d", &people[i].leftHand, &people[i].rightHand);
}
qsort(people + 1, n, sizeof(person), compare);
char tot[100001] = "";
creatBigNumber(tot, people[0].leftHand);
char max[100001] = "";
for (int i = 1; i <= n; ++i) {
char temp[100001] = "";
divideBignumber(temp, tot, people[i].rightHand);
if (compareBigNumber(temp, max) == 1) {
strcpy(max, temp);
}
multiplyBignumber(tot, people[i].leftHand);
}
printf("%s", max);
return 0;
}
double max(person *p1, person *p2) {
int num1 = p2->rightHand;
int num2 = p1->leftHand * p1->rightHand;
return (num1 > num2) ? (1.0 / (double)p1->rightHand) : ((double)p1->leftHand / (double)p2->rightHand);
}
int compare(const void *a, const void *b) {
person *person1 = (person *)a;
person *person2 = (person *)b;
double num1 = max(person1, person2);
double num2 = max(person2, person1);
return (num1 > num2);
}
void creatBigNumber(char *tot, int num) {
int index = 0;
while (num != 0) {
tot[index++] = num % 10 + '0';
num /= 10;
}
for (int i = 0; i <= (index - 1) / 2; ++i) {
char temp = tot[i];
tot[i] = tot[index - i - 1];
tot[index - i - 1] = temp;
}
}
int compareBigNumber(char *num1, char *num2) {
size_t len1 = strlen(num1);
size_t len2 = strlen(num2);
if (len1 > len2) {
return 1;
} else if (len1 < len2) {
return -1;
} else {
return (strcmp(num1, num2) > 0) ? 1 : -1;
}
}
void multiplyBignumber(char *num1, int num2) {
char temp[100001] = "";
int len = (int)strlen(num1);
int carry = 0, index = 0;
for (int i = len - 1; i >= 0; --i) {
int num = (num1[i] - '0') * num2 + carry;
temp[index++] = num % 10 + '0';
carry = num / 10;
}
while (carry != 0) {
temp[index++] = carry % 10 + '0';
carry /= 10;
}
for (int i = 0; i < index; ++i) {
num1[i] = temp[index - i - 1];
}
}
void divideBignumber(char *ans, char *num1, int num2) {
int temp = 0, index = 0, i = 0;
int length = (int)strlen(num1);
while (temp < num2 && i < length) {
temp = temp * 10 + (num1[i] - '0');
++i;
}
for (; i < length; ++i) {
if (temp < num2) {
ans[index++] = '0';
temp = temp * 10 + (num1[i] - '0');
} else {
ans[index++] = temp / num2 + '0';
temp = temp % num2 * 10 + (num1[i] - '0');
}
}
ans[index++] = temp / num2 + '0';
}