PTA 520争霸赛 FGH题解

PTA 520争霸赛 FGH题解

7-6 随机输一次

https://pintia.cn/problem-sets/1259839299727368192/problems/1259850789826048003

给出一个数字序列以及一组玩“剪子石头布”的动作,依次在数字序列中每赢相应场次就输一场。按照这个规则,输出 “剪子石头布” 相应的动作。

分析:

将给出的”场次序列”保存在顺序表,用一个整数表示顺序表中的位置,即当前应当应相应的数量后输一次。并保存一个当前赢的场次,如果当前赢的场次恰等于场次序列当前的值,那么就出输的动作,并将赢的场次置为0,同时场次序列的位置移到下一个,否则输出赢的动作并赢的场次自增1。直到输入数据为”End”结束。

Rnd = list(map(int,input().split()))
N=Rnd[0]
Rnd = Rnd[1:]

def winAct(a1):
    ops = ["ChuiZi","Bu","JianDao","ChuiZi"]
    return ops[ops.index(a1)+1]

def lostAct(a1):
    ops = ["ChuiZi","JianDao","Bu","ChuiZi"]
    return ops[ops.index(a1)+1]

winCounter = 0
lostPtr = 0
while True:
    try:
        act = input()
    
    except:
        break
    if act=="End":
        break

    if winCounter==Rnd[lostPtr%N]:
        print(lostAct(act))
        lostPtr +=1
        winCounter=0
    else:
        print(winAct(act))
        winCounter+=1
 
 
using System;
using System.Collections.Generic;



namespace Main
{
    class Program
    {
        static string KaTi(string hand)
        {
            var actSeries = new List();
            actSeries.Add("ChuiZi");
            actSeries.Add("Bu");
            actSeries.Add("JianDao");
            actSeries.Add("ChuiZi");
            return actSeries[actSeries.IndexOf(hand) + 1];
        }
        static string MaKe(string hand)
        {
            var actSeries = new List();
            actSeries.Add("ChuiZi");
            actSeries.Add("JianDao");
            actSeries.Add("Bu");
            actSeries.Add("ChuiZi");
            return actSeries[actSeries.IndexOf(hand) + 1];
        }

        static void Main(string[] args)
        {
            List winRound = new List();
            var myWinSeries = Console.ReadLine().Split(' ');
            foreach(var it in myWinSeries)
            {
                winRound.Add(Convert.ToInt32(it));
            }
            var N = winRound[0];
            winRound.RemoveAt(0);
            var idx = 0;
            var wins = 0;
            while(true)
            {
                string hand = "";
                try
                {
                    hand = Console.ReadLine();
                }
                catch
                {
                    break;
                }
                if(hand=="End")
                {
                    break;
                }
                if(wins==winRound[idx%N])
                {
                    Console.WriteLine(MaKe(hand));
                    idx += 1;
                    wins = 0;
                }
                else
                {
                    Console.WriteLine(KaTi(hand));
                    wins += 1;
                }

            }
            
            
        }

   
        
    }
}
 

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

发表评论

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