链接:https://www.nowcoder.net/acm/contest/75#question
来源:牛客网
本场A了6题,题目的题型都是比较经典的,A,E题的代码感觉以后会用到就记录下。
其他提交代码:https://www.nowcoder.net/acm/contest/75#submit/{"searchUserName"%3A"sdau20163942"}
E | 进击吧!阶乘 |
题目描述
给定一个整数N(0≤N≤10000),求取N的阶乘
输入描述:
多个测试数据,每个测试数据输入一个数N
输出描述:
每组用一行输出N的阶乘
#include<map>
#include<vector>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
#define M 10001
const ll x=(ll)1e9;
ll c,re[M];
int main()
{
int n,len,i,j;
while(scanf("%d",&n)!=EOF)
{
len=0;
re[0]=1;
for(i=2;i<=n;i++)
{
c=0;
for(j=0;j<=len;j++)
{
re[j]=re[j]*i+c;
c=re[j]/x;
re[j]=re[j]%x;
}
if(c>0)
re[++len]=c;
}
printf("%lld",re[len]);
for(i=len-1;i>=0;i--)
printf("%09lld",re[i]);
printf("\n");
}
return 0;
}
代码(JAVA):
import java.math.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
int i,n;
BigInteger ans=null;
BigInteger t=null;
while(cin.hasNextInt())
{
n=cin.nextInt();
if(n==0)
System.out.println(1);
else
{
ans=BigInteger.valueOf(1);
for(i=2;i<=n;i++)
{
t=BigInteger.valueOf(i);
ans=ans.multiply(t);
}
System.out.println(ans);
}
}
cin.close();
}
}
A | 不凡的夫夫 |
题目描述
夫夫有一天对一个数有多少位数感兴趣,但是他又不想跟凡夫俗子一样,
所以他想知道给一个整数n,求n!的在8进制下的位数是多少位。
所以他想知道给一个整数n,求n!的在8进制下的位数是多少位。
输入描述:
第一行是一个整数t(0<t<=1000000)(表示t组数据) 接下来t行,每一行有一个整数n(0<=n<=10000000)
输出描述:
输出n!在8进制下的位数。
斯特林公式是是一条用来取n的阶乘的近似值的数学公式:n!≈sqrt(2*π*n)*((n/e)^n)
又有求k进制位数的公式:len=(int)logk(n)+1;答案就是len=(int)log8(n!)+1;
又有换底公式:log a (b)=log c (b)/log c (a)
得:len=(int)(log 10 (sqrt(2*π*n)*((n/e)^n))/log 10 (8))+1;
代码:
#include<map>
#include<vector>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define maxn 100010
using namespace std;
typedef long long ll;
const double E=exp(1);
const double PI=acos(-1);
ll n;
int main(){
int t;
scanf("%d",&t);
while(t--)
{
double ans;
scanf("%lld",&n);
if(n==0)
ans=0;
else
ans=(log10(sqrt(2.0*PI*n))+n*(log10(n)-log10(E)))/log10(8.0);
printf("%lld\n",(ll)ans+1);
}
return 0;
}