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