1、Hermite Polynominal(厄米多项式)是这样定义的:
H
n
(
x
)
=
{
n
≤
0
:
1
n
=
1
:
2
x
n
≥
2
:
2
x
H
n
−
1
(
x
)
−
2
(
n
−
1
)
H
n
−
2
(
x
)
}
H_n(x) = \begin{Bmatrix} n ≤ 0 : 1 \\ n = 1 : 2x \\ n ≥ 2 : 2xH_{n-1}(x) - 2(n-1)H_{n-2}(x) \end{Bmatrix}
Hn(x)=⎩
⎨
⎧n≤0:1n=1:2xn≥2:2xHn−1(x)−2(n−1)Hn−2(x)⎭
⎬
⎫例如,
H
3
(
2
)
H_3(2)
H3(2)的值是40,请编写一个递归函数,计算
H
n
(
x
)
H_n(x)
Hn(x)的值,你的函数应该与下面的原型匹配:
int hermite(int n, int x)
#include <stdio.h>
int hermite(int n, int x);
int main(void)
{
int i, j;
int result;
printf("please input n and x:");
scanf("%d %d", &i, &j);
result = hermite(i, j);
printf("result: %d\n", result);
return 0;
}
int hermite(int n, int x)
{
if (n <= 0)
return 1;
if (n == 1)
return x * 2;
if (n >= 2)
return (hermite(n - 1, x) * x * 2) - (hermite(n - 2, x) * (n - 1) * 2);
}
2、 两个整型值M和N(M、N均大于0)的最大公约数可以按照下面的方法计算:
g
c
d
(
M
,
N
)
=
{
M
%
N
=
0
:
N
M
%
N
=
R
,
R
>
0
:
g
c
d
(
N
,
R
)
}
gcd(M,N) = \begin{Bmatrix} M \% N = 0 : N \\ M \% N = R, R > 0 : gcd(N,R) \end{Bmatrix}
gcd(M,N)={M%N=0:NM%N=R,R>0:gcd(N,R)}
#include <stdio.h>
int gcd(int m, int n);
int main(void)
{
int i,j;
printf("please input m and n:");
scanf("%d %d", &i, &j);
printf("result: %d\n", gcd(i, j));
return 0;
}
int gcd(int m, int n)
{
int r;
if ((m <= 0) || (n <= 0))
return 0;
do{
r = m % n;
m = n;
n = r;
}while (r);
return m;
}
3、为下面这个函数原型编写函数定义:
int ascii_to_integer(char *string);
这个字符串参数必须包含一个或多个数字,函数应该把这些数字字符转换为整数并返回这个整数,如果字符串参数包含了任何非数字字符,函数就返回零。请不必担心算数溢出。提示:这个技巧很简单,你每发现一个数字,把当前值乘以10,并把这个值和新数字所代表的值相加。
#include <stdio.h>
int ascii_to_integer(char *string);
int main(void)
{
char *str = "9876";
printf("%d\n", ascii_to_integer(str));
return 0;
}
int ascii_to_integer(char *string)
{
int value = 0;
while ((*string >= '0') && (*string <= '9')) {
value = value * 10 + (*string - '0');
string++;
}
if (*string != '\0')
value = 0;
return value;
}
4、编写一个名叫max_list的函数,它用于检查任意数目的整型参数并返回它们中最大值。参数列表必须以一个负数结尾,提示列表结束。
#include <stdio.h>
#include <stdarg.h>
int max_list(int first, ...);
int main(void)
{
printf("max: %d\n", max_list(100, 23, 44, 3, 5, 66, 0, 199, -1));
return 0;
}
int max_list(int first, ...)
{
va_list var_arg;
int max, next;
max = first;
va_start(var_arg, first);
do {
next = va_arg(var_arg, int);
if (next > max)
max = next;
}while (next >= 0);
va_end(var_arg);
return max;
}
5、实现一个简化的printf函数,它能够处理%d,%f,%s和%c格式码,根据ANSI标准的原则,其他格式码的行为是未定义的,你可以假定已经存在函数print_integer和print_float,用于打印这些类型的值,对于另外两种类型的值,使用putchar来打印。
#include <stdio.h>
#include <stdarg.h>
void myprintf(char format[], ...);
int main()
{
printfs("%d, %f, %s, %c", 100, 1.23, "abc", 'd');
return 0;
}
void myprintf(char format[], ...)
{
char *p = format;
va_list var_arg;
va_start(var_arg, format);
while (*p){
if (*p == '%'){
switch (*++p){
case 'd':
print_integer(va_arg(var_arg, int));
break;
case 'f':
print_float(va_arg(var_arg, float));
break;
case 's':
puts(va_arg(var_arg, char *));
break;
case 'c':
putchar(va_arg(var_arg, char));
break;
default:
printf("/%%c format are not supported!\n", *p);
}
}
else {
putchar(*p);
}
p++;
}
va_end(var_arg);
}
6、编写函数:
void written_amount(unsigned int amount,char *buffer);
它把amount表示的值转化为单词形式,并存储于buffer中,这个函数可以在一个打印支票的程序中使用。例如,如果amount的值是16312,那么buffer中存储的字符串应该是:SIXTEEN THOUSAND THREE HUNDRED TWELVE
调用程序应该保证buffer缓冲区的空间足够大。有些值可以用两种不同的方法进行打印。例如,1200可以是ONE THOUSAND TWO HUNDRED或TWELVE HUNDRED。你可以选择一种你喜欢的形式。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *unit[] = {"", "one ", "two ", "three ", "four ", "five ", "six ", "seven ", "eight ", "nine ", "ten ", "eleven ", "twelve ", "thirteen ", "fourteen ", "fifteen ", "sixteen ", "seventeen ", "eighteen ", "nineteen "};
char *decate[] = {"", "", "twenty ", "thirty ", "forty ", "fifty ", "sixty ", "seventy ", "eighty ", "ninety "};
void written_within_thousand(unsigned int amount, char *buffer);
void written_amount(unsigned int amount, char *buffer);
#define MAX 10000
int main(int argc, char *argv[])
{
unsigned int mount = atoi(argv[1]);
char buf[MAX];
written_amount(mount, buf);
puts(buf);
return 0;
}
void written_amount(unsigned int amount, char *buffer)
{
if (amount >= 1000000000){
written_within_thousand(amount / 1000000000, buffer);
strcat(buffer, "billion ");
amount %= 1000000000;
}
if (amount >= 1000000){
written_within_thousand(amount / 1000000, buffer);
strcat(buffer, "million ");
amount %= 1000000;
}
if (amount >= 1000){
written_within_thousand(amount / 1000, buffer);
strcat(buffer, "thousand ");
amount %= 1000;
}
written_within_thousand(amount, buffer);
}
void written_within_thousand(unsigned int amount, char *buffer)
{
if (amount >= 100){
strcat(buffer, unit[amount / 100]);
strcat(buffer, "hundred ");
amount %= 100;
}
if (amount >= 20){
strcat(buffer, decate[amount / 10]);
amount %= 10;
}
strcat(buffer, unit[amount]);
}