一个蛋疼的数字转字符串的有关问题
一个蛋疼的数字转字符串的问题
首先庆祝下自己终于把八皇后的问题彻底搞明白了。于是继续带着自己攒的问题来到论坛请教大家。问题如下:
一个函数,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就好了。但是感觉这样写好麻烦,但是我就会这个笨办法,写了好长,,,遂前来想和大家探讨下有什么更好的方法。下面上点部分代码。
写太乱了,凑活着看看好了,,太乱了,也没调试好。。。见谅
------解决思路----------------------
仅供参考:
------解决思路----------------------
------解决思路----------------------
------解决思路----------------------
6楼代码略优化:
删除第3行#include <string.h>
原第69行if (p[strlen(p)-1]==' ') p[strlen(p)-1]=0;改为if (p[-1]==' ') p[-1]=0;
首先庆祝下自己终于把八皇后的问题彻底搞明白了。于是继续带着自己攒的问题来到论坛请教大家。问题如下:
一个函数,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;