C++ 将数字转换为文本,C++;

C++ 将数字转换为文本,C++;,c++,arrays,switch-statement,C++,Arrays,Switch Statement,对于输入的数字,比如232,我希望能够以文本形式写出数字:232。我有一个数组来保存这些数字 Array[0] = 2, Array[1] = 3, Array[2] = 2. 我写了一封信 switch statement 它会看到数字并将其打印为文本,例如二百零三二。我不知道如何将“三”动态转换为“三十”。假设我有更多的数字要拼,比如452232。你不能独立处理数字,就这么简单 例如,21的文本是“二十”和“一”的串联,但11的文本不是“十”和“一”的串联 而且,“1001”不会变成“一

对于输入的数字,比如232,我希望能够以文本形式写出数字:232。我有一个数组来保存这些数字

Array[0] = 2, Array[1] = 3, Array[2] = 2.
我写了一封信

switch statement

它会看到数字并将其打印为文本,例如二百零三二。我不知道如何将“三”动态转换为“三十”。假设我有更多的数字要拼,比如452232。

你不能独立处理数字,就这么简单

例如,
21
的文本是“二十”和“一”的串联,但
11
的文本不是“十”和“一”的串联

而且,“1001”不会变成“一千零一百零一”


您可以使用函数调用来降低逻辑复杂度,但是您需要逻辑来同时查看多个数字。

请考虑数字

的位置。 就你而言

如果3位于位置1:
数组[1]=3,则不能“三十”

如果3位于位置2:
数组[2]=3,则不能“三百”

等,考虑非标准情况,如十一或一百零一等等。 退房。这可能是你想要的

如果链接断开,则直接从维基百科复制。
如果要编写改进的解决方案,一定要先查看链接

#include <string>
#include <iostream>
using std::string;

const char* smallNumbers[] = {
  "zero", "one", "two", "three", "four", "five",
  "six", "seven", "eight", "nine", "ten",
  "eleven", "twelve", "thirteen", "fourteen", "fifteen",
  "sixteen", "seventeen", "eighteen", "nineteen"
};

string spellHundreds(unsigned n) {
  string res;
  if (n > 99) {
    res = smallNumbers[n/100];
    res += " hundred";
    n %= 100;
    if (n) res += " and ";
  }
  if (n >= 20) {
    static const char* Decades[] = {
      "", "", "twenty", "thirty", "forty",
      "fifty", "sixty", "seventy", "eighty", "ninety"
    };
    res += Decades[n/10];
    n %= 10;
    if (n) res += "-";
  }
  if (n < 20 && n > 0)
    res += smallNumbers[n];
  return res;
}


const char* thousandPowers[] = {
  " billion", " million",  " thousand", "" };

typedef unsigned long Spellable;

string spell(Spellable n) {
  if (n < 20) return smallNumbers[n];
  string res;
  const char** pScaleName = thousandPowers;
  Spellable scaleFactor = 1000000000;   // 1 billion
  while (scaleFactor > 0) {
    if (n >= scaleFactor) {
      Spellable h = n / scaleFactor;
      res += spellHundreds(h) + *pScaleName;
      n %= scaleFactor;
      if (n) res += ", ";
    }
    scaleFactor /= 1000;
    ++pScaleName;
  }
  return res;
}

