当我在循环内打印变量时无限输出



我正在尝试将数字输入转换为单词。我是初学者,所以我的代码可能看起来很笨拙。我也为发布如此大的代码道歉。

#include "stdafx.h"
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main()
{
int i = 0, number = 0;
string num_name = "";
cout << "Enter a number (maximum value is 1,000,000,000)" << endl;
cin >> number;
//To find the maximum magnitude
while ((number / pow(10, i)) >= 1)
{
i++;
}
i--;
int j = i;
cout << j << endl; //Check
//To find which multiple of 3 i is
int n = 0;
while (j >= 3)
{
if (j % 3 == 0)
n++;
j--;
}
j = i;
cout << j << endl; //Check
cout << n << endl; //Check
//String construction
int k = n;
int q = 0;
while (k >= 1)
{
while (j >= (3 * k))
{
q = (int)(number / pow(10, j));
if (j == 2 + (3 * k))
{
if (q == 1) num_name += "one";
else if (q == 2) num_name += "two";
else if (q == 3) num_name += "three";
else if (q == 4) num_name += "four";
else if (q == 5) num_name += "five";
else if (q == 6) num_name += "six";
else if (q == 7) num_name += "seven";
else if (q == 8) num_name += "eight";
else if (q == 9) num_name += "nine";
num_name += "hundred";
}
if (j == 1 + (3 * k))
continue;
if (j == 3 * k)
{
if (q == 1) num_name += "one";
else if (q == 2) num_name += "two";
else if (q == 3) num_name += "three";
else if (q == 4) num_name += "four";
else if (q == 5) num_name += "five";
else if (q == 6) num_name += "six";
else if (q == 7) num_name += "seven";
else if (q == 8) num_name += "eight";
else if (q == 9) num_name += "nine";
else if (q == 10) num_name += "ten";
else if (q == 11) num_name += "eleven";
else if (q == 12) num_name += "twelve";
else if (q == 13) num_name += "thirteen";
else if (q == 14) num_name += "fourteen";
else if (q == 15) num_name += "fifteen";
else if (q == 16) num_name += "sixteen";
else if (q == 17) num_name += "seventeen";
else if (q == 18) num_name += "eighteen";
else if (q == 19) num_name += "nineteen";
if (q >= 20 && q <= 99)
{
int r = 0;
r = q % 10;
(int)(q /= 10);
if (q == 2) num_name += "twenty";
else if (q == 3) num_name += "thirty";
else if (q == 4) num_name += "forty";
else if (q == 5) num_name += "fifty";
else if (q == 6) num_name += "sixty";
else if (q == 7) num_name += "seventy";
else if (q == 8) num_name += "eighty";
else if (q == 9) num_name += "ninety";
if (r == 1) num_name += "one";
else if (r == 2) num_name += "two";
else if (r == 3) num_name += "three";
else if (r == 4) num_name += "four";
else if (r == 5) num_name += "five";
else if (r == 6) num_name += "six";
else if (r == 7) num_name += "seven";
else if (r == 8) num_name += "eight";
else if (r == 9) num_name += "nine";
}

if (k == 3) num_name += "billion";
else if (k == 2) num_name += "million";
else if (k == 1) num_name += "thousand";
}
number = number % (int)pow(10, j);
j--;
}
k--;
}
cout << num_name << endl;
cin.ignore();
cin.get();
return 0;
}

"字符串构造"部分的循环崩溃并打印变量 q(商(的无限值。我还尝试在 q 之前打印一个简单的变量,例如 flag = 1,这也给出了无限的 1。我无法弄清楚是什么原因造成的。任何意见都会对我的学习有很大帮助!

好吧,你能做的最好的事情之一就是不要弄乱主要功能。你搞砸了主要功能:c

创建函数是个好主意,这些函数允许您用更少的代码解决问题。要创建的函数数量是主观的,恕我直言,最好创建 2 个函数:toDigit 和转换,两者都返回字符串。

此外,我会在不使用库的情况下对数和电源使用函数(主要是因为 power 返回一个双精度,您必须将其转换为 int,数学库很重和其他原因(

让我们开始:(所有函数必须在主函数上方,toDigit 必须在转换上方(

你可以用一个基本的对数函数得到数字的大小,这给你一个糟糕的赞美,因为这个我称之为 sillyLog:

int sillyLog(int n, int b){
return !(n/b < 1)? 1 + sillyLog(n/b, b) : 1;
}

然后我们为幂创建函数:

int power(int b, int e){
return (e < 1)? 1 : b * power(b, e-1);
}

现在让我们看看主要的:

int main(){
int number = 0, magnitude = 0, counter = 1;
string num_name = "";
cout << "Enter a number (maximum value is 2,147,483,647)" << endl;
cin >> number;
magnitude = sillyLog(number, 10);
while (magnitude - 3 > 0){
magnitude = magnitude - 3;
counter++;
}
while (number){
int tmp;
tmp = (number - (number % power(1000,--counter)))/ power(1000, counter);//remove all digit after the first three and decrease counter
num_name += convert(tmp, counter + 1);
number = number - tmp * power(1000, counter);                           // we cut the first 3 digit 
}
cout << num_name << endl;
return 0;
}

计数器是计算三元组的变量,

此外,2,147,483,647 是整数类型的最大长度,如果您想要更大的数字,则必须使用长/长长/无符号/其他类型的长整型。 注意:负数不是问题,因为你只是忽略它们,但它们"吃掉"了你一半用于数字的内存。

你怎么看我们生成我们的字符串只是调用函数转换

string convert(int n, int m){
string s = "";
s = ((n-n%100)/100)? toDigit((n-n%100)/100) + " hundred " : "";
s += toDigit(n - (n - n%100));
switch (m){
case 4: return s + " billion ";
case 3: return s + " million ";
case 2: return s + " thousand "; 
default: return s;
}
}

我使用了条件运算符(三元(和开关大小写,而不是 if 只是为了让你知道它们在这里的存在

现在让我们看看我们无法简化的最重的功能:c

string toDigit(int n){
if (n < 20)
switch (n){
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 "";
}
switch ((n - n%10) / 10){
case 2: return "twenty " + toDigit(n - (n - n % 10));
case 3: return "thirty " + toDigit(n - (n - n % 10));
case 4: return "forty " + toDigit(n - (n - n % 10));
case 5: return "fifty " + toDigit(n - (n - n % 10));
case 6: return "sixty " + toDigit(n - (n - n % 10));
case 7: return "seventy " + toDigit(n - (n - n % 10));
case 8: return "eighty " + toDigit(n - (n - n % 10));
case 9: return "ninety " + toDigit(n - (n - n % 10));
}
}

这是必须使用开关大小写来使您的代码可读

如果您有任何疑问,我会很乐意回答您