一个蛋疼的数字转字符串的有关问题

一个蛋疼的数字转字符串的问题
首先庆祝下自己终于把八皇后的问题彻底搞明白了。于是继续带着自己攒的问题来到论坛请教大家。问题如下:
一个函数,2个参数,第一个是一个无符号整型,第二个是一个字符串函数。要求将整型数字转换为单词形式存在字符串中,但并不是那种一个数字转一个字符。例如如果是16312,那么字符串中应该是SIXTEEN THOUSAND THREE HUNDRED TWELVE。这种样子的转换。
当然我不是伸手党!我说下自己的解决方法和想法:就拿16312举例,先除以10,如果结果不为0,就取他的余,并计数,然后继续,直到除以10的结果为0,然后根据计数的值推断他的个十百千位是什么。然后以0 - 2, 3 - 5分别定位到hundred,thousand或者之后的millon,billion。比如16312就定位到3 - 5,然后拿他除以100000,根据结果是否为0来判断是否为6位数,为0的话就继续除以10000,不为0得到商之后就进行switch。。。这边比较特殊,因为按三位一分的话,16312的16得表示为sixteen,所以3个一组中的第二位为1的话,就在1之下继续一次switch,从而判断第三位的数字,从而得到sixteen,或者elevn之类。其他的就正常不断switch就好了。但是感觉这样写好麻烦,但是我就会这个笨办法,写了好长,,,遂前来想和大家探讨下有什么更好的方法。下面上点部分代码。

//题目略,详见c和指针第七章练习题6
# include <stdio.h>
# include <string.h>
# include <memory.h>

void written_amount(unsigned int amount, char * buffer);

int main(void)
{
unsigned int n;
char str[255];
memset(str, '\0', 254);

printf("Please enter the value.\n");
scanf("%u", &n);

written_amount(n, str);
strcat(str, '\0');
puts(str);

return 0;
}

void written_amount(unsigned int amount, char * buffer)
{
int i = 0;
int temp = amount;
int bu = amount;

while (temp / 10 != 0)//计算出这个数字的是千,百还是什么。
{
i++;
temp /= 10;
}
printf("%d\n", i);

if (i <= 6 && i >= 3)
{
if ((temp = amount / 100000) != 0)//如果该位上有数字,进行判别,然后把相应的数字编程字符串存入数组
{
switch (temp)
{
case 1: strcpy(buffer, "ONE HUNDRED");
break;
case 2: strcpy(buffer, "TWO HUNDRED");
break;
case 3: strcpy(buffer, "THREE HUNDRED");
break;
case 4: strcpy(buffer, "FOUR HUNDRED");
break;
case 5: strcpy(buffer, "FIVE HUNDRED");
break;
case 6: strcpy(buffer, "SIX HUNDRED");
break;
case 7: strcpy(buffer, "SEVEN HUNDRED");
break;
case 8: strcpy(buffer, "EIGHT HUNDRED");
break;
case 9: strcpy(buffer, "NINE HUNDRED");
break;
}
bu %= 100000;
temp = bu / 10000;
switch (temp)
{
case 1: bu %= 10000;
temp = bu / 1000;
switch (temp)
{
case 0: strcat(buffer, " TEN");
break;
case 1: strcat(buffer, " ELEVEN");
break;
case 2: strcat(buffer, " TWELVE");
break;
case 3: strcat(buffer, " THIRTEEN");
break;
case 4: strcat(buffer, " FOURTEEN");
break;
case 5: strcat(buffer, " FIFTEEN");
break;
case 6: strcat(buffer, " SIXTEEN");
break;
case 7: strcat(buffer, " SEVENTEEN");
break;
case 8: strcat(buffer, " EIGHTEEN");
break;
case 9: strcat(buffer, " NIGHTEEN");
break;
}
goto next;
case 2: strcat(buffer, " TWENTY");
break;
case 3: strcat(buffer, " THIRTY");
break;
case 4: strcat(buffer, " FOURTY");
break;
case 5: strcat(buffer, " FIFTY");
break;
case 6: strcat(buffer, " SIXTY");
break;
case 7: strcat(buffer, " SEVENTY");
break;
case 8: strcat(buffer, " EIGHTY");
break;
case 9: strcat(buffer, " NIGHTY");
break;

}
bu %= 10000;
temp = bu / 1000;
switch (temp)
{
case 1: strcat(buffer, " ONE");
break;
case 2: strcat(buffer, " TWO");
break;
case 3: strcat(buffer, " THREE");
break;
case 4: strcat(buffer, " FOUR");
break;
case 5: strcat(buffer, " FIVE");
break;
case 6: strcat(buffer, " SIX");
break;
case 7: strcat(buffer, " SEVEN");
break;
case 8: strcat(buffer, " EIGHT");
break;
case 9: strcat(buffer, " NINE");
break;
}
next:
bu %= 1000;
temp = bu / 100;
switch (temp)
{
case 1: strcpy(buffer, "ONE HUNDRED");
break;
case 2: strcpy(buffer, "TWO HUNDRED");
break;
case 3: strcpy(buffer, "THREE HUNDRED");
break;
case 4: strcpy(buffer, "FOUR HUNDRED");
break;
case 5: strcpy(buffer, "FIVE HUNDRED");
break;
case 6: strcpy(buffer, "SIX HUNDRED");
break;
case 7: strcpy(buffer, "SEVEN HUNDRED");
break;
case 8: strcpy(buffer, "EIGHT HUNDRED");
break;
case 9: strcpy(buffer, "NINE HUNDRED");
break;
}
bu %= 100;
temp = bu / 10;
switch (temp)
{
case 1: bu %= 10;
temp = bu;
switch (temp)
{
case 0: strcat(buffer, " TEN");
break;
case 1: strcat(buffer, " ELEVEN");
break;
case 2: strcat(buffer, " TWELVE");
break;
case 3: strcat(buffer, " THIRTEEN");
break;
case 4: strcat(buffer, " FOURTEEN");
break;
case 5: strcat(buffer, " FIFTEEN");
break;
case 6: strcat(buffer, " SIXTEEN");
break;
case 7: strcat(buffer, " SEVENTEEN");
break;
case 8: strcat(buffer, " EIGHTEEN");
break;
case 9: strcat(buffer, " NIGHTEEN");
break;
}
goto next1;
case 2: strcat(buffer, " TWENTY");
break;
case 3: strcat(buffer, " THIRTY");
break;
case 4: strcat(buffer, " FOURTY");
break;
case 5: strcat(buffer, " FIFTY");
break;
case 6: strcat(buffer, " SIXTY");
break;
case 7: strcat(buffer, " SEVENTY");
break;
case 8: strcat(buffer, " EIGHTY");
break;
case 9: strcat(buffer, " NIGHTY");
break;
}
bu %= 10;
temp = bu;
switch (temp)
{
case 1: strcat(buffer, " ONE");
break;
case 2: strcat(buffer, " TWO");
break;
case 3: strcat(buffer, " THREE");
break;
case 4: strcat(buffer, " FOUR");
break;
case 5: strcat(buffer, " FIVE");
break;
case 6: strcat(buffer, " SIX");
break;
case 7: strcat(buffer, " SEVEN");
break;
case 8: strcat(buffer, " EIGHT");
break;
case 9: strcat(buffer, " NINE");
break;
}
next1:;
}
}
}

