首先,强调\(:\)这是一道充满爱的题目!!!
从题目名字就可以看出,Love Calculator
\(\Rightarrow\)爱的计算(◦˘ ³(♡ŐωŐ♡
咳咳,闲扯到此为止,开始正题\(……\)
题目大意:给出两个人的名字,即两个字符串,其中每个字母分别对应\(1\sim 26\),忽略字母以外字符,先对两个字符串按对应位字母的数值求和,在对这个和求一个数根,两个名字的数根的比值即为两个名字爱的结果,需要注意的是这个结果需要转成百分数形式且小于\(100\)%。
关于数根,如果您不知道,蒟蒻在这里给出百度百科的定义\(:\)
数根(又称数字根,数字的根Digital root)是自然数的一种性质,换句话说,每个自然数都有一个数根。
将一正整数的各个位数相加(即横向相加)后,若加完后的值大于等于10的话,则继续将各位数进行横向相加直到其值小于十为止所得到的数,即为数根。换句话说,数根是将一数字重复做其数字之和,直到其值小于十为止,则所得的值为该数的数根。例如54817的数根为7,因为5+4+8+1+7=25,25大于10则再加一次,2+5=7,7小于十,则7为54817的数根。
-----------------来源于百度百科
好了,既然你已经知道了数根的定义,那么我们显然可以发现,一个自然数的数根可以很简单的求出。
那么我们用\(map\)将\(52\)个字母\((\)含大小写\()\)映射成\(1\sim 26\),然后直接大力模拟即可。
同样,一定要注意的输入输出格式!!!
code;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
using std::map;
map<char, int>rhs;
char man[26], woman[26];
int main() {
for (int i = 65; i <= 90; i++) rhs[char(i)] = i - 64;
for (int i = 97; i <= 122; i++) rhs[char(i)] = i - 96; // 映射过程 map大法吼啊!!!
while (gets(man) && gets(woman)) {
int love_of_man = 0, love_of_woman = 0; // 自认为很清新的变量名
for (int i = 0; i < strlen(man); i++) love_of_man += rhs[man[i]];
for (int i = 0; i < strlen(woman); i++) love_of_woman += rhs[woman[i]];
while (love_of_man >= 10) {
int temp = 0;
while (love_of_man) temp += love_of_man % 10, love_of_man /=10;
love_of_man = temp;
} // 求数根
while (love_of_woman >= 10) {
int temp = 0;
while (love_of_woman) temp += love_of_woman % 10, love_of_woman /=10;
love_of_woman = temp;
} //同上
double ans = (double)love_of_man / (double)love_of_woman; // 强制类型转换
if (ans > 1.0) ans = 1.0 / ans; // 注意到结果要小于100%
printf("%.2lf %%\n", ans * 100);
}
return 0;
}
完结撒花(✪ω✪)