[算法练习] 英语数字转换器

题目说明:

在这个问题中,将用英语给你一个或多个整数。你的任务是将这些数字转换成整型表示。数字范围从-999,999,999到999,999,999.下面是你的程序必须考虑的详尽的英语单词表:

negative, zero, one, two, three, four,five, six, seven, eight, nine, ten, eleven, twelve, thirteen, fourteen,fifteen, sixteen, seventeen, eighteen, nineteen, twenty, thirty, forty, fifty,sixty, seventy, eighty, ninety, hundred, thousand, million

Input

输入包括多个样例,注意:

1.负数前面有词negative

2.当能用thousand的时候,将不用hundred。例如1500将写为"one thousand five hundred",而不是"fifteen hundred".

输入将以一个空行结束

Output
输出将是每一个单独一行,每一个后面一个换行符

程序代码:

#include <gtest/gtest.h>
#include <iostream>
#include <string>

using namespace std;

enum TOKEN_TYPE
{
    TYPE_NUMBER,
    TYPE_UNIT,
    TYPE_NEGATIVE
};

struct Token
{
    string        StringValue;
    int            Value;
    TOKEN_TYPE    Type;
};

Token sTokenTable[] =
{
    {"zero",        0, TYPE_NUMBER},
    {"one",            1, TYPE_NUMBER},
    {"two",            2, TYPE_NUMBER},
    {"three",        3, TYPE_NUMBER},
    {"four",        4, TYPE_NUMBER},
    {"five",        5, TYPE_NUMBER},
    {"six",            6, TYPE_NUMBER},
    {"seven",        7, TYPE_NUMBER},
    {"eight",        8, TYPE_NUMBER},
    {"nine",        9, TYPE_NUMBER},
    {"ten",            10, TYPE_NUMBER},
    {"eleven",        11, TYPE_NUMBER},
    {"twelve",        12, TYPE_NUMBER},
    {"thirteen",    13, TYPE_NUMBER},
    {"fourteen",    14, TYPE_NUMBER},
    {"fifteen",        15, TYPE_NUMBER},
    {"sixteen",        16, TYPE_NUMBER},
    {"seventeen",    17, TYPE_NUMBER},
    {"eighteen",    18, TYPE_NUMBER},
    {"nineteen",    19, TYPE_NUMBER},
    {"twenty",        20, TYPE_NUMBER},
    {"thirty",        30, TYPE_NUMBER},
    {"forty",        40, TYPE_NUMBER},
    {"fifty",        50, TYPE_NUMBER},
    {"sixty",        60, TYPE_NUMBER},
    {"seventy",        70, TYPE_NUMBER},
    {"eighty",        80, TYPE_NUMBER},
    {"ninety",        90, TYPE_NUMBER},
    {"hundred",        100, TYPE_UNIT},
    {"thousand",    1000, TYPE_UNIT},
    {"million",        1000000, TYPE_UNIT},
    {"negative",    -1, TYPE_NEGATIVE}
};

bool GetPreToken(const string& value, int& pos, Token& nextToken)
{
    bool bRetValue = false;
    pos = value.find_last_not_of(" ", pos);
    if (pos == string::npos)
    {
        return false;
    }

    string tokenStr;
    string::size_type next = value.rfind(" ", pos);
    if (next != string::npos)
    {
        tokenStr = value.substr(next+1, pos-next);
    }
    else
    {
        tokenStr = value.substr(0, pos+1);
    }

    for (int i=0; i<sizeof(sTokenTable)/sizeof(sTokenTable[0]); ++i)
    {
        if (tokenStr.compare(sTokenTable[i].StringValue)==0)
        {
            nextToken.Type = sTokenTable[i].Type;
            nextToken.Value = sTokenTable[i].Value;

            bRetValue = true;
            pos = next;
            break;
        }
    }

    return bRetValue;
}

