用英文单词模拟数学计算
读入两个小于100的正整数A和B,计算A+B。需要注意的是:A和B的每一位数字由对应的英文单词给出。
具体的输入输出格式规定如下:
输入格式:测试输入包含若干测试用例,每个测试用例占一行,格式为“A+B=",相邻两字符串有一个空格间隔。当A和B同时为zero时输入结束,相应的结果不要输出。
输出格式:对每个测试用例输出1行,即A+B的值。
输入样例:
one+ two =
three four +five six=
zero seven +eight nine =
zero + zero =
输出样例:
three
nine zero
nine six
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE (200)
char *array[] = {"zero", "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine"};
void procstr(char *string, int *left, int *right)
{
char words[50][MAXSIZE];
char c;
int i, num = 0, word = 0, j;
/*
*这部分的功能就是将字符串分解
* 输入为 one + two =
* 分解为:
* words[0] = "one"
* words[1] = "+"
* words[2] = "two"
* words[3] = "="
*/
for(i = 0; (c = string[i]) != '\0'; i++) {
if (c == ' ') {
if (word) {
strncpy(words[num-1], &string[i-word], word);
words[num-1][word] = '\0';
}
word = 0;
} else if (word == 0) {
word++;
num++;
} else {
word++;
}
}
if (word) {
strncpy(words[num-1], &string[i-word], word);
words[num-1][word] = '\0';
}
/*****************************************/
/*
* 这里的功能就是把
* + 左边的转换为整数放入 left 里面
* + 右边的转换为整数放入 right 里面
*/
*left = 0 , *right = 0;
int leftok = 0;
for(i = 0; i<num - 1; i++) {
if (strcmp(words[i], "+") == 0) {
leftok = 1;
} else {
for (j = 0; j < 10; j++) {
if (strcmp(words[i], array[j]) == 0) {
if (leftok == 1) {
*right = (*right) * 10 + j;
} else {
*left = (*left) * 10 + j;
}
}
}
}
}
}
/* 显示结果 */
void showRes(int res)
{
int stack[20], top = -1;
do {
stack[++top] = res % 10;
res /= 10;
} while (res != 0);
for (int i = top; i>=0; i--) {
if (i != 0) {
printf("%s ", array[stack[i]]);
} else {
printf("%s\n", array[stack[i]]);
}
}
}
int main()
{
char str[MAXSIZE] = {'\0'};
int left = 0, right = 0;int sum;
while(1) {
fgets(str, MAXSIZE - 1, stdin);
procstr(str, &left, &right);
if (left == 0 && right == 0) {
break;
} else {
showRes(left + right);
}
}
system("pause");
return 0;
}
#include <stdio.h>
#include <string.h>
char chNumber[10][10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
int fnStrToNum(char chNum[])
{
int i = 0;
for (i=0; i<10; i++)
{
if (0 == strcmp(chNum, chNumber[i]))
{
return i;
}
}
return 0;
}
int fnStrToInt(char chNum[][10], int n)
{
int i = 0;
int c = 0;
while (n--)
{
c *= 10;
c += fnStrToNum(chNum[i++]);
}
return c;
}
int fnIntToStr(char chNum[][10], int nNum)
{
int r = 0;
char chT[10];
if (nNum<10)
{
strcpy(chNum[0], chNumber[nNum]);
}
else
{
r = fnIntToStr(&chT, nNum/10);
strcpy(chNum[r], chT);
}
return r+1;
}
int main()
{
int i = 0;
int j = 0;
int k = 0;
char chA[2][10] = {0}, chB[2][10] = {0};
int iCount = 0;
int iOut[1000];
while (1)
{
scanf("%s%s", chA[0], chA[1]);
if (chA[1][0] == '+')
{
scanf("%s%s", chB[0], chB[1]);
if (chB[1][0] == '=')
{
iOut[iCount] = fnStrToNum(chA[0]) + fnStrToNum(chB[0]);
}
else
{
iOut[iCount] = fnStrToNum(chA[0]) + fnStrToInt(chB, 2);
}
}
else
{
scanf("%s%s", chB[0], chB[1]);
if (chB[1][0] == '=')
{
iOut[iCount] = fnStrToInt(chA, 2) + fnStrToNum(chB[0]);
}
else
{
iOut[iCount] = fnStrToInt(chA, 2) + fnStrToInt(chB, 2);
}
}
if (!iOut[iCount])
{
break;
}
iCount++;
}
char chC[3][10];
for (i=0; i<iCount; i++)
{
k = fnIntToStr(chC, iOut[i]);
for (j=0; j<k; j++)
{
printf("%s ", chC[j]);
}
printf("\n");
}
return 0;
}
经过测试,感谢采纳!
package offer;
import java.util.ArrayList;
import java.util.Scanner;
/*
*
题目描述:
读入两个小于100的正整数A和B,计算A+B.
需要注意的是:A和B的每一位数字由对应的英文单词给出.
输入:
测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =",相邻两字符串有一个空格间隔.当A和B同时为0时输入结束,相应的结果不要输出.
输出:
对每个测试用例输出1行,即A+B的值.
样例输入:
one + two =
three four + five six =
zero seven + eight nine =
zero + zero =
*/
public class AandB {
public static void main(String[] args) {
ArrayList<String> arr = new ArrayList<String>();
Scanner scan = new Scanner(System.in);
int arrSize=0;
String str=null;
for(int i=0;i<100;i++){
str=scan.nextLine();
if(str.equals("zero + zero =")){
break;
}
arr.add(str);
arrSize++;
}
//输出样例的结果
for(int i=0;i<arrSize;i++){
System.out.println(qie(arr.get(i)));
}
}
//将输入的字符串分割为多个单词
private static int qie(String str){
if(str.equals("zero + zero =")){
return 0;
}
str = str.replaceAll("=", "");
int a=0;
int b=0;
int begin=0;//截取子串的开始位置
int and=0; //用于记录+的位置
for(int i=0;i<str.length();i++){
if(str.charAt(i)=='+'){
and=i;
}
}
for(int i = 0;i<str.length();i++){
if(str.charAt(i)==' '){
int s1=change(str.substring(begin, i));
if(i<=and)
a=a*10+s1;
if(s1>=0&&i>and)
b=b*10+s1;
begin=i+1;
}
}
return a+b;
}
//用于将英文数字转换为阿拉伯数字
private static int change(String num){
if(num.equals("one")){
return 1;
}else if(num.equals("two")){
return 2;
}else if(num.equals("three")){
return 3;
}else if(num.equals("four")){
return 4;
}else if(num.equals("five")){
return 5;
}else if(num.equals("six")){
return 6;
}else if(num.equals("seven")){
return 7;
}else if(num.equals("eight")){
return 8;
}else if(num.equals("nine")){
return 9;
}else if(num.equals("zero")){
return 0;
}
return -1;
}
}
样例输入:
one + two =
three four + five six =
zero seven + eight nine =
zero + zero =
样例输出:
3
90
96
核心函数:数字转英文(1 -> one )
其他得非常简单,你写得出来。
/// <summary>
/// 数字转为英文字符串 不考虑负数
/// </summary>
/// <param name="number"></param>
/// <returns></returns>
public static string NumberToEnglishString(int number)
{
if (number < 0)
{
return "";
}
if (number < 20) //0到19
{
switch (number)
{
case 0:
return "zero";
case 1:
return "one";
case 2:
return "two";
case 3:
return "three";
case 4:
return "four";
case 5:
return "five";
case 6:
return "six";
case 7:
return "seven";
case 8:
return "eight";
case 9:
return "nine";
case 10:
return "ten";
case 11:
return "eleven";
case 12:
return "twelve";
case 13:
return "thirteen";
case 14:
return "fourteen";
case 15:
return "fifteen";
case 16:
return "sixteen";
case 17:
return "seventeen";
case 18:
return "eighteen";
case 19:
return "nineteen";
default:
return "";
}
}
if (number < 100) //20到99
{
if (number % 10 == 0) //20,30,40,...90的输出
{
switch (number)
{
case 20:
return "twenty";
case 30:
return "thirty";
case 40:
return "forty";
case 50:
return "fifty";
case 60:
return "sixty";
case 70:
return "seventy";
case 80:
return "eighty";
case 90:
return "ninety";
default:
return "";
}
}
else //21.22,....99 思路:26=20+6
{
return string.Format("{0} {1}", NumberToEnglishString(10 * (number / 10)),
NumberToEnglishString(number % 10));
}
}
if (number < 1000) //100到999 百级
{
if (number % 100 == 0)
{
return string.Format("{0} hundred", NumberToEnglishString(number / 100));
}
else
{
return string.Format("{0} hundred and {1}", NumberToEnglishString(number / 100),
NumberToEnglishString(number % 100));
}
}
if (number < 1000000) //1000到999999 千级
{
if (number % 1000 == 0)
{
return string.Format("{0} thousand", NumberToEnglishString(number / 1000));
}
else
{
return string.Format("{0} thousand and {1}", NumberToEnglishString(number / 1000),
NumberToEnglishString(number % 1000));
}
}
if (number < 1000000000) //1000 000到999 999 999 百万级
{
if (number % 1000 == 0)
{
return string.Format("{0} million", NumberToEnglishString(number / 1000000));
}
else
{
return string.Format("{0} million and {1}", NumberToEnglishString(number / 1000000),
NumberToEnglishString(number % 1000000));
}
}
if (number <= int.MaxValue) //十亿 级
{
if (number % 1000000000 == 0)
{
return string.Format("{0} billion", NumberToEnglishString(number / 1000000000));
}
else
{
return string.Format("{0} billion and {1}", NumberToEnglishString(number / 1000000000),
NumberToEnglishString(number % 1000000000));
}
}
return "";
}
#include<stdio.h>
#include<string.h>
char num[12][7]= { "zero", "one", "two", "three", "four","five", "six", "seven", "eight", "nine", "+", "=" };//定义字典
int change (char *input);//转换函数
int main ()
{
char input[7];//定义输入字符
while (1)
{
int a=0,b=0;//重置a b
while (scanf("%s", &input))//输入 挨个转换
{
if (change(input)==11)// 检测到=是完成输入
break;//推出输入
if (change(input)==10)//检测到+ 说明之前b的值是a的值
{
a = b;//b的值赋值给a
b = 0;//b重新开始赋值
}
else//吧a的值暂存在b中,当检测到+时 将b的值赋给a
{
b = b*10 + change(input);//b的赋值
}
}
if (a+b==0)//当两个数都为zero的时候 程序结束(由于没有负数)
break;
else
printf("%d\n", a+b);//结果输出
}
return 0;
}
int change (char *input)//转换函数
{
for (int i=0; i<12; i++)
{
if (strcmp(input,num[i])==0)//查找字典比对
return i;
}
}