yzsy25071621 @ 2023-03-18 12:28:24
这是为什么!我辛辛苦苦打了15分钟
#include <iostream>
using namespace std;
void multi(int);
int a[10001],n,x,l=1;
int main()
{
int s=0,t=0,m=0;
cin>>t;
for(int i=1; i<=t; i++)
{
s=0;
cin>>n>>m;
multi(n);
for(int j=1; j<=l; j++)
{
if(a[j]==m)
{
s++;
}
}
cout<<s<<endl;
}
return 0;
}
void multi(int n)
{
a[1]=1;
for(int i=1; i<=n; i++)
{
x=0;
for(int j=1; j<=l; j++)
{
a[j]=a[j]*i+x;
x=a[j]/10;
a[j]%=10;
if(x>0 && j>=l)
{
l++;
}
}
}
return;
}
by dingding2008 @ 2023-05-13 21:00:41
竟然没人回复!
你的代码有点奇怪,我这道题做出来了,我的思路是:定义一个数组大小为3010(我搜过)可以在输入的时候遍历1~n,每次乘起来,运算完清空,数组开头变为一,因为0乘任何数=0,最开始也要赋值为1,每一次运算完阶乘长度(len)设为一.
乘法高精度:
用一个len统计长度,for一遍,遍历每一个位置,由于是高精度乘低精度,所以高精度数组每一个位置都乘上低精度,最后处理进位:下一位加上当前的这一位/10,当前数位%10.while循环:如果末尾>=10,末尾的下一位+=当前位%/10.当前位%=10;长度++;
by dingding2008 @ 2023-05-13 21:01:07
如果还不懂,可以私信我