这道题用到的是高精度*低精度的计算,简单来说就是将高精度这个数和相乘后的结果这个数都存储到int[]数组中。
可以观看视频:高精乘低精_哔哩哔哩_bilibili
举个例子:100*99
注意一定要有判断len的大小(相乘可能会超过初始len值)和去掉前导0
#include<bits/stdc++.h>
using namespace std;
int n,b;
int res[10000];//结果存储在res中
int a[10000];
void multiple(int temp,int& len){ //a的每一位和temp相乘--->res中
for(int i=0;i<len;i++){
res[i]+=a[i]*temp;
if(res[i]>=10){
res[i+1]+=res[i]/10;
res[i]%=10;
}
}
//判断len的大小
while(res[len]){
if(res[len]>=10){
res[len+1]+=res[len]/10;
res[len]%=10;
}
len++;
}
//去掉前导0
while(res[len-1]==0 && len>1){
len--;
}
}
int main( )
{
cin>>n>>b;
int cnt=0;//结果
a[0]=1;
int len=1;//将1作为第一个乘数(1*2*3*...n)存储在a中,
//与后续的结果相乘的结果放到res中,再把res中的数导入a中,依次循环
for(int i=1;i<=n;i++){
multiple(i,len);
memset(a,0,sizeof(a));
memcpy(a,res,sizeof(res));
memset(res,0,sizeof(res));
}
for(int i=len-1;i>=0;i--){
if(a[i]==b){
cnt++;
}
}
cout<<cnt;
return 0;
}