【问题标题】:Calculating the first and last k digits in n^n [closed]计算 n^n 中的第一个和最后一个 k 位 [关闭]
【发布时间】:2012-09-08 08:28:33
【问题描述】:

我需要在

中打印第一个 k 数字和最后一个 k 数字

n^n (n to the power of n, where n is an integer) 例如:


Input       Output

n k         First k digits       Last k digits

4 2    -->  25                   56
9 3    -->  387                  489

我感觉它需要一些聪明的数学,但是我想不出任何这样的东西。请提出解决问题的方法。

【问题讨论】:

  • 这是你的作业。你应该考虑自己做这项工作。
  • 我也会先质疑约束。 n^n 是否足够大以至于无法完全计算,以至于您必须找到另一种聪明的方法?
  • 其实这不是功课。我只是想解决一些有趣的问题。但我陷入了困境。这就是我问的原因,也是如何处理它的原因。
  • 您用“作业”标记了您的问题。不过还是不错的尝试 ;-)
  • 只有当你要求 n^n 的中间 k 位数字时,这可能会很有趣,因为 n 足够大。

标签: java c algorithm math


【解决方案1】:

最后k个数字很简单,你只需要计算它modulo 10^k。为此,在每次乘法之后,只需应用模数,即。 intermediate_result %= 10^k.

当然,您需要使用其他方法来计算10^k,因为^ 并不表示C 或Java 中的幂。

要查找前 k 位,请参阅 first n digits of an exponentiation

【讨论】:

    【解决方案2】:

    感谢大家的帮助。我的最终代码是


    #include <stdio.h>
    #include <math.h>
    
    long int lastKdigits(long long n,int k)
    {
    long long i,res=1,div=pow(10,k);
    
    for(i=1;i<=n;i++)
    {
        res=(res*n)%div;
    }
    
    return res;
    }
    
    long int firstKdigits(long long n,int k)
    {
       long double x, y;
    
       x = n*log10(n);
       y = floor(pow(10,x-floor(x) +k-1));
       return ((int)y);
    }
    
    int main()
    {
    
    long long n;
    int k;
    
    scanf("%lld %d",&n,&k);
    
    printf("%ld\t",firstKdigits(n,k));
    printf("%ld\n",lastKdigits(n,k));
    }
    
    return 0;
    

    }

    【讨论】:

      【解决方案3】:

      对于最后一个 k 数字,您只需要计算 n^n (mod 10^k) 非常简单,但我不知道其他 k 数字的任何解决方案!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-08
        • 1970-01-01
        • 2019-04-27
        • 2012-10-20
        • 2021-03-04
        • 2014-06-23
        • 2012-12-28
        相关资源
        最近更新 更多