PTA 520争霸赛 FGH题解

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组成三角形

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注