Reputation: 41
#include <iostream> //including header files#include <string>
#include <string>
using namespace std;
//string array declared
string units[3][11] = {{"One","Two","Three", "Four", "Five", "Six","Seven","Eight", "Nine","Ten"},
{"Eleven", "Twelve", "Thirteen","Fourteen", "Fifteen", "Sixteen", "Seventeen","Eighteen", "Nineteen"},
{"Twenty", "Thirty", "Fourty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety", "", ""}};
//function defs
void func6 (int unsigned long i);
void func5 (int unsigned long i);
void func4 (int unsigned i);
void func3 (int unsigned i);
void func2 (int unsigned i);
void func1 (int unsigned t);
void func (int unsigned i);
int main() //main body of fcn
{
long int num; //declaring integers
int j=1;
while (j==1) //start of while loop
{
cout << "Enter a number between -2 billion and 2 billion " << endl; //prompts user for i/p and stores it
cin >> num;
if ((num < -2000000000) || (num > 2000000000)) //exits program if not within these limits
{
cout << "Number Invalid " << endl;
return 0;
}
else
{
func(num); //call functions
func1(num);
func2(num);
func3(num);
func4(num);
func5(num);
// func6(num);
}
}
}
/*void func6 (int unsigned long i) //start of fcn5
{
int unsigned long t; //declares integer t
if (i>9999&&i<100000) //if within these limits statement executes
{
t=i%1000; //works out remainder
i=i/1000; //works out new i value
cout << units[1][i-11] << " Thousand "; //prints out result whilst looking up table
if (t<10) //if remainder within limits calls function
func(t);
else if (t>=10&&t<20)
func1(t);
else if (t>19&&t<=100)
func2(t);
else if (t>99&&t<1000)
func3(t);
}
}
*/
void func5 (int unsigned long i) //start of fcn5
{
int unsigned long t; //declaring integer
if (i>9999&&i<100000) // if value within these limits then execute
{
t=i%10000; //works out remainder
i=i/10000; //works out new value of i
cout << units[2][i-2] << " Thousand "; //prints out result whilst looking up table
if (t<10) //calls function if remainder within these limits
func(t);
else if (t>=10&&t<20)
func1(t);
else if (t>=20&&t<100)
func2(t);
else if (t>=100&&t<1000)
func3(t);
}
}
void func4 (int unsigned i) //start of function 4
{
int unsigned t; //declares integer
if (i>=1000&&i<10000) //if within these limits execute fcn
{
t=i%1000; //works out remainder
i=i/1000; //works out new value of i
cout << units[0][i-1] << " Thousand "; //prints out result whilst looking up table
if (t<10) //calls function if remainder within limits
func(t);
else if (t>=10&&t<20)
func1(t);
else if (t>=20&&t<100)
func2(t);
else if (t>=100&&t<1000)
func3(t);
}
}
void func3 (int unsigned i) //start of fcn 3
{
int unsigned t; //delcares integer
if (i>=100&&i<1000) //statement executes if within limits
{
t=i%100; //works out remainder
i=i/100; //works out new value
cout << units[0][i-1] << " Hundred "; //prints out result whilst looking up table
if (t<10) //if remainder within these limits calls previous functions
func(t);
else if (t>=10&&t<20)
func1(t);
else if (t>=20&&t<100)
func2(t);
}
}
void func2(int unsigned i) //start of fcn2
{
int unsigned t; //declares integer
if (i>=20&&i<100) //if i within limits statement executes
{
t=i%10; //works out remainder
i=i/10; //works out new i value
cout << units[2][i-2] ; //prints result out whilst looking up table
if (t < 10) //if remainder within these limits calls function
func(t);
}
}
void func1(int unsigned i) //start of func1
{
int unsigned t; //declares integer
if (i>10&&i<20) //if i within these limits statement executes
{
t=i%10; //works out remainder
cout << units[1][t-1] << endl; //prints out value whilst looking up table
}
}
void func(int unsigned t) //start of fcn
{
if (t<=10) //if statement less than 10 executes
{
cout << " " << units[0][t-1] << endl; //prints out result whilst looking up table.
}
}
Right I have written this code out and it works for most numbers but came to a confusion whilst trying to print out 10000, 11000, 12000,...90000, 91000 etc. Its stuff do with the remainders and the value of i. I cannot figure out what to do been stuck on it all day. Any ideas? Also now when I enter a number it returns it but then crashes.
Upvotes: 0
Views: 3841
Reputation:
Original post was terrible. Sorry. Now that I read your question properly, I can give you some preliminary version. but you have to modify it a little bit to tune it up.
string bases[6] = {"", "ten", "hundred", "thousand", "ten thousand", "million"};
string digit_to_word ( int n )
{
if(n == 1)
return "one";
if(n == 2)
return "two";
if(n == 3)
return "three";
if(n == 4)
return "four";
}
string number_to_word(int i, int pow) {
if(i < 10) {
return digit_to_word(i);
}
else {
int k = i / 10;
if(k > 10)
return number_to_word(k, ++pow) + "^" + bases[pow] + " " + digit_to_word(i%10) ;
else
return digit_to_word(k) + "^" + bases[pow] + " " + " " + digit_to_word(i%10);
}
}
int main () {
cin>>i;
cout << number_to_word(i, 1);
return 0;
}
Upvotes: 1
Reputation: 87959
It's not a loop, it's recursion
Suppose you have 123,456,789, then with the code you have above you have
billions=0 millions=123 thousands=456
Now you want to output "one hundred and twenty three million four hundred and fifty six thousand ...", so you need to convert 123 into "one hundred and twenty three" and you need to convert 456 into "four hundred and fifty six". How do you do that? Well it's exactly the same problem that you are already trying to solve, only with smaller numbers.
So you are right you do need to write a function, and when that function needs to convert the number of millions into words it will call itself (i.e. it will be recursive). Same when it is converting the number of thousands.
Upvotes: 0