将数字转换为字母(例如:123 转换为一二三)
Convert the number into the letters (ex:123 into One Two Three)
问题本身并不难找到解决方案,但是当我很好地编写它时...... 这是代码:
#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
运行程序时,我发现的问题非常混乱(我已经使用调试多次检查值)它使用前两个数字运行流畅,但在最后一个数字上它总是得到一个奇怪的结果 前任:
123
给One Two Four
7895
给Seven 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()
来获得十进制幂。这不好,也没有必要。这是关于int
s -pow()
不是必需的,但它可能会导致奇怪的问题,因为它正在处理double
s(或float
s)。
如果从头开始,可以通过在循环中应用模和除法来达到预期的效果(分隔数字)。
样本:
#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
科里鲁的现场演示
笔记:
我使用了大卫评论中提到的技巧——数字单词的数组——将数字
int
转换为字符串。
数字的分隔是从右到左完成的:数字用
number % 10
分隔,数字用number /= 10
删除。这从右到左拼写数字 - 结果最终必须颠倒过来。我使用了一种相当简单的方法:将数字单词存储在一个
std::vector
中,然后反转。do
/while
循环至少授予一次迭代。因此,单个0
拼写正确,尽管迭代会在所有数字被消耗后立即停止(即number
变成了0
)。
使用以下方法可以更轻松地实现目标。
- 创建一个字符串数组,其中字符串对应于
0
到9
- 以字符串形式获取用户输入,以便不会限制用户希望INT_MAX
- 对于(输入)字符串的每个字符,检查它是否为数字。(使用 std::isdigit) 如果是数字,
- 则将 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'];
}
}
- 将数字转换为字母(例如:123 转换为一二三)
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 三维数组中的C/C++DWORD到BYTE和BYTE到DWORD的转换
- 如何将输入"三四+五六="转换为"34+56"?
- Arm GNU编译器:通过多余的强制转换优化的三进制生成的程序集
- 三种类型之间的隐式转换交互
- 用C++将三维数组转换为二维数组
- 如何将二次贝塞尔曲线代码转换为三次贝塞尔曲线
- 编写代码将给定的数字转换为单词(例如1234作为输入应输出一千二百三十四)
- 如何将三维点云转换为深度图像
- 二进制位流与三进制位流之间的转换
- 将三维阵列(矢量)转换为vtk非结构化网格
- 将军事时间转换为标准格式(HH:MM)并以标准格式计算平均值.三个问题
- 像素文本到三维网格的转换库
- 在汇编中使用malloc分配的内存-希望在c++中将其转换为三维数组
- 如何将三个函数转换为一个泛型函数
- c++隐式转换序列中的三个转换
- 三种显式上转换到私有基类的区别
- 我如何把一个三维数组转换成一个模型
- 将三维指针的第一个地址转换成一维指针时出现问题