专栏文章

题解: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 条评论,欢迎与作者交流。

正在加载评论...