如何在C中解决100 ^ 1000?

时间:2014-10-11 21:22:08

标签: c algorithm logic

此问题来自Hacker Earth网站,如下所示

输入:第一行包含t,测试用例数。在那之后,每行包含一对空格分隔的整数,即a和b。

输出:对于每个测试用例,您需要在^ b中打印数字总和。

约束:

1·; = T< = 20000

1·; = A LT; = 100

1·; = b将= 1000

样本输入(明文链接)

5
2 10
3 3
5 2
2 7
100 1000

样本输出(明文链接)

7
9
7
11
1

说明:考虑第一个测试用例。              2 ^ 10 = 1024

         Now, 1 + 0 + 2 + 4 = 7
         So, output for this test case is 7.

现在我已按如下方式解决了这个问题:

#include<stdio.h>

#define test_max 20000
#define a_max 100
#define b_max 10000
long int power(int,int);
long int check_num(int,int);
int main()
{
    int t;
    long int i,rem,j=0,sum=0;
    long int pr;


scanf("%d",&t);
int a[t],b[t];

    for(i=0;i<t;i++)
    {
        scanf("%d",&a[i]);
        scanf("%d",&b[i]);

        if(a[i]>a_max||a[i]<=0||b[i]>b_max||b[i]<=0)
        {
        //  printf("Please Check the Enter number limitation");

            exit(0);
        }

    }

    for(i=0;i<t;i++)
    {
        int check=0;

        check=check_num(a[i],b[i]);
         if(check==0)
         {
            pr=power(a[i],b[i]);
            //printf("%d\t%d\t%ld\t",a[i],b[i],pr);
            while(pr!=0)
            {
            rem=pr%10;
            sum=sum+rem;
            pr=pr/10;
            }
            printf("%d\n",sum);
            sum=0;
        }
        else if(check==1)
        {
            printf("1\n");

        }
    }

return 0;

}

long int check_num(int a,int b)
{
    if(a==100||a==10||a==1) return 1;
    else return 0;

}

long int power(int n,int p)
{

    int i;
    long int num=n;
    for(i=1;i<p;i++)
    {
       num=num*n;

    }
    return num;

}

但这不是一个完美的答案。有谁能告诉我如何解决这个问题?

此问题的链接位于:HERE

我知道100^1000如果不使用任何库都是不可能的,我只需要避免这种情况,但是如何?

2 个答案:

答案 0 :(得分:0)

100^1000数字太大,无法容纳long或任何其他基本数字类型。

您需要选择大整数(也称为大数)库,以帮助您管理大数字。

尝试libGMP,它被广泛使用。

答案 1 :(得分:0)

一般来说,当你谈论大数字时,你有3个主要选择:

1)使用操纵大数字的

2)为大数字实现自己的功能(使用数组来存储数字 - 长度将等于数字位数)

3)查找数学方法

我将为3 rd 方法添加一些细节,因为1 st 和2 nd 并不是很复杂。

如果您只需要这些数字的总和,请尽量避免计算这个大数字。

在使用大数字时,请考虑对数及其properties

例如,您的特定案例可以采用以下形式编写:

100^1000 = (10^2)^1000 = 10^(2*1000) * 1 = 10^2000 + 0 = 10^2000 * 1

你知道第一部分(10^2000)只添加了一些零=&gt;它不会影响你的结果(总和)。因此,您可以尝试将这两个大数字分成两部分(一部分不影响总和,另一部分是总和 - 1)。

如何使用对数来解决更普遍的问题?以下观察可以概括上面提到的事情:

a^x = 10^lg(a^x) = 10^(x*lg(a))
where lg = log in base 10

然后,您可以将您的号码写为:10^c * k10^c + k10^c - k等,具体取决于您的号码。

这个解释只是为了指导,给你一个品味。但这个想法是一样的:在尝试其他方法之前,先考虑一些基于某些属性的数学解决方案。