一道模拟题

问题:把英文单词表示的数字转换为阿拉伯数字,要求数字不超过整形范围,数字形如abc,def,hrg。

第一行表示有几组数据,第二行输入英文。

输出:相应的阿拉伯数字。

例如:input:

3

eleven

one hundred and
two

output:

11

102

分析:要注意百万和千要断位,还有要从高位往低位查找,注意分情况讨论。


  1 #include <iostream>
2 #include <cstring>
3 using namespace std;
4 struct data
5 {
6 string num;
7 int val;
8 } a[100];
9 int main()
10 {
11 int i,j,l;
12 string str[20];
13 string s[20] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen","nineteen"};
14 string p[10] = { " " ," ","twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty","ninety"} ;
15 for(i= 0; i < 20; i++)
16 {
17 a[i].num = s[i];
18 a[i].val = i;
19 }
20 int k=2;
21 for(i = 20 ; i<=27; i++,k++)
22 {
23
24 a[i].num= p[k];
25 a[i].val = k*10;
26 }
27 a[28].val=100;
28 a[28].num="hundred";
29 a[29].val=1000;
30 a[29].num="thousand";
31 a[30].val=1000000;
32 a[30].num="million";
33 /*for(i=0;i<=30;i++)
34 {
35 cout<<a[i].num<<" ";
36 cout<<a[i].val<<endl;
37 }*/
38 int t;
39 cin>>t;
40 while(t--)
41 {
42 int sum1=0;
43 for(i = 0; ; i++)
44 {
45 cin>>str[i];
46 if(cin.get() == ‘\n‘) break;
47 }
48 int mark1 = 0,mark2 = 0;
49 int sum2 = 0,sum3 = 0;
50 //int mark3 = 0,mark4 = 0;
51 for(j = 0; j <= i; j++)
52 {
53 if(str[j] == "million") mark1 = j;
54 if(str[j] == "thousand") mark2 = j;
55 }
56 if(mark1!=0&&mark2!=0)
57 {
58 for(j=0; j<=mark1; j++)
59 {
60 for(int k=0; k<=30; k++)
61 {
62
63 if(str[j]==a[k].num && k < 28) sum1+=a[k].val;
64 else if(str[j]==a[k].num && k >=28) sum1 *= a[k].val;
65 }
66 }
67 for(j=mark1 + 1; j<=mark2; j++)
68 {
69 for(int k=0; k<=30; k++)
70 {
71
72 if(str[j]==a[k].num && k < 28) sum2+=a[k].val;
73 else if(str[j]==a[k].num && k >=28) sum2 *= a[k].val;
74 }
75 }
76
77 for(j=mark2 + 1; j<=i; j++)
78 {
79 for(int k=0; k<=30; k++)
80 {
81
82 if(str[j]==a[k].num && k < 28) sum3+=a[k].val;
83 else if(str[j]==a[k].num && k >=28) sum3 *= a[k].val;
84 }
85 }
86 cout<<sum1+sum2+sum3<<endl;
87 }
88 else if(mark1!=0&&mark2==0)
89 {
90 for(j=0; j<=mark1; j++)
91 {
92 for(int k=0; k<=30; k++)
93 {
94
95 if(str[j]==a[k].num && k < 28) sum1+=a[k].val;
96 else if(str[j]==a[k].num && k >=28) sum1 *= a[k].val;
97 }
98 }
99 for(j=mark1 + 1; j<=i; j++)
100 {
101 for(int k=0; k<=30; k++)
102 {
103
104 if(str[j]==a[k].num && k < 28) sum3+=a[k].val;
105 else if(str[j]==a[k].num && k >=28) sum3 *= a[k].val;
106 }
107 }
108 cout<<sum1+sum3<<endl;
109 }
110 else if(mark1==0&&mark2!=0)
111 {
112 for(j=0; j<=mark2; j++)
113 {
114 for(int k=0; k<=30; k++)
115 {
116
117 if(str[j]==a[k].num && k < 28) sum2+=a[k].val;
118 else if(str[j]==a[k].num && k >=28) sum2 *= a[k].val;
119 }
120 }
121
122 for(j=mark2 + 1; j<=i; j++)
123 {
124 for(int k=0; k<=30; k++)
125 {
126
127 if(str[j]==a[k].num && k < 28) sum3+=a[k].val;
128 else if(str[j]==a[k].num && k >=28) sum3 *= a[k].val;
129 }
130 }
131 cout<<sum3+sum2<<endl;
132 }
133 else if(mark1==0&&mark2==0)
134 {
135 for(j=0; j<=i; j++)
136 {
137 for(int k=0; k<=30; k++)
138 {
139
140 if(str[j]==a[k].num && k < 28) sum3+=a[k].val;
141 else if(str[j]==a[k].num && k >=28) sum3 *= a[k].val;
142 }
143 }
144 cout<<sum3<<endl;
145 }
146 }
147 return 0;
148 }

