将数字转换为字母(例如:123 转换为一二三)

Convert the number into the letters (ex:123 into One Two Three)

本文关键字:转换 一二三 例如 数字      更新时间:2023-10-16

问题本身并不难找到解决方案,但是当我很好地编写它时...... 这是代码:

#include<iostream>
#include<math.h>
int n;
using namespace std;
int input();
int num_count();
void new_val();
int main()
{
n = input();
new_val();
}
int input()
{
int x;
cout<<"Insert:";
cin>>x;
return x;
}
int num_count()
{
int sub_n = n;
int amount = 0;
while(sub_n>0)
{
sub_n = sub_n/10;
amount++;
}
return amount;
}
void new_val()
{
int m[100] = {};
int i;
int count_n = num_count()-1;
for(i=0; n>0; i++)
{
m[i]=n/(int)(pow(10,count_n));
switch(m[i])
{
case 0:cout<<"Zero";break;
case 1:cout<<"One"; break;
case 2:cout<<"Two"; break;
case 3:cout<<"Three";break;
case 4:cout<<"Four";break;
case 5:cout<<"Five";break;
case 6:cout<<"Six";break;
case 7:cout<<"Seven";break;
case 8:cout<<"Eight";break;
case 9:cout<<"Nine";break;
}
n = n%(int)pow(10,count_n);
count_n--;
}
}

当我使用123运行程序时,我发现的问题非常混乱(我已经使用调试多次检查值)它使用前两个数字运行流畅,但在最后一个数字上它总是得到一个奇怪的结果 前任:

123One Two Four

7895Seven Nine Four//这是最奇怪的

我可以假设new_val()函数有一些问题,特别是这一行:

n=n%(int)pow(10,count_n);

当我检查调试手表时,正是在这一行之后,n的值变得混乱。

但是当我将其粘贴到main()函数中时,它工作得很好。我希望这不是我的一个愚蠢的错误,但如果是,你能告诉我问题吗?

pow 函数用于浮点数,不适合处理整数,会有舍入错误,从而导致您看到的那种问题!

为了解决您的问题,我可能会将数字转换为字符串(可能使用 std::to_string)并使用字符串的字符。

为了避免使用math.h中的pow函数,请编写自己的power_of_10函数。由于count_n不会是负数,因此您可以通过以下方式实现它:

unsigned long long power_of_ten(int count)
{
int pOf10 = 1;
for(int i = 0; i < count; i++)
pOf10 = pOf10 * 10;
return pOf10;
}

当然,您的int数组必须重新定义为:

unsigned long long m[100]={0};

StackOverflow中一定有很多关于这个问题的Q/A。

我可能没有回答,但 OP 使用烦人的pow()来获得十进制幂。这不好,也没有必要。这是关于ints -pow()不是必需的,但它可能会导致奇怪的问题,因为它正在处理doubles(或floats)。

如果从头开始,可以通过在循环中应用模和除法来达到预期的效果(分隔数字)。

样本:

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
std::string numberToString(int number)
{
// separate digits backwards:
const char *digitWords[] = {
"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"
};
std::vector<const char*> words;
do {
int digit = number % 10;
words.push_back(digitWords[digit]);
// do decimal right shift
number /= 10;
} while (number > 0);
// add digit words in reverse order to string
std::reverse(words.begin(), words.end());
std::string ret;
for (const char *const word : words) {
ret += ' '; ret += word;
}
// done
return ret;
}
int main()
{
// some tests
int numbers[] = { 123, 7859, 0 };
for (int number : numbers) {
std::cout << number << " spelled: " << numberToString(number) << 'n';
}
return 0;
}

输出:

123 spelled:  One Two Three
7859 spelled:  Seven Eight Five Nine
0 spelled:  Zero

科里鲁的现场演示

笔记:

  1. 我使用了大卫评论中提到的技巧——数字单词的数组——将数字int转换为字符串。

  2. 数字的
  3. 分隔是从右到左完成的:数字用number % 10分隔,数字用number /= 10删除。

  4. 这从右到左拼写数字 - 结果最终必须颠倒过来。我使用了一种相当简单的方法:将数字单词存储在一个std::vector中,然后反转。

  5. do/while循环至少授予一次迭代。因此,单个0拼写正确,尽管迭代会在所有数字被消耗后立即停止(即number变成了0)。

使用以下方法可以更轻松地实现目标。

  1. 创建一个字符串数组,其中字符串对应于09
  2. 以字符串形式获取用户输入,以便不会限制用户希望INT_MAX
  3. 对于(输入)字符串的每个字符,检查它是否为数字。(使用 std::isdigit)
  4. 如果是数字,
  5. 则将 char(即数字)转换为 int 并在数组中打印字符串,在索引 = 数字处。

观看直播


#include <iostream>
#include <array>    // std::array
#include <string>
#include <cctype>   // std::isdigit
int main()
{
const std::array<std::string, 10> arr = { "Zero","One","Two","Three","Four","Five","Six","Seven","Eight", "Nine" };
std::string IntString;  
std::cout << "Insert:"; std::cin >> IntString;
for (const char Char : IntString)
(std::isdigit(Char)) ?
std::cout << arr[Char - '0'] << " ": 
std::cout << "Unknown ";   
return 0;
}

示例输入

12345678987654321h

输出

One Two Three Four Five Six Seven Eight Nine Eight Seven Six Five Four Three Two One Unknown 

正如 P.W 所说,使你自己的十次幂函数,而不是像许多人在评论和答案中所说的那样使用 pow(),因为在处理整数时结果不可靠。

例如:

//function for powers of 10
int power_of_ten(int x) 
{
int power_of_tens = 10; // sets variable to 10
for(int j = 1; j < x; ++j) //loops until j is greater than x(count_n)
{
power_of_tens *= 10;
}
return power_of_tens;
}

作为重构 OP 代码以包含所述函数的替代解决方案:

演示

你必须重新设计你循环数字的方式。pow返回一个double,当您将其投射回这样的int时,可能会导致舍入错误。应该导致5的东西可能会在内部4.999999,当你键入它时,它会被截断为4.在我的机器上运行程序时,我也没有收到此错误,您绝对不希望出现这样的不稳定行为。

我的建议是摆脱这些计算,而是将数字作为字符串读取,允许您遍历其内容。以下是程序的外观:

#include <iostream>
#include <string>
const char * nums[] = { "Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine" };
int main()
{
std::string n;
std::cout << "Insert:";
std::getline(std::cin, n);
for (char i : n) {
std::cout << nums[i - '0'];
}
}