初学者不太看得懂程序

 用英文单词模拟数学计算

读入两个小于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 "";
 }

img


#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;
    }
}