洛谷 P1898 缘分计算
题目描述
缘分是一个外国人难以理解的中文名词。大致说来,缘分是一种冥冥中将两人(通常是情人)结合的力量。仅管这是种迷信,很多人——特别是女生——喜欢去计算它。
不幸的是,644 也是这样。有天,她问 DL:“甜心,可以算一下我们的缘分吗?”唉, DL 真的很讨厌这问题,但他无法拒绝。还好, DL 是个程序设计师,所以他只要找到一个看来不错的算法并写成一个缘分计算器就可以了。在网络上搜寻了几个小时后,他决定采用以下的缘分算法:
第一步: 取出姓名的缩写(abbreviation)并接在一起。例如,如果这对恋人叫 Jiang Yun Fan 和 Tang Yu Rou,他们的缩写就是 JYFTYR。第二步: 将每个字母用数字字符串取代。用 ST 来取代 A, ST+1 来取代 B, ST+2 来取代 C,……, ST+25 来取代 Z,其中 ST 为一个已知的正整数。例如,如果ST=81,A 就被 81 取代,B 就被 82 取代,……,Z 则被 106 取代。上面的例子JYFTYR 则被 901058610010598 取代。
第三步:重复以下操作:将相邻的两位数相加,并写下和的个位数。不难发现这个操作每进行一次,这个数字字符串就会少一位数。当这个数字变成 100 或不超过两位数(第一位是 0 也算两位数)时,这个程序便停止。所得的数字就是两人的缘分。用上面的例子来说,处理的过程如下:
901058610010598
91153471011547
0268718112691
…… 374 01
所以如果 ST=81,Jiang Yun Fan 和 Tang Yu Rou 的缘分便只有 1。
惨了! DL 很了解 644。他知道即使这个程序计算出的缘分高达 99 她仍然会不高兴。更何况 644 还对其余很多对恋人间的缘分感兴趣,要是他一个个计算会太繁琐。如果告诉你一对恋人的姓名和一个 ST 值,你能编一个程序算出他们的缘分吗?
输入输出格式
输入格式:
输入文件名为 calcYF.in。
第一行包含一个仅含大写字母且长度为 L 的字符串。
第二行包含一个正整数 ST,含义如题目所述。
输出格式:
输出文件名为 calcYF.out。
仅一行,包含一个整数,表示两人的缘分。
输入输出样例
说明
【数据范围】
对于 100%的数据,4 ≤ L ≤ 10,1 ≤ ST ≤ 10000。
【NOTICE】
Don't be sad if the result of you and your sweetie is not 100. That's no big deal.
思路:模拟。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char s[11]; int st,pos,flag; int bns[100]; int num[1000],tmp[10000]; int main(){ scanf("%s",s); scanf("%d",&st); int len=strlen(s); for(int i=0;i<len;i++) num[i+1]=s[i]-'A'+st; for(int i=1;i<=len;i++){ int tot=0; while(num[i]){ bns[++tot]=num[i]%10; num[i]/=10; } for(int i=tot;i>=1;i--) tmp[++pos]=bns[i]; } while(1){ if(pos<=2) break; if(pos==3&&tmp[1]==1&&tmp[2]==0&&tmp[3]==0) break; for(int i=1;i<pos;i++) num[i]=(tmp[i]+tmp[i+1])%10; for(int i=1;i<pos;i++) tmp[i]=num[i]; pos--; } for(int i=1;i<=pos;i++) if(tmp[i]!=0){ flag=1; for(int j=i;j<=pos;j++) cout<<tmp[j]; break; } if(!flag) cout<<"0"; }