写太乱了,凑活着看看好了,,太乱了,也没调试好。。。见谅
------解决思路----------------------
仅供参考:
/////////////////////////////////////////////////////////////
// FREE code from CODECENTRIX
// http://www.codecentrix.com/
// http://codecentrix.blogspot.com/
/////////////////////////////////////////////////////////////
#include "stdafx.h"

const TCHAR* const NUMBERS_UP_TO_20[] =
{
    _T("zero"),     _T("one"),     _T("two"),      _T("three"),    _T("four"),
    _T("five"),     _T("six"),     _T("seven"),    _T("eight"),    _T("nine"),
    _T("ten"),      _T("eleven"),  _T("twelve"),   _T("thirteen"), _T("fourteen"),
    _T("fifteen"),  _T("sixteen"), _T("sventeen"), _T("eighteen"), _T("nineteen")
};

const TCHAR* const NUMBERS_MULTIPLE_OF_10[] =
{
    _T("twenty"), _T("thirty"),  _T("fourty"), _T("fifty"),
    _T("sixty"),  _T("seventy"), _T("eighty"), _T("ninety")
};


tstring NumberToStringEN(INT64 nNumber)
{
    if (nNumber < 0)
    {
        return _T("");
    }

    if (nNumber < 20)
    {
        return NUMBERS_UP_TO_20[nNumber];
    }

    tstring sResult;
    INT64   nCrntNumber = nNumber / 1000000000;

    if (nCrntNumber > 0)
    {
        sResult = NumberToStringEN(nCrntNumber);
        sResult += _T(" billion");
        nNumber %= 1000000000;
    }

    nCrntNumber = nNumber / 1000000;
    if (nCrntNumber > 0)
    {
        sResult = NumberToStringEN(nCrntNumber);
        sResult += _T(" million");
        nNumber %= 1000000;
    }

    nCrntNumber = nNumber / 1000;
    if (nCrntNumber > 0)
    {
        sResult = NumberToStringEN(nCrntNumber);
        sResult += _T(" thousand");
        nNumber %= 1000;
    }

nCrntNumber = nNumber / 100;
if (nCrntNumber > 0)
{
sResult = NumberToStringEN(nCrntNumber);
sResult += _T(" hundred");
nNumber %= 100;
}

if ((0 < nNumber) && (nNumber < 20))
{
sResult += _T(" ");
sResult += NumberToStringEN(nNumber);
}
else
{
nCrntNumber = nNumber / 10;
if (nCrntNumber > 0)
{
sResult += _T(" ");
sResult += NUMBERS_MULTIPLE_OF_10[nCrntNumber - 2];
nNumber %= 10;
}

nCrntNumber = nNumber;
if (nCrntNumber > 0)
{
sResult += _T(" ");
sResult += NumberToStringEN(nCrntNumber);
}
}

if (sResult[sResult.length() - 1] == _T(' '))
{
// Erase last space.
sResult.erase(sResult.length() - 1, 1);
}

return sResult;
}

