C和指针第七章编程题

1.

int hermite(int n, int x)
{
    int result;
    if (n <= 0)
        result = 1;
    else if (n == 1)
        result = 2 * x;
    else
        result = 2 * hermite(n-1, x) -
                2 * (n - 1) * hermite(n-2, x);
}

 

2.

int gcd (int M, int N)
{
    if (M <= 0 || N <= 0)
        return 0;

    int R;
    if ((R = M % N) == 0)
        return N;
    else
        gcd(N, R);

    /*MORE SIMPLER*/
    /*return R > 0 ? gcd(N,R) : N;*/
}

 

3.

int ascii_to_integer(char *string)
{
    int sum = 0;
    while (*string >= '0' && *string <= '9')
    {
        sum = sum * 10 + (*string++ - '0');
    }

    if (*string != '\0')
        return 0;
    else
        return sum;
}

 

4.

int max_list(int *string)
{
    int max;
    max = *string;
    while (*++string >= 0)
    {
        if (max < *string)
            max = *string;
    }

    return max;
}

/*guide's用stdarg宏*/
#include <stdarg.h>
int max_list(int first_arg, ...)
{
    va_list var_arg;

    if (first_arg >= 0)
    {
        int this_arg;
        int max = first_arg;

        va_start(var_arg, first_arg);

        while ((this_arg = va_arg(var_arg, int)) > 0)
        {
            if (this_arg > max)
                max = this_arg;
        }

        va_end(var_arg);
    }
    return max;
}

 

5,

/*这个程序很美,值得学习学习
**这是guide's的answer。
*/
#include <stdarg.h>
void printf(char *format, ...)
{
    va_list var_arg;
    char ch;
    char *str;

    va_start(var_arg, format);
    while (ch = *format++ != '\0')
    {
        if (ch != '%')
        {
            putchar(ch);
            continue;
        }

        switch(*format != '\0' ? *format++ : '\0')
        {
            case 'd' : printf_integer( va_arg(var_arg, int) );
                       break;
            case 'f' : printf_float( va_arg(var_arg, double) );
                       break;
            case 'c' : putchar( va_arg(var_arg, int) );
                       break;
            case 's' : str = va_arg(var_arg, char*);
                       while (*str++ != '\0')
                       {
                           putchar(*str);
                       }
                       break;
        }
    }

}

 

6.

/*
**一开始没思路,想啊想,夜了,想知道答案
**抵不过答案的诱惑此处用到ADT的思想,
**用到了递归的路子,简直是wonderful!
*/

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


static char *digits[] = {
    "", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT",
    "NINE", "TEN", "ELEVEN", "TWLEVE", "THIRTEEN","FOURTEEN", "FIFTEEN",
    "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN"};

static char *tens[] = {
    "", "" , "TWENTY","THIRTY", "FORTY", "FIFTY", "SIXTY", "SEVENTY",
    "EIGHTY", "NINETY"};

static char *magnitudes[] = {
    "", "THOUSAND", "MILLION", "BILLION"};

static void
do_one_group(unsigned int amount, char *buffer, char **magnitude)
{
    int value = amount / 1000;    //不断取商得到高三位

    if (value > 0)
    {
        do_one_group(value, buffer, magnitude+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, *magnitude);    //此处最易错。
    }
}

void written_amount(unsigned int amount, char *buffer)
{
    if (amount == 0)
        strcpy(buffer, "ZERO");
    else
    {
        buffer = '\0';
        do_one_group(amount, buffer, magnitudes);
    }
}
posted @ 2013-03-30 17:34  frechei  阅读(247)  评论(0编辑  收藏  举报