【问题标题】:How to solve 100^1000 in C? [closed]如何在 C 中解决 100^1000? [关闭]
【发布时间】:2014-10-11 21:22:08
【问题描述】:

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

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

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

约束:

1

1

1

示例输入(明文链接)

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 在不使用任何库的情况下是不可能的,我只需要避免这种情况,但是如何?

【问题讨论】:

  • 这里有真正的问题吗?这似乎更像是一场编码比赛。
  • @HotLicks 是的,但是比赛已经结束,我的提交无效,所以这就是我问这个问题的原因?

标签: c algorithm logic


【解决方案1】:

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

您需要选择一个 big integer(也称为 big number)库来帮助您管理任意大的数字。

试试libGMP,它被广泛使用。

【讨论】:

    【解决方案2】:

    一般来说,当您谈论大数时,您有 3 个主要选项:

    1)使用处理大数字的

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

    3) 寻找一种数学方法

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

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

    在处理大数时考虑对数及其properties

    例如,您的特定案例可以写成以下形式:

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

    您知道第一部分 (10^2000) 只会添加一些零 => 它不会影响您的结果(总和)。因此,您可以尝试将这些大数字分成两部分(不影响总和的部分和对总和有用的部分 - 1)。

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

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

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

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

    【讨论】:

    • 那么我如何将它转换成程序或逻辑在我上面的c程序中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    相关资源
    最近更新 更多