UVA10424 【Love Calculator】

首先,强调\(:\)这是一道充满爱的题目!!!

从题目名字就可以看出,Love Calculator\(\Rightarrow\)爱的计算(◦˘ ³(♡ŐωŐ♡


咳咳,闲扯到此为止,开始正题\(……\)

题目大意:给出两个人的名字,即两个字符串,其中每个字母分别对应\(1\sim 26\),忽略字母以外字符,先对两个字符串按对应位字母的数值求和,在对这个和求一个数根,两个名字的数根的比值即为两个名字爱的结果,需要注意的是这个结果需要转成百分数形式且小于\(100\)%。

P.s.:如果您把您和您的爱豆的名字按题意计算出的结果很低,请不要信以为真QwQ

关于数根,如果您不知道,蒟蒻在这里给出百度百科的定义\(:\)

数根(又称数字根,数字的根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;
}

完结撒花(✪ω✪)

posted @ 2019-10-25 14:53  Hydrogen_Helium  阅读(132)  评论(0编辑  收藏  举报