------解决思路----------------------


#include <stdio.h>
#include <string.h>
#include <memory.h>

#pragma warning (disable : 4996)

void written_amount(unsigned long long amount, char * buffer);
char* head(unsigned long long num, char* buf);

char* _1[]  = {"", " thousand", " million", " billion"};
char* _2[]  = {"", " ten"," twenty"," thirty"," forty"," fifty"," sixty"," seventy"," eighty"," ninety"};
char* _3[]  = {"", " one"," two"," three"," four"," five"," six"," seven"," eight"," nine", " ten", " eleven"," twelve"," thirteen"," fourteen"," fifteen"," sixteen"," seventeen"," eighteen"," nineteen"};

int main(void)
{
    unsigned long long n;
    char str[255];
    memset(str, '\0', 254);

    printf("Please enter the value.\n");
    scanf("%I64d", &n);

    if (n > 999999999999)
    {
        printf("Hard to describe a number larger than 999 billion \n");
        return -1;
    }

    written_amount(n, str);
    puts(str);

    return 0;


void written_amount(unsigned long long amount, char * buffer)
{
    long long i = 0;
    long long temp = amount;
    long long bu = amount;

    for (i = 3; i >= 0; i--)
    {
        unsigned long long temp = amount;
        char stemp[128] = {0};

        for (long long j = 0; j < i; j++)
        {
            temp /= 1000;
        }
        temp %= 1000;
        if (temp > 0)
        {
            strcat(buffer, head(temp, stemp));
            strcat(buffer, _1[i]);
        }
    }
}

char* head(unsigned long long num, char* buf)
{
    char stemp[128] = {0};
    unsigned long long temp;
    
    //hundred
    temp = num / 100;
    if (temp > 0)
    {
        strcat(buf, _3[temp]);
        strcat(buf, " hundred ");
    }

    //less than hundred
    temp = num % 100;
    if (temp > 0)
    {
        strcat(buf, num / 100 > 0 ? " and " : "");
        if (temp > 0 && temp < 20 )     // 0-19
        {
            strcat(buf, _3[temp]);
        }
        else                            // >19
        {
            strcat(buf, _2[temp / 10]);
            //less than 10
            temp = temp % 10;
            if (temp > 0)
            {
                strcat(buf, _3[temp]);
            }
        }
    }
    
    return buf;
}


------解决思路----------------------

char s_n[20] = { "", "One",...,"Nineteen"};
char s_n1[10]= { "", "", "twenty",...,"ninety"};

void thousandToStr( UINT u, char *pStr )
{
UINT u1 = u/100;
if( u1 > 0 )
{
strcat( pStr, s_n[u1] );
strcat( pStr, " hundred " );
}
u = u%100;
u1= u/10;
if( u1 > 1 )
{
strcat( pStr, s_n1 );
strcat( pStr, " " );
}
u1 = u%20;
strcat( pStr, s_n );
}
void MillionToStr( UINT u, char *pStr )
{
UINT u1 = u/1000000;
if( u1 > 0 )
{
MillionToStr( u1, pStr );
strcat( pStr, " Million ")
}
u1 = u/1000;
if( u1 > 0 )
{
thousandToStr( u1, pStr );
strcat( pStr, " thousand" );
}
strcat( pStr, " " );
thousandToStr( u1, pStr );
}

void UintToStr( UINT u, char* pStr )
{
MillionToStr( u, pStr );
}

------解决思路----------------------
6楼代码略优化:
删除第3行#include <string.h>
原第69行if (p[strlen(p)-1]==' ') p[strlen(p)-1]=0;改为if (p[-1]==' ') p[-1]=0;