一道模拟题,布布扣,bubuko.com

时间: 05-01

一道模拟题的相关文章

TOJ1290 Poker Hands 模拟题

寒假期间抽空做的一道模拟题 难度不算大,把每种牌型分开处理,可以合并的步骤考虑合并. 代码比较丑陋,首次尝试Sport Programming的风格,结果搞了个不伦不类(手动笑哭) 1 #include <algorithm> 2 #include <bitset> 3 #include <cctype> 4 #include <complex> 5 #include <cstdio> 6 #include <cstring> 7 #

FZU Problem 2034 Password table (简单模拟题)

这种简单题做了好长时间,我是不是有点逗? 地址:http://acm.fzu.edu.cn/problem.php?pid=2034 不解释了,自己看吧,练手的好题 上个代码吧 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #include <stdio.h> #include <string.h> #include <stdlib.h>

POJ 1008 简单模拟题

e.... 虽然这是一道灰常简单的模拟题.但是米做的时候没有读懂第二个日历的计时方法.然后捏.敲完之后华丽的WA了进一个点.坑点就在一年的最后一天你是该输出本年的.e ...但是我好想并没有..看discuss里好想被坑的人还不少.总天数能直接整除260的时候.年数要减1. 不喜欢做模拟.....5555.... 附代码: #include<stdio.h>#include<string.h>#include<iostream>#include<string>

HDU 4028 The time of a day STL 模拟题

暴力出奇迹.. #include<stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; #define ll __int64 #define N 42 ll n,m,ans;

cf428c 模拟题

这题说的是给了 n个数然后又 k次 的交换任意位置的 数字的机会  计算最长的连续子序列的和 这要撸  模拟整个 过程 并不能就是算最长的递增序列 如果只是 找最长的 和序列的 话 会存在 很多问题 在替换的时候 每一个决策 都影响着 下一个决策  这样 存在谁与谁替换 这样的状态有 200!种    那就枚举每个区间这样就可以使得 我们所用替换方法得当  因为在替换中我们进行替换是对不同区间的 操作 比如 在替换序列之内的 数字的时候 其实操作的就是不同的区间 与外面的序列进行替换的时候 操作

每天一道Java题[11]

题目 synchronized怎么实现线程同步?请修改<每天一道Java题[10]>中的MyRunnableThread类以解决三个线程都获取到10的问题. 解答 方法一: 采用synchronized关键字包裹需要保证线程安全的代码块,来实现线程同步.语法格式为: Synchronized(expression){ //需同步的代码 } <每天一道Java题[10]>中的MyRunnableThread类修改为: package me.huangzijian; public cl

每天一道Java题[3]

问题 为什么在重写equals()方法的同时,必须重写hashCode()方法? 解答 在<每天一道Java题[2]>中,已经对hashCode()能否判断两个对象是否相等做出了解释.equals()方法与hashCode()方法的关系如下: 如果两个对象的hashCode()返回值不一样,则equals()返回的结果必为false. 如果两个对象的hashCode()返回值一样的时候,equals()返回的结果未知. 如果两个对象的equals()返回的结果为true,则两个对象的hashC

hdu 5641 King&#39;s Phone(暴力模拟题)

Problem Description In a military parade, the King sees lots of new things, including an Andriod Phone. He becomes interested in the pattern lock screen. The pattern interface is a 3×3 square lattice, the three points in the first line are labeled as

【noip模拟题】迎接仪式(dp+特殊的技巧)

好神的一题... 这是一道DP题,本题的难点在于状态的确定,由于调整是任意的,很难划分状态,我们略微修改一下调整的形式:把一次’j’和’z’交换看做两次变换:’j’->’z’;’z’->’j’ (zz交换和jj交换是没有意义的,不作考虑);于是最多’j’->'z' 'z'->'j'各K次. F[i,j,k]:=F[i-2,j-x,k-y]+1;If A[i-1]=j then x=0 else x=1If A[i]=z then y=0 else y=1 然后最后要看是否有那么多个