题目如下:编写函数
void written_amount(unsigned int amount,char *buffer);
它把amount表示的值转换为单词形式,并储存于buffer中。这个函数可以在一个打印支票的程序中使用。例如,如果amount的值是16312,那么buffer中存储的字符串应该是
SIXTEEN THOUSAND THREE HUNDRED TWELVE
对于此题使用了递归的方式,解题的关键在于数据的定义,还有将数据化成等分。
#include <stdio.h>
#include <string.h>
#define SIZE 1000
static char *digits[] = {
" ", "ONE ", "TWO ", "THREE ", "FOUR ",
"FIVE ", "SIX ", "SEVEN ", "EIGHT ", "NINE ", "TEN ", "ELEVEN ",
"TWELVE ", "THIRDTEEN ", "FOURTEEN ", "FIFTEEN ", "SIXTEEN ",
"SEVENTEEN ", "EIGHTEEN ", "NINETEEN "
};
static char *tens[] = {" ", " ", "TWENTY ", "THIRTY ",
"FORTY ", "FIFTY ", "SIXTY ", "SEVENTY ", "EIGHTY ", "NINETY "
};
static char *magnitudes[] = {" ", "THOUSAND ", "MILLION ", "BILLION "};
void written_amount (unsigned int amount, char *buffer);
static void do_one_group (unsigned int amount, char *buffer, char **magnitudes);
int main(void)
{
unsigned int number;
char str[SIZE];
while (scanf ("%d", &number) == 1)
{
written_amount (number, str);
puts (str);
}
return 0;
}
void written_amount (unsigned int amount, char *buffer)
{
if (amount == 0)
strcpy (buffer, "ZERO ");
else
{
*buffer = '\0';
do_one_group (amount, buffer, magnitudes);
}
}
static void do_one_group (unsigned int amount, char *buffer, char **magnitudes)
{
int value;
value = amount / 1000;
if (value > 0)
do_one_group (value, buffer, magnitudes + 1);
amount %= 1000;
value = amount / 100;
if (value > 0)
{
strcat (buffer, digits[value]);
strcat (buffer, "HUNDRED ");
}
value = amount % 100;
if (value >= 20)
{
strcat (buffer, tens[value / 10]);
value %= 10;
}
if (value > 0)
{
strcat (buffer, digits[value]);
}
if (amount > 0)
{
strcat (buffer, *magnitudes);
}
}