int main() {
#define SPELL_IT(x) std::cout << #x " " << spell(x) << std::endl;
  SPELL_IT(      99);
  SPELL_IT(     300);
  SPELL_IT(     310);
  SPELL_IT(    1501);
  SPELL_IT(   12609);
  SPELL_IT(  512609);
  SPELL_IT(43112609);
  SPELL_IT(1234567890);
  return 0;
}
#包括
#包括
使用std::string;
常量字符*smallNumbers[]={
“零”、“一”、“二”、“三”、“四”、“五”,
“六”,“七”,“八”,“九”,“十”,
“十一”、“十二”、“十三”、“十四”、“十五”,
“十六”,“十七”,“十八”,“十九”
};
字符串拼写为100(无符号n){
字符串res;
如果(n>99){
res=小数字[n/100];
res+=“百”;
n%=100;
如果(n)res+=“和”;
}
如果(n>=20){
静态常量字符*十年[]={
二十、三十、四十、,
“五十”、“六十”、“七十”、“八十”、“九十”
};
res+=十年[n/10];
n%=10;
如果(n)res+=“-”;
}
如果(n<20&&n>0)
res+=小数字[n];
返回res;
}
常量字符*千次幂[]={
“亿”、“百万”、“千”、“百万”;
typedef无符号长拼写;
字符串拼写(可拼写n){
如果(n<20)返回小数字[n];
字符串res;
常量字符**pScaleName=千次幂;
可拼写的scaleFactor=100000000;//10亿
while(scaleFactor>0){
如果(n>=scaleFactor){
可拼写h=n/缩放因子;
res+=拼写数百(h)+*pScaleName;
n%=标度因子;
如果(n)res+=“,”;
}
scaleFactor/=1000;
++pScaleName;
}
返回res;
}
int main(){
#定义拼写(x)标准::cout
#包括
#包括
#包括
使用名称空间std;
int main(){
setlocale(土耳其语);
国际ikibsm、yuzler、sayi、birler、onlar;
clrsc();
做{
printf(“\nSayıyıgirizing:”);
scanf(“%d”和&sayi);
yuzler=sayi/100;
ikibsm=sayi%100;
onlar=ikibsm/10;
birler=ikibsm%10;
开关(yuzler)
{
案例0:printf(“”);break;
案例1:printf(“Yüz”);break;
案例2:printf(“İkiyüz”);break;
案例3:printf(“Üçyüz”);break;
案例4:printf(“Dört Yüz”);break;
案例5:printf(“BeşYüz”);break;
案例6:printf(“AltıYüz”);break;
案例7:printf(“Yedi Yüz”);break;
案例8:printf(“Sekiz Yüz”);破产;
案例9:printf(“Dokuz Yüz”);破产;
}
开关(onlar)
{
案例1:printf(“On”);中断;
案例2:printf(“Yirmi”);break;
案例3:printf(“Otuz”);中断;
案例4:printf(“Kırk”);中断;
案例5:printf(“Elli”);break;
案例6:printf(“Altmış”);break;
案例7:printf(“Yetmiş”);break;
案例8:printf(“Seksen”);中断;
案例9:printf(“Doksan”);break;
}
开关(比勒)
{
案例1:printf(“Bir”);中断;
案例2:printf(“İki”);break;
案例3:printf(“Üç”);break;
案例4:printf(“Dört”);break;
案例5:printf(“Beş”);break;
案例6:printf(“Altı”);中断;
案例7:printf(“Yedi”);break;
案例8:printf(“Sekiz”);破产;
案例9:printf(“Dokuz”);break;
}

}虽然(我认为你只需要对数字10-19和某些位置(从最低有效位开始计算的3的倍数)这样做).ie 12093是一万二千九百三十三,但23093是二万三千九百三十三,120093是十二万九百三十三。@Andrei:是的,肯定有模式和重用规则。因此建议使用函数调用这些规则。@BenVoigt这很不幸。有什么方法可以澄清这里的代码是n吗不是我的,但直接从链接复制的?我可以很容易地删除它,只提供链接,但这将是一个链接唯一的答案,我不太喜欢。我认为这非常清楚。我只是想评论,让读者知道代码不是库质量。
#include <iostream>
#include <conio.h>
#include <stdio.h>
using namespace std;

int main() {

setlocale(LC_ALL,"Turkish");
int ikibsm, yuzler, sayi,birler,onlar;
clrscr();
do {

printf("\nSayıyı giriniz:");
scanf("%d", &sayi);

yuzler=sayi/100;
ikibsm=sayi%100;
onlar=ikibsm/10;
birler=ikibsm%10;

switch (yuzler)
{
    case 0: printf("") ;break;
    case 1: printf("Yüz ") ;break;
    case 2: printf("İkiyüz ") ;break;
    case 3: printf("Üçyüz ") ;break;
    case 4: printf("Dört Yüz ") ;break;
    case 5: printf("Beş Yüz ") ;break;
    case 6: printf("Altı Yüz ") ;break;
    case 7: printf("Yedi Yüz ") ;break;
    case 8: printf("Sekiz Yüz ") ;break;
    case 9: printf("Dokuz Yüz ") ;break;
}


 switch (onlar)
{
    case 1: printf("On ") ;break;
    case 2: printf("Yirmi ") ;break;
    case 3: printf("Otuz ") ;break;
    case 4: printf("Kırk ") ;break;
    case 5: printf("Elli ") ;break;
    case 6: printf("Altmış ") ;break;
    case 7: printf("Yetmiş ") ;break;
    case 8: printf("Seksen ") ;break;
    case 9: printf("Doksan ") ;break;
}

switch(birler)
{
    case 1: printf("Bir ") ;break;
    case 2: printf("İki ") ;break;
    case 3: printf("Üç ") ;break;
    case 4: printf("Dört ") ;break;
    case 5: printf("Beş ") ;break;
    case 6: printf("Altı ") ;break;
    case 7: printf("Yedi ") ;break;
    case 8: printf("Sekiz ") ;break;
    case 9: printf("Dokuz ") ;break;
}
} while (sayi<1000);
}