【问题标题】:Write code to convert given number into words (eg 1234 as input should output one thousand two hundred and thirty four)编写代码将给定的数字转换为单词(例如 1234 作为输入应该输出 1234)
【发布时间】:2012-08-30 08:52:05
【问题描述】:

编写 C/C++/Java 代码将给定的数字转换为单词。

例如:- 输入: 第1234章

输出: 一千二百三十四。

输入: 10

输出: 十

对于数字 0 到 10 是否需要完整的开关盒。

在从 14 到 19 的每个数字名称后添加“teen”(例如:14:四个“teen”。)。

然后为 20 到 99 范围内的数字添加“ty”和数字名称。

等等。

我认为必须有更好的方法来解决这个问题。

C 代码是首选。

【问题讨论】:

  • 您需要在问题中提供更多详细信息:您要使用哪种语言来执行此操作?你都尝试了些什么?这是作业吗?
  • 在微软的采访中被问到过。
  • 阅读这篇文章以获得想法:accu.org/index.php/journals/1769

标签: c++ c data-structures logic


【解决方案1】:
#include<iostream>
using namespace std;
void expand(int);
int main()
{
    int num;
    cout<<"Enter a number : ";
    cin>>num;
    expand(num);
}
void expand(int value)
{
    const char * const ones[20] = {"zero", "one", "two", "three","four","five","six","seven",
    "eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen",
    "eighteen","nineteen"};
    const char * const tens[10] = {"", "ten", "twenty", "thirty","forty","fifty","sixty","seventy",
    "eighty","ninety"};

    if(value<0)
    {
        cout<<"minus ";
        expand(-value);
    }
    else if(value>=1000)
    {
        expand(value/1000);
        cout<<" thousand";
        if(value % 1000)
        {
            if(value % 1000 < 100)
            {
                cout << " and";
            }
            cout << " " ;
            expand(value % 1000);
        }
    }
    else if(value >= 100)
    {
        expand(value / 100);
        cout<<" hundred";
        if(value % 100)
        {
            cout << " and ";
            expand (value % 100);
        }
    }
    else if(value >= 20)
    {
        cout << tens[value / 10];
        if(value % 10)
        {
            cout << " ";
            expand(value % 10);
        }
    }
    else
    {
        cout<<ones[value];
    }
    return;
}

【讨论】:

  • @rgaut:作者忘记将"ten" 包含在他的ones[] 数组中。我更正了它,它现在似乎可以工作了。
【解决方案2】:

考虑使用由小值索引的字符串表,而不是 switch 语句。

const char * const ones[20] = {"zero", "one", "two", ..., "nineteen"};
const char * const tens[10] = {"", "ten", "twenty", ..., "ninety"};

现在将问题分解成小块。编写一个可以输出一位数的函数。然后编写一个可以处理两位数的函数(可能会使用前面的函数)。根据需要继续构建功能。

创建具有预期输出的测试用例列表,并编写代码来调用您的函数并检查输出,这样,当您为更复杂的情况解决问题时,您可以确保更简单的情况继续工作。

