题目是这样的:n的阶乘定义为n!=123……n 如3!=6 n!通常最后会有很多0,如5!=120 最后有一个0,现在统计n!去除末尾的0后,最后k位是多少?
范围:1< =n< =1400000 1< =k< =10
我总是过不去。
以下是代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n,k,m;
char t;
long long s=1,p=1;
string str[100];
cin>>n>>k;
for(int i=1;i<=n;i++){
s=s*i;
while(s%10==0) s/=10;
s=s%10000000000;
}
for(int i=0;i<k;i++){
if(s){
str[i]=s%10+48;
s/=10;
}else str[i]='0';
}
for(int i=k-1;i>=0;i--) cout<<str[i];
cout<<endl;
return 0;
}
请帮忙看下
不知道你这个问题是否已经解决, 如果还没有解决的话:1 |
|
规定:
①、0!=1
②、1!=1
③、负数没有阶乘
上面的表达式我们先用for循环改写:
/**
* 0!=1 1!=1
* 负数没有阶乘,如果输入负数返回-1
* @param n
* @return
*/
public static int getFactorialFor(int n){
int temp = 1;
if(n >=0){
for(int i = 1 ; i <= n ; i++){
temp = temp*i;
}
}else{
return -1;
}
return temp;
}
如果求阶乘的表达式是这样的呢?
n! = n*(n-1)!
我们用递归来改写:
/**
* 0!=1 1!=1
* 负数没有阶乘,如果输入负数返回-1
* @param n
* @return
*/
public static int getFactorial(int n){
if(n >= 0){
if(n==0){
System.out.println(n+"!=1");
return 1;
}else{
System.out.println(n);
int temp = n*getFactorial(n-1);
System.out.println(n+"!="+temp);
return temp;
}
}
return -1;
}
我们调用该方法getFactorial(4);即求4!打印如下:
这段递归程序的边界条件就是n==0时,返回1,具体调用过程如下:
你看看是不是数据范围的原因,因为阶乘是一个特别特别大的数字,若是30的阶乘,long long 是存不下的,会溢出