无法在C ++中增加程序中的数字范围

时间:2015-08-11 12:36:04

标签: c++ algorithm

以下是问题:

比较以索引形式写的两个数字,如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;
}

该程序仅适用于小数字,不能使其适用于大数字。该怎么办?

3 个答案:

答案 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;
}