PTA 520争霸赛 FGH题解
7-6 随机输一次
https://pintia.cn/problem-sets/1259839299727368192/problems/1259850789826048003
给出一个数字序列以及一组玩“剪子石头布”的动作,依次在数字序列中每赢相应场次就输一场。按照这个规则,输出 “剪子石头布” 相应的动作。
分析:
将给出的”场次序列”保存在顺序表,用一个整数表示顺序表中的位置,即当前应当应相应的数量后输一次。并保存一个当前赢的场次,如果当前赢的场次恰等于场次序列当前的值,那么就出输的动作,并将赢的场次置为0,同时场次序列的位置移到下一个,否则输出赢的动作并赢的场次自增1。直到输入数据为”End”结束。
[TABS_R id=1673]
7-7 阶乘的非零尾数
问题描述:要计算数字( 最大为(\( 10^7 \) )阶乘末位有多少个0的同时,还要计算非0的后K位( \( 0 \lt K \lt 10 \) )数字.
分析:
末位最多只要10位,可以模仿大数乘法(用数组模拟大数。这里是int类型和大数的乘法,比大数之间相乘容易),保存阶乘的最后非0的MAXN位(保险起见要将MAXN设定为17以上),输出其低K位即可。
而求阶乘后有几个0,只需要看它能被5整除几次,其原因这里不再赘述。
#include <cstdio>
#include <cstring>
#define MAXN 17
int analogInt[MAXN];
void multi(int x)
{
int i;
for(i=0;i<MAXN;i++)
{
analogInt[i]*=x;
}
for(i=1;i<MAXN;i++)
{
if(notZero[i-1]>9)
{
analogInt[i]+=analogInt[i-1]/10;
analogInt[i-1]=analogInt[i-1]%10;
}
}
while(analogInt[0]==0)
{
for(i=1;i<MAXN;i++)
{
analogInt[i-1]=analogInt[i];
}
}
}
void outputDigits(int digits)
{
int i;
for(i=digits-1;i>=0;i--)
{
printf("%d",analogInt[i]);
}
printf(" ");
}
int main(void)
{
int i,a,k;
memset(analogInt,0,MAXN);
analogInt[0]=1;
scanf("%d%d",&a,&k);
for(i=1;i<=a;i++)
{
multi(i);
}
outputDigits(k);
long long c=0;
while(a>0)
{
c+=a/5;
a/=5;
}
printf("%lld\n",c);
return 0;
}
7-8 三足鼎立
问题描述:给出一个数字K,以及一个序列,在序列中能找到多少对数字可与K组成三角形