long Parse(const string& value)
{
    long lResult = 0;
    int nNegatvie = 1;
    int nPos = string::npos;
    Token NextToken;
    int CurrentUnitValue = 1;    

    while (GetPreToken(value, nPos, NextToken))
    {
        switch (NextToken.Type)
        {
        case TYPE_NEGATIVE:
            nNegatvie = -1;
            break;

        case TYPE_NUMBER:
            lResult += NextToken.Value * CurrentUnitValue;
            break;

        case TYPE_UNIT:

            if (NextToken.Value >= CurrentUnitValue)
            {
                CurrentUnitValue = NextToken.Value;
            }
            else
            {
                CurrentUnitValue *= NextToken.Value;
            }
            break;
        }

        if (nPos == string::npos)
        {
            break;
        }
    }

    lResult *= nNegatvie;

    return lResult;
}

int main2()
{
    char input[512];
    cin.getline(input,512);
    string value(input);
    while (!value.empty())
    {
        cout << Parse(value) << endl;
        cin.getline(input, 512);
        value = input;
    }

    return 0;
}

// http://dsalgo.openjudge.cn/201409week4/1/?lang=zh_CN

// Test Case
// zero
// six
// negative seven hundred twenty nine
// one million one hundred one
// eight hundred fourteen thousand twenty two
// eight thousand fourteen hundred  twenty two

TEST(BaiLian, tEnglishNumberTranslator)
{
    //main2();

    ASSERT_EQ(Parse("zero"), 0);
    ASSERT_EQ(Parse("six"), 6);
    ASSERT_EQ(Parse("negative seven hundred twenty nine"), -729);
    ASSERT_EQ(Parse("one million one hundred one"), 1000101);
    ASSERT_EQ(Parse("eight hundred fourteen thousand twenty two"), 814022);
    ASSERT_EQ(Parse("one"), 1);
    ASSERT_EQ(Parse("two"), 2);
    ASSERT_EQ(Parse("three"), 3);
    ASSERT_EQ(Parse("four"), 4);
    ASSERT_EQ(Parse("five"), 5);
    ASSERT_EQ(Parse("seven"), 7);
    ASSERT_EQ(Parse("eight"), 8);
    ASSERT_EQ(Parse("nine"), 9);
    ASSERT_EQ(Parse("ten"), 10);
    ASSERT_EQ(Parse("eleven"), 11);
    ASSERT_EQ(Parse("twelve"), 12);
    ASSERT_EQ(Parse("thirteen"), 13);
    ASSERT_EQ(Parse("fourteen"), 14);
    ASSERT_EQ(Parse("fifteen"), 15);
    ASSERT_EQ(Parse("sixteen"), 16);
    ASSERT_EQ(Parse("seventeen"), 17);
    ASSERT_EQ(Parse("eighteen"), 18);
    ASSERT_EQ(Parse("nineteen"), 19);
    ASSERT_EQ(Parse("twenty"), 20);
    ASSERT_EQ(Parse("thirty"), 30);
    ASSERT_EQ(Parse("forty one"), 41);
    ASSERT_EQ(Parse("fifty"), 50);
    ASSERT_EQ(Parse("sixty"), 60);
    ASSERT_EQ(Parse("seventy seven"), 77);
    ASSERT_EQ(Parse("eighty"), 80);
    ASSERT_EQ(Parse("ninety"), 90);
    ASSERT_EQ(Parse("one hundred three"), 103);
    ASSERT_EQ(Parse("negative one hundred twenty three million four hundred fifty six thousand seven hundred eighty"), -123456780);
    ASSERT_EQ(Parse("one hundred twenty three million four hundred fifty six thousand seven hundred eighty"), 123456780);
    ASSERT_EQ(Parse("nine hundred ninety nine million nine hundred ninety nine thousand nine hundred ninety nine"), 999999999);
    ASSERT_EQ(Parse("negative nine hundred ninety nine million nine hundred ninety nine thousand nine hundred ninety nine"), -999999999);
}
时间: 2024-08-29 18:57:25

[算法练习] 英语数字转换器的相关文章

答读者问(15):一位在校大二学生有关算法和英语学习的疑问

一位在校的大二学生朋友给我发邮件.内容例如以下: 您好.我是名在校的大二学生,我已经非常认真地看完您写的文章.心有感触.我有些问题想请教您! 1.从事软件开发对须要具备如何的编程技能?如今我总觉得算法是比較难.有些算法一点都不理解,感觉在这方面非常困难.由于暑假一直想自学算法的,但学了几天,实在是学不下去了.您能给我点建议如何学习算法吗? 2.在软件开发的过程中.算法是自己写的还是网上有源码???那假设是网上抄代码.还须要理解得多透彻???? 3.英语是否要考6级才好就业,英语对计算机行业有什么

SVM之SMO算法(转)

支持向量机(Support Vector Machine)-----SVM之SMO算法(转) 此文转自两篇博文 有修改 序列最小优化算法(英语:Sequential minimal optimization, SMO)是一种用于解决支持向量机训练过程中所产生优化问题的算法.SMO由微软研究院的约翰·普莱特(John Platt)发明于1998年,目前被广泛使用于SVM的训练过程中,并在通行的SVM库libsvm中得到实现. 1998年,SMO算法发表在SVM研究领域内引起了轰动,因为先前可用的S

加密散列算法——MD5

引用wiki的定义,散列函数(或散列算法,英语:Hash Function)是一种从任何一种数据中创建小的数字"指纹"的方法.该函数将数据打乱混合,重新创建一个叫做散列值的指纹.散列值通常用来代表一个短的随机字母和数字组成的字符串.好的散列函数在输入域中很少出现散列冲突.在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到.(具体专业术语请自行度娘) MD5是单向散列算法的一种,全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD

算法在计算中的作用

算法是任何一段定义好的步骤,它把一些值或者值域作为输入,处理后把某个值或者值域作为输出,而算法就是把输入转换成输出的一系列计算步骤. 我们也可把算法看成解决具体计算问题的工具.通常描述问题的语句指定需要的输入/输出之间的关系.而算法描述了具体的计算步骤来构建输入/输出之间的关系. 举个例子,我们需要把一系列数字以非递减的顺序排列.该问题在实际中频繁出现,成为许多标准设计技巧和分析工具的肥沃土壤.以下是排序问题的正式定义: .输入:n个数列:a1,a2,...,an. .输出:序列(a1',a2'

电子书 算法导论.pdf

有关算法的书中,有一些叙述非常严谨,但不够全面:另一些涉及了大量的题材,但又缺乏严谨性.<算法导论(原书第3版)/计算机科学丛书>将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受.全书各章自成体系,可以作为独立的学习单元:算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂:说明和解释力求浅显易懂,不失深度和数学严谨性. <算法导论(原书第3版)/计算机科学丛书>全书选材经典.内容丰富.结构合理.逻辑清晰,对本科生的数据结构课

#研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案

郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档适用人员:技术人员 提纲: 所谓异常流量 如何识别异常流量 Apriori如何工作 如何让 Nginx 拦截可疑 IP 0x00,所谓异常流量 有害的异常流量大概分为以下几种: 僵尸网络中的节点对主站发起无目的的密集访问: 黑客.白帽子或某些安全公司为了做漏洞扫描,对主站各个 Web 工程发起字典式

算法理论基础

算法:一个计算过程,解决问题的方法.算法是独立存在的一种解决问题的方法和思想. 算法的五大特性 输入: 算法具有0个或多个输入 输出: 算法至少有1个或多个输出 有穷性: 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成 确定性:算法中的每一步都有确定的含义,不会出现二义性 可行性:算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成 时间复杂度是用来估计算法运行时间的一个式子(单位). 时间复杂度:假设存在函数g,使得算法A处理规模为n的问题示例所

数据结构与算法 - 排序与搜索

排序与搜索 排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定顺序进行排列的一种算法. 1.冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大(升序),就

算法导论.pdf

下载地址:网盘下载 内容简介  · · · · · · 在有关算法的书中,有一些叙述非常严谨,但不够全面:另一些涉及了大量的题材,但又缺乏严谨性.本书将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受.全书各章自成体系,可以作为独立的学习单元:算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂:说明和解释力求浅显易懂,不失深度和数学严谨性. 全书选材经典.内容丰富.结构合理.逻辑清晰,对本科生的数据结构课程和研究生的算法课程都是非常实用的教