【讨论】:

    【解决方案3】:

    如果您对现成的解决方案感兴趣,那么您可以查看 HumanizerCpp 库 (https://github.com/trodevel/HumanizerCpp) - 它是 C# Humanizer 库的一个端口,它完全符合您的要求。

    它甚至可以转换为序数,目前支持 3 种语言:英语、德语和俄语。

    例子:

    const INumberToWordsConverter * e = Configurator::GetNumberToWordsConverter( "en" );
    
    std::cout << e->Convert( 123 ) << std::endl;
    std::cout << e->Convert( 1234 ) << std::endl;
    std::cout << e->Convert( 12345 ) << std::endl;
    std::cout << e->Convert( 123456 ) << std::endl;
    
    std::cout << std::endl;
    std::cout << e->ConvertToOrdinal( 1001 ) << std::endl;
    std::cout << e->ConvertToOrdinal( 1021 ) << std::endl;
    
    
    const INumberToWordsConverter * g = Configurator::GetNumberToWordsConverter( "de" );
    
    std::cout << std::endl;
    std::cout << g->Convert( 123456 ) << std::endl;
    
    const INumberToWordsConverter * r = Configurator::GetNumberToWordsConverter( "ru" );
    
    std::cout << r->ConvertToOrdinal( 1112 ) << std::endl;
    

    输出:

    one hundred and twenty-three
    one thousand two hundred and thirty-four
    twelve thousand three hundred and forty-five
    one hundred and twenty-three thousand four hundred and fifty-six
    
    thousand and first
    thousand and twenty-first
    
    einhundertdreiundzwanzigtausendvierhundertsechsundfünfzig
    одна тысяча сто двенадцатый
    

    在任何情况下,您都可以查看源代码并在项目中重用或尝试理解逻辑。它是用纯 C++ 编写的,没有外部库。

    问候, 塞尔吉

    【讨论】:

      【解决方案4】:
      /* This Program will convert Numbers from -999,999,999 to 999,999,999 into words */
      
      #include <vector>
      #include <iostream>
      #include <stdexcept>
      #include <string>
      
      using namespace std;
      
      const std::vector<std::string> first14 = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen" };
      const std::vector<std::string> prefixes = { "twen", "thir", "for", "fif", "six", "seven", "eigh", "nine" };
      
      std::string inttostr(const int number)
      {
          if (number < 0)
          {
              return "minus " + inttostr(-number);
          }
          if (number <= 14)
              return first14.at(number);
          if (number < 20)
              return prefixes.at(number - 12) + "teen";
          if (number < 100) {
              unsigned int remainder = number - (static_cast<int>(number / 10) * 10);
              return prefixes.at(number / 10 - 2) + (0 != remainder ? "ty " + inttostr(remainder) : "ty");
          }
          if (number < 1000) {
              unsigned int remainder = number - (static_cast<int>(number / 100) * 100);
              return first14.at(number / 100) + (0 != remainder ? " hundred " + inttostr(remainder) : " hundred");
          }
          if (number < 1000000) {
              unsigned int thousands = static_cast<int>(number / 1000);
              unsigned int remainder = number - (thousands * 1000);
              return inttostr(thousands) + (0 != remainder ? " thousand " + inttostr(remainder) : " thousand");
          }
          if (number < 1000000000) {
              unsigned int millions = static_cast<int>(number / 1000000);
              unsigned int remainder = number - (millions * 1000000);
              return inttostr(millions) + (0 != remainder ? " million " + inttostr(remainder) : " million");
          }
          throw std::out_of_range("inttostr() value too large");
      }
      
      int main()
      {
          int num;
          cout << "Enter a number to convert it into letters : ";
          cin >> num;
          cout << endl << num << " = " << inttostr(num) << endl;
          system("pause");
          return 0;
      }
      

      【讨论】:

      • 您好 IGI30,欢迎来到 Stack Overflow。不鼓励仅代码问题。请提供更多信息。
      【解决方案5】:

      适用于从 0999999999 的任何数字。

      这个程序从用户那里得到一个数字,把它分成三部分,分别存储在一个数组中。这三个数字通过将它们转换为单词的函数传递。 然后它在第一部分加上“百万”,在第二部分加上“千”。

      #include <iostream>
      using namespace std;
      int buffer = 0, partFunc[3] = {0, 0, 0}, part[3] = {0, 0, 0}, a, b, c, d;
      long input, nFake = 0;
      const char ones[][20] = {"",       "one",       "two",      "three",
                               "four",    "five",      "six",      "seven",
                               "eight",   "nine",      "ten",      "eleven",
                               "twelve",  "thirteen",  "fourteen", "fifteen",
                               "sixteen", "seventeen", "eighteen", "nineteen"};
      const char tens[][20] = {"",     "ten",   "twenty",  "thirty", "forty",
                               "fifty", "sixty", "seventy", "eighty", "ninety"};
      void convert(int funcVar);
      int main() {
        cout << "Enter the number:";
        cin >> input;
        nFake = input;
        buffer = 0;
        while (nFake) {
          part[buffer] = nFake % 1000;
          nFake /= 1000;
          buffer++;
        }
        if (buffer == 0) {
          cout << "Zero.";
        } else if (buffer == 1) {
          convert(part[0]);
        } else if (buffer == 2) {
          convert(part[1]);
          cout << " thousand,";
          convert(part[0]);
        } else {
          convert(part[2]);
          cout << " million,";
      
          if (part[1]) {
            convert(part[1]);
            cout << " thousand,";
          } else {
            cout << "";
          }
          convert(part[0]);
        }
        system("pause");
        return (0);
      }
      
      void convert(int funcVar) {
        buffer = 0;
        if (funcVar >= 100) {
          a = funcVar / 100;
          b = funcVar % 100;
          if (b)
            cout << " " << ones[a] << " hundred and";
          else
            cout << " " << ones[a] << " hundred ";
          if (b < 20)
            cout << " " << ones[b];
          else {
            c = b / 10;
            cout << " " << tens[c];
            d = b % 10;
            cout << " " << ones[d];
          }
        } else {
          b = funcVar;
          if (b < 20)
            cout << ones[b];
          else {
            c = b / 10;
            cout << tens[c];
            d = b % 10;
            cout << " " << ones[d];
          }
        }
      }
      

      【讨论】:

        【解决方案6】:
        #include<stdio.h>
        #include<conio.h>
        void main()
        {
        int len=0,revnum,i,dup=0,j=0,k=0;
        
         long int gvalue;
        
         char  ones[]  [10]={"one","Two","Three","Four","Five","Six","Seven","Eight","Nine","Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen",""};
        
         char twos[][10]={"Ten","Twenty","Thirty","Fourty","fifty","Sixty","Seventy","eighty","Ninety",""};
        
        clrscr();
        
        
         printf("\n Enter value"); 
        
         scanf("%ld",&gvalue);
         if(gvalue==10)
        
           printf("Ten");
        
         else if(gvalue==100)
        
           printf("Hundred");
        
         else if(gvalue==1000)
        
           printf("Thousand");
        
         dup=gvalue;
        
         for(i=0;dup>0;i++)
          {
           revnum=revnum*10+dup%10;
        
           len++;
        
           dup=dup/10;
        
          }
        
         while(j<len)
        
         {
        
         if(gvalue<10)
        
          {
        
           printf("%s ",ones[gvalue-1]);
        
           }
        
         else if(gvalue>10&&gvalue<=19)
        
          {
        
           printf("%s ",ones[gvalue-2]);
        
           break;
        
          }
        
         else if(gvalue>19&&gvalue<100)
        
          {
        
           k=gvalue/10;
        
           gvalue=gvalue%10;
        
            printf("%s ",twos[k-1]);
        
           }
        
          else if(gvalue>100&&gvalue<1000)
        
           {
        
            k=gvalue/100;
        
            gvalue=gvalue%100;
        
            printf("%s Hundred ",ones[k-1]);
        
             }
        
           else if(gvalue>=1000&&gvlaue<9999)
        
           {
        
            k=gvalue/1000;
        
            gvalue=gvalue%1000;
        
            printf("%s Thousand ",ones[k-1]);
        
            }
        
           else if(gvalue>=11000&&gvalue<=19000)
        
            {
        
            k=gvalue/1000;
        
            gvalue=gvalue%1000;
        
            printf("%s Thousand ",twos[k-2]);
        
            }
        
           else if(gvalue>=12000&&gvalue<100000)
        
           {
        
            k=gvalue/10000;
        
            gvalue=gvalue%10000;
        
            printf("%s ",ones[gvalue-1]);
        
           }
        
        else
        
        {
        
        printf("");
        
        }
        
         j++;
        
         getch();
        
        }
        

        【讨论】:

        • char ones[] [10]: 可能是 20 而不是 10?
        【解决方案7】:
        import java.lang.*;
        import java.io.*;
        public class rupee
        {
        public static void main(String[] args)throws  IOException
        {
        
        int len=0,revnum=0,i,dup=0,j=0,k=0;
        int gvalue;
         String[] ones={"one","Two","Three","Four","Five","Six","Seven","Eight","Nine","Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen",""};
        String[] twos={"Ten","Twenty","Thirty","Fourty","fifty","Sixty","Seventy","eighty","Ninety",""};
        System.out.println("\n Enter value");
        InputStreamReader b=new InputStreamReader(System.in);
        BufferedReader br=new BufferedReader(b);
        gvalue=Integer.parseInt(br.readLine());
        if(gvalue==10)
        
           System.out.println("Ten");
        
        else if(gvalue==100)
        
          System.out.println("Hundred");
        
        else if(gvalue==1000)
          System.out.println("Thousand");
        
        dup=gvalue;
        for(i=0;dup>0;i++)
        {
          revnum=revnum*10+dup%10;
          len++;
          dup=dup/10;
        }
        while(j<len)
        {
         if(gvalue<10)
         {
          System.out.println(ones[gvalue-1]);
         }
        else if(gvalue>10&&gvalue<=19)
         {
          System.out.println(ones[gvalue-2]);
          break;
         }
        else if(gvalue>19&&gvalue<100)
         {
           k=gvalue/10;
           gvalue=gvalue%10;
           System.out.println(twos[k-1]);
         }
        else if(gvalue>100&&gvalue<1000)
         {
           k=gvalue/100;
           gvalue=gvalue%100;
           System.out.println(ones[k-1] +"Hundred");
         }
        else if(gvalue>=1000&&gvalue<9999)
         {
           k=gvalue/1000;
           gvalue=gvalue%1000;
           System.out.println(ones[k-1]+"Thousand");
        }
        else if(gvalue>=11000&&gvalue<=19000)
         {
          k=gvalue/1000;
          gvalue=gvalue%1000;
          System.out.println(twos[k-2]+"Thousand");
         }      
        else if(gvalue>=12000&&gvalue<100000)
        {
         k=gvalue/10000;
             gvalue=gvalue%10000;
         System.out.println(ones[gvalue-1]);
        }
        else
        {
         System.out.println("");
            }
        j++;
        }
        }
        }
        

        【讨论】:

        • @kowsalyajaganathan 兄弟语言错误。
        【解决方案8】:
        /*Maximum value that can be entered is 2,147,483,647
         * Program to convert entered number into string
         * */
        import java.util.Scanner;
        
        public class NumberToWords 
        {
        
        public static void main(String[] args) 
        {
            double num;//for taking input number
            Scanner obj=new Scanner(System.in);
            do
            {
                System.out.println("\n\nEnter the Number (Maximum value that can be entered is 2,147,483,647)");
                num=obj.nextDouble();
                if(num<=2147483647)//checking if entered number exceeds maximum integer value
                {
                    int number=(int)num;//type casting double number to integer number
                    splitNumber(number);//calling splitNumber-it will split complete number in pairs of 3 digits
                }
                else
                    System.out.println("Enter smaller value");//asking user to enter a smaller value compared to 2,147,483,647
            }while(num>2147483647);
        }
        //function to split complete number into pair of 3 digits each
        public static void splitNumber(int number)
        {   //splitNumber array-contains the numbers in pair of 3 digits
            int splitNumber[]=new int[4],temp=number,i=0,index;
            //splitting number into pair of 3
            if(temp==0)
                System.out.println("zero");
            while(temp!=0)
            {
                splitNumber[i++]=temp%1000;
                temp/=1000;
            }
            //passing each pair of 3 digits to another function
            for(int j=i-1;j>-1;j--)
            {   //toWords function will split pair of 3 digits to separate digits
                if(splitNumber[j]!=0)
                    {toWords(splitNumber[j]);
                if(j==3)//if the number contained more than 9 digits
                    System.out.print("billion,");
                else if(j==2)//if the number contained more than 6 digits & less than 10 digits
                    System.out.print("million,");
                else if(j==1)
                    System.out.print("thousand,");//if the number contained more than 3 digits & less than 7 digits
                    }
                    }       
        }
        //function that splits number into individual digits
        public static void toWords(int number)
            //splitSmallNumber array contains individual digits of number passed to this function
        {   int splitSmallNumber[]=new int[3],i=0,j;
            int temp=number;//making temporary copy of the number
            //logic to split number into its constituent digits
        
            while(temp!=0)
            {
                splitSmallNumber[i++]=temp%10;
                temp/=10;
            }
            //printing words for each digit
            for(j=i-1;j>-1;j--)
              //{   if the digit is greater than zero
                if(splitSmallNumber[j]>=0)
                    //if the digit is at 3rd place or if digit is at (1st place with digit at 2nd place not equal to zero)
                {   if(j==2||(j==0 && (splitSmallNumber[1]!=1)))
                    {
                        switch(splitSmallNumber[j])
                        {
        
                            case 1:System.out.print("one ");break;
                            case 2:System.out.print("two ");break;
                            case 3:System.out.print("three ");break;
                            case 4:System.out.print("four ");break;
                            case 5:System.out.print("five ");break;
                            case 6:System.out.print("six ");break;
                            case 7:System.out.print("seven ");break;
                            case 8:System.out.print("eight ");break;
                            case 9:System.out.print("nine ");break;
        
                    }
        
                }
                //if digit is at 2nd place
                if(j==1)
                {       //if digit at 2nd place is 0 or 1
                        if(((splitSmallNumber[j]==0)||(splitSmallNumber[j]==1))&& splitSmallNumber[2]!=0 )
                        System.out.print("hundred ");
                    switch(splitSmallNumber[1])
                    {   case 1://if digit at 2nd place is 1 example-213
                                switch(splitSmallNumber[0])
                                {
                                case 1:System.out.print("eleven ");break;
                                case 2:System.out.print("twelve ");break;
                                case 3:System.out.print("thirteen ");break;
                                case 4:System.out.print("fourteen ");break;
                                case 5:System.out.print("fifteen ");break;
                                case 6:System.out.print("sixteen ");break;
                                case 7:System.out.print("seventeen ");break;
                                case 8:System.out.print("eighteen ");break;
                                case 9:System.out.print("nineteen ");break;
                                case 0:System.out.print("ten ");break;
                                }break;
                                //if digit at 2nd place is not 1
                            case 2:System.out.print("twenty ");break;
                            case 3:System.out.print("thirty ");break;
                            case 4:System.out.print("forty ");break;
                            case 5:System.out.print("fifty ");break;
                            case 6:System.out.print("sixty ");break;
                            case 7:System.out.print("seventy ");break;
                            case 8:System.out.print("eighty ");break;
                            case 9:System.out.print("ninety ");break;
                            //case 0:   System.out.println("hundred ");break;
        
                    }                           
                }           
            }
          }
        
        }
        

        【讨论】:

          猜你喜欢
          • 2012-07-26
          • 2015-07-27
          • 2017-09-28
          • 1970-01-01
          • 2020-01-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多