问题 B: N! 普拉斯
时间限制: 1 Sec 内存限制: 128 MB
提交: 114 解决: 35
[提交] [状态] [讨论版] [命题人:admin]
题目描述
在处理阶乘时也需要借助计算器。
在计算机中,数字是通过像01像素矩阵来显示的,最终的显示效果如下:
宝儿姐一直在思考一个问题,N!末尾究竟有多少个0?我们假设N!末尾有k个0,请按照规则打印k。
输入
输入一个正整数n(n< 50) ,输入以EOF结尾。
输出
我们假设N!末尾有k个0,请按照规则打印k,数字之间间隔3列0。
样例输入
2
样例输出
01110
10001
10011
10101
11001
10001
01110
大致思路:
1、拿上一题的三维字符数组来用,定义也是一致的!
2、看清题意,尾零的个数不超过两位数,其实!可以直接特判输出!
3、要求输出时,数字之间间隔3列0,别忘了!
4、n不大,可以每次把尾零截出来,然后仅保留后十七位——或许不对吧!2333
题解:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<vector>
#include<algorithm>
#define ll long long
using namespace std;
#define N 100 char s1[];
int sum[];
vector<int>order; char num[][][]={
{"","","","","",
"",""},
{"","","","","",
"",""},
{"","","","","",
"",""},
{"","","","","",
"",""},
{"","","","","",
"",""},
{"","","","","",
"",""},
{"","","","","",
"",""},
{"","","","","",
"",""},
{"","","","","",
"",""},
{"","","","","",
"",""},
{"","","","","",
"",""}}; void paint( ) //绘制01字符串!
{
for(int i=;i<=;i++){
for(int j=(int)order.size()-;j>=;j--){
int x=order[j];
printf("%s",num[x][i]);
if(j>)
printf("%s",num[][i]);
}
cout<<endl;
}
} int cul(int n){
int len=;
sum[]=;
for(int i=;i<=n;i++){
for(int j=;j<len;j++){
sum[j]*=i;
}
int j=;
while(j<len){
if(sum[j]>=){
sum[j+]+=sum[j]/;
sum[j]%=;
if(j+>=len)
len++;
}
j++;
}
}
return len;
} int main()
{
int n;
while(scanf("%d",&n)!=EOF){ memset(sum,,sizeof(sum));
int len3=cul(n); //计算n的阶乘! /* for(int i=0;i<len3;i++){
printf("%d",sum[i]);
}
cout<<"*****"<<endl;
*/
int i=;
while(sum[i]==) //计算开头的零的数量!!
i++; order.clear();
if(i==)
order.push_back();
while(i>){
order.push_back(i%);
i/=;
} paint();
} return ;
}
(暴力模拟题,一定要耐住性子,不急不躁,稳住才能AC)