专栏文章
题解:P1591 阶乘数码
P1591题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miotaww9
- 此快照首次捕获于
- 2025/12/03 00:48 3 个月前
- 此快照最后确认于
- 2025/12/03 00:48 3 个月前
思考
我们不难发现是高精度问题(我可不会告诉你标签上面也有)
高精度的步骤很简单,首先定义一个数组存放数字,然后输入,接着呢循环,把每组数据输入,把数字数组赋零,然后用高精度算法算一遍阶乘,再进位。最后消除前导零,算算个数就可以输出了。
既然算法已经明确,就可以开始抄代码了。
不对,让我们一起来看代码部分吧!
代码实现
有注释版
CPP#include<bits/stdc++.h>
using namespace std;//万能头文件
#define int long long
const int N = 3005 ; //定义c数组大小
int c[N] , a , n , t ;//定义 a ,n ,t
signed main(){
cin >> t ; //输入数据数
while ( t-- ){
int cnt = 0 ; //个数和
cin >> n >> a ; //输入每组数据
memset( c , 0 , sizeof( c ) ) ; //c数组赋0
c[1] = 1 ;
for ( int i = 2 ; i <= n ; i++ ){
for ( int j = 1 ; j < N ; j++ ) c[j] *= i ; //小学乘法qwq
for ( int j = 1 ; j < N ; j++ ){
if ( c[j] >= 10 ){
c[j+1] += c[j] / 10 ;
c[j] %= 10 ; //小学学的满十进一qwq
}
}
} //重点高精度部分!!!
int p = N - 1 ;
while ( c[p] == 0 && p > 0 ) p-- ; //消除前导0
if ( p == 0 ){
cout << 0 ;
continue ; //如果木有,直接输出0
}
for ( int j = p ; j >= 1 ; j-- ){
if ( c[j] == a ) cnt++ ; //判断是否等于a
}
cout << cnt << endl ; //输出次数并换行
}
return 0; //好习惯的养成
}
无注释版
CPP#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3005 ;
int c[N] , a , n , t ;
signed main(){
cin >> t ;
while ( t-- ){
int cnt = 0 ;
cin >> n >> a ;
memset( c , 0 , sizeof( c ) ) ;
c[1] = 1 ;
for ( int i = 2 ; i <= n ; i++ ){
for ( int j = 1 ; j < N ; j++ ) c[j] *= i ;
for ( int j = 1 ; j < N ; j++ ){
if ( c[j] >= 10 ){
c[j+1] += c[j] / 10 ;
c[j] %= 10 ;
}
}
}
int p = N - 1 ;
while ( c[p] == 0 && p > 0 ) p-- ;
if ( p == 0 ){
cout << 0 ;
continue ;
}
for ( int j = p ; j >= 1 ; j-- ){
if ( c[j] == a ) cnt++ ;
}
cout << cnt << endl ;
}
return 0;
}
结尾
这题目纯粹考察高精度以及阶乘的掌握情况,其实不难。
写题解不易,请点个赞加关注吧 !
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...