Robb’s Problem | ||
[ Submit Code ] [ Top 20 Runs ] | ||
Acceteped : 48 | Submit : 335 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB | |
Description | ||
Robb’s Problem题目描述Robb想知道阶乘 n! 第 m 位数码是什么? 输入第一行是一个整数 输出每行输出一个样例的结果 样例输入3 5 1 5 2 5 3 样例输出0 2 1 | ||
Sample Input | ||
Sample Output | ||
Source | ||
[ Submit Code ] [ Top 20 Runs ] |
思路:大数处理,可以用二维数组,也可以用Java的BigInteger来处理。我用的是Java,因为方便、快捷。
AC代码如下:
import java.util.*;
import java.math.*;
public class Main{
final static int MAXN = 1005;
public static void main(String args[]){
Scanner in = new Scanner(System.in);
BigInteger fac[] = new BigInteger[MAXN];
String ans[] = new String[MAXN];
fac[0] = fac[1] = BigInteger.ONE;
for (int i=2; i<MAXN; ++i)
fac[i] = fac[i-1].multiply(BigInteger.valueOf(i));
for (int i=0; i<MAXN; ++i)
ans[i] = fac[i].toString();
int T = in.nextInt();
while (T-- != 0){
int n = in.nextInt();
int m = in.nextInt();
System.out.println(ans[n].charAt(ans[n].length()-m));
}
in.close();
}
}
添加一份C++代码吧!
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
vector<int> v[maxn];
int n, m;
int main(){
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
v[0].push_back(1);
for (int i=1; i<maxn; i++){
int t = 0;
for (int j=0; j<v[i-1].size(); j++){
t = v[i-1][j]*i+t;
v[i].push_back(t%10);
t /= 10;
}
while (t){
v[i].push_back(t%10);
t /= 10;
}
}
int T;
scanf("%d", &T);
while (T--){
scanf("%d%d", &n, &m);
printf("%d\n", v[n][m-1]);
//printf("%.2f\n", (double)clock()/CLOCKS_PER_SEC);
}
return 0;
}