2012-09-08 116 views
2

我需要打印的第一k數字和最後k位數計算第一和最後的K位數n的n次方


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 

我覺得它需要一些聰明的數學,但是我無法想到任何事情。請提出解決問題的方法。

+2

這是你的功課。你應該考慮自己做這個工作。 – tamasgal

+0

另外我會首先質疑約束條件。是否足夠大,不能直接計算,你必須找到另一種聰明的方式? – fayyazkl

+1

其實這不是功課。我只是試圖解決一些問題的樂趣。但我陷入了困境。這就是爲什麼我問,而這也是如何處理它。 – OneMoreError

回答

7

最後k個數字很容易,你只需要計算它modulo 10^k。要做到這一點,在每次乘法之後,應用模數,即。 intermediate_result %= 10^k

當然,您需要使用其他方法計算10^k,因爲^並不意味着在C或Java中的強大功能。

要查找前k個數字,請參見first n digits of an exponentiation

3

去年k數字這是很容易,你只需要計算n^n (mod 10^k),但我不知道另一個基爾希納diggits任何解決方案!

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; 

}