ismailbhai
BAN USERQuick and dirty ...
- No check for overflow
int my_atoi(const char *s)
{
int mval = 10;
int val=0;
for (val = 0; s && *s >= '0' && *s <= '9'; s++)
val = val*mval + (*s - '0');
return val;
}
.. additional issues ...
1. no check for range
2. add a simple base case for 0.
I modified KAK's solution to account for cases where it does not work. The following works.
#include <string>
#include <map>
#include <iostream>
using namespace std;
class InWords
{
private:
map<int,string> m_map;
string print1K(int num)
{
string s1;
int h =0;
// hundreds place
if(num/100){
s1 += m_map[num/100];
s1 += string(" hundred ");
num = num%100;
h = 1;
}
// tens place
if (num/10){
if(h)
s1 += string(" and ");
if(num/10>=2){ //num = 21 to 99
s1 += m_map[(num/10)*10];
if(num%10 !=0 ){
s1 += " ";
s1 += m_map[num%10];
return s1;
}
// 20,30,40 ..90
return s1;
}else { // num = 10 to 19
s1 += m_map[num];
return s1;
}
}
// units place
if ( !num )
return s1;
else{
if(h)
s1 += string(" and ");
s1 += m_map[num];
return s1;
}
}
public:
InWords()
{
m_map.insert(make_pair(1,"one"));
m_map.insert(make_pair(2,"two"));
m_map.insert(make_pair(3,"three"));
m_map.insert(make_pair(4,"four"));
m_map.insert(make_pair(5,"five"));
m_map.insert(make_pair(6,"six"));
m_map.insert(make_pair(7,"seven"));
m_map.insert(make_pair(8,"eight"));
m_map.insert(make_pair(9,"nine"));
m_map.insert(make_pair(10,"ten"));
m_map.insert(make_pair(11,"eleven"));
m_map.insert(make_pair(12,"twelve"));
m_map.insert(make_pair(13,"thirteen"));
m_map.insert(make_pair(14,"fourteen"));
m_map.insert(make_pair(15,"fifteen"));
m_map.insert(make_pair(16,"sixteen"));
m_map.insert(make_pair(17,"seventeen"));
m_map.insert(make_pair(18,"eighteen"));
m_map.insert(make_pair(19,"nineteen"));
m_map.insert(make_pair(20,"twenty"));
m_map.insert(make_pair(30,"thirty"));
m_map.insert(make_pair(40,"forty"));
m_map.insert(make_pair(50,"fifty"));
m_map.insert(make_pair(60,"sixty"));
m_map.insert(make_pair(70,"seventy"));
m_map.insert(make_pair(80,"eighty"));
m_map.insert(make_pair(90,"ninety"));
}
string getWords(int num)
{
string s1;
if ( num <= 999 )
return print1K(num);
else {
s1 = print1K(num/1000);
s1 += string(" thousand ");
s1 += print1K(num%1000);
return s1;
}
}
};
int main()
{
InWords w;
for(int i = 1 ; i < 999,999 ; i++)
cout<<w.getWords(i) << endl;
}
The above code won't compile. You cannot initialize a static pointer this way. By definition static variables are initialized with constant objects and function parameters (which are always passed by value in C) are not constant. The first line in the code should be changed to
- ismailbhai September 13, 2007