以下是问题:
比较以索引形式写的两个数字,如2 ^ 11和3 ^ 7并不困难,因为任何计算器都会确认2 ^ 11 = 2048 <3 ^ 7 = 2187。
然而,确认632382 ^ 518061> 519432 ^ 525806会更加困难,因为这两个数字都包含超过三百万个数字。
你有N个基本指数对,每个都形成一个大数,你必须找到它们的第K个最小数。 K是1索引的。
输入格式 第一行包含整数N,基数指数对。其次是N行,每行有两个空格分隔的整数B和E,代表基数和指数。 最后一行包含整数K,其中K <= N. 约束 1≤N≤105 1≤K≤N 1≤B≤109 1≤E≤109 没有两个数字相等。
这是我的代码:
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int N,i = 0,k,j=0,x,m;
long long int *arr,*arr2,*arr3;
cin >> N;
arr = (long long int *)malloc(sizeof(long long int)*2*N);
arr2 = (long long int *)calloc(N,sizeof(long long int));
arr3 = (long long int *)calloc(N,sizeof(long long int));
x = 2*N;
while(x>0)
{
cin >> arr[i];
i++;
x--;
}
cin >> k;
for(i=0;i<2*N;i+=2)
{
arr2[j] = pow(arr[i],arr[i+1]);
j++;
}
arr3 = arr2;
sort(arr2,arr2+N);
for(i=0;i<N;i++)
{
if(arr3[i] == arr2[k-1])
{
m = i;
break;
}
}
cout << arr[2*m] << " " << arr[2*m + 1];
return 0;
}
该程序仅适用于小数字,不能使其适用于大数字。该怎么办?
答案 0 :(得分:4)
也许你在大数字上产生溢出。您可以考虑使用多精度算术库,例如https://gmplib.org/。我自己还没有使用过这个图书馆。
查看这篇文章How to detect integer overflow?,了解如何检测整数溢出。
答案 1 :(得分:3)
从您选择的long long int
类型中我猜您计算了数字的a^b
以便对它们进行排序,从而导致数字非常大并且可能导致溢出。
请注意,为了对数字进行排序,不需要进行此计算,因为要知道a^b > d^c
是否足以检查log(a^b) > log(c^d)
,因此b*log(a) > d*log(c)
。
最好使用结构或类为这个大数字创建数据结构。
这是它的代码:
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
struct BigNumber{
int base;
int exponent;
};
int Compare(BigNumber x, BigNumber y);
void Sort(BigNumber* arr, int N);
int main() {
int N,i = 0,k;
BigNumber *numbers;
cout<<"\nEnter N:";
cin >> N;
numbers = (BigNumber *)calloc(N,sizeof(BigNumber));
for(i=0; i<N; i++)
{
cout<<"\nEnter base and exponent for number "<<i<<":";
cin >> numbers[i].base>>numbers[i].exponent;
}
cout<<"\nEnter K:";
cin >> k;
Sort(numbers,N);
cout << "Kth number is :" << numbers[k].base << "^" << numbers[k].exponent;
return 0;
}
void Sort(BigNumber* arr, int N){
for(int i=0; i< N; i++ ){
for(int j=0; j< N; j++){
if(Compare(arr[i], arr[j])<0){
BigNumber temp = arr[j];
arr[j] = arr[i];
arr[i] = arr[j];
}
}
}
}
int Compare(BigNumber x, BigNumber y){
double X = x.exponent * log10(x.base);
double Y = y.exponent * log10(x.base);
return X == Y? 0: X > Y ? 1: -1;
}
答案 2 :(得分:0)
我稍微更改了代码。我遇到的唯一问题是我在计算指数而不是比较指数的对数。
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int N,i = 0,k,j=0,x,m;
int *arr;
double *arr2,*arr3;
cin >> N;
arr = (int *)malloc(sizeof(int)*2*N);
arr2 = (double *)calloc(N,sizeof(double));
arr3 = (double *)calloc(N,sizeof(double));
x = 2*N;
while(x>0)
{
cin >> arr[i];
i++;
x--;
}
cin >> k;
for(i=0;i<2*N;i+=2)
{
arr2[j] = arr[i+1]*log10(arr[i]);
j++;
}
for (i = 0; i < N; i++) {
arr3[i] = arr2[i];
}
sort(arr2,arr2+N);
for(i=0;i<N;i++)
{
if(arr3[i] == arr2[k-1])
{
m = i;
break;
}
}
cout << arr[2*m] << " " << arr[2*m + 1];
return 0;
}