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); } }