какой тип данных я должен использовать для хранения переменной 10 ^ 200 на языке C?

как обрабатывать целые числа, такие как 10 ^ 200 или больше, чем на языке C? это не сработает, даже если долго пользуюсь. тогда что мне делать? Я слышал о больших целых числах. но не знаю, как с этим работать. насколько я знаю, это библиотечная функция для C #. но я работаю с C. есть ли другой способ, кроме большого целого числа, работать с такими большими целыми числами? и может ли кто-нибудь объяснить мне, как использовать большое целое число?

Чтобы уточнить, я ищу только решение, которое будет работать на C.


person M Ashraful A    schedule 11.05.2014    source источник
comment
Обычно я использую libgmp.   -  person U2EF1    schedule 11.05.2014


Ответы (3)


См. аналогичный вопрос.

Короче говоря, встроенного типа нет, но есть библиотеки с открытым исходным кодом, обладающие такой возможностью: Boost.Multiprecision (Лицензия Boost) для C ++ и GMP для C. (двойная лицензия LGPL v3 / v2)

Если по какой-либо причине (например, несовместимость лицензий) вы не можете использовать эти библиотеки, здесь есть несколько советов, если вы собираетесь реализовать такую ​​функциональность самостоятельно.

person Denis Itskovich    schedule 11.05.2014

Вот как мы это делаем, используя целочисленные массивы (хотя лучше использовать символьные массивы). Я показал только сложение, операции отдыха, такие как сравнение, вычитание умножения, которые вы можете написать самостоятельно.

#include<stdio.h>
#include<stdlib.h>
#define len 500 // max size of those numbers you are dealing

int findlength(int num[])
{
        int i=0;
        while(num[i]==0)
            ++i;
        return (len-i);


}


void equal(int num[] ,int a[])
{
        int i;

        for(i=0;i<len;++i)
            num[i]=a[i];

        free(a);

}


void print(int num[],int l)
{
        int i;

        for(i=len-l;i<len;++i)
            printf("%d",num[i]);

        printf("\n");

}


int *add(int num1[] , int num2[] )
{
        int i,carry=0;
        int *a = malloc(sizeof(int)*len); // an dynamic answer array has to be created because an local array will be deleted as soon as control leaves the function

        for(i=0;i<len;++i)
            a[i]=0;

        for(i=len-1;i>=0;--i)
        {
            a[i]=num1[i]+num2[i]+carry;
            carry=a[i]/10;
            a[i]=a[i]%10;
        }

        return a;

}


void input_number(int num[])
{
        int i=0,temp[len],j;
        char ch;

        for(i=0;i<len;++i) // fill whole array by zero. helps in finding length
            num[i]=0;

        i=0;

        printf("Enter number : ");

        while((ch=getchar())!='\n')
                temp[i++]= ch-'0'; //Saving number from left to right

        //shifting whole number to right side, now numbers are stored as 00000012 , 00000345 etc...

        for(j=0;j<=i;++j)
             num[len-1-j]=temp[i-j-1];


}

int main()
{
        int num1[len],num2[len],num3[len]; // to save space Use character array of size len.Char is also numeric type. It can hold 0- 9

        input_number(num1); // this way you can input those numbers
        input_number(num2);

        int len1=findlength(num1),len2=findlength(num2); // Might be used in Many operations.

        equal(num3,add(num1,num2));// This way define add , or subtract or any other operation you wan to do but return pointer to answer array.
        //Use equal function to equate "num3 = answer array" by some implementation.

        print(num3,findlength(num3)); // to print the number.
        // create an header file of all these function implementations and use them wherever you like

        return 0;
}
person Number945    schedule 11.05.2014

Существует концепция арифметики произвольной точности, и существует множество библиотек, которые могут удовлетворить ваши требования, обычно эта библиотека обращается к арифметике произвольной точности с целыми числами или числами с плавающей запятой или с Fixed- точечная арифметика.

Вы можете найти множество решений для разных платформ, лицензий и языков, это зависит от того, что вы хотите делать в какой среде, но в целом вы найдете множество вариантов.

person user2485710    schedule 11.05.2014