7.1 hermite递归函数

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

7.2两个整型值M和N(m、n均大于0)的最大公约数计算公式:

gcd(M,N)

当M % N = 0;  N

当M % N =R, R > 0; gcd(N,R)

unsigned int gcd(unsigned int M, unsigned int N)
{
if (M % N == 0) {
return N;
} unsigned int R;
R = M % N;
return gcd(N, R);
}

7.3 为原型编写函数定义,

int ascii_to_interger(char *string)

每遇到一位数,把当前总值乘以10,加上遇到的数。

int ascii_to_interger(char *string)
{
static total = 0;
int num = *string - '0'; //到达字符串末尾或遇到非法字符直接返回总计值
if (*string == '\0' || (*string - '0' > 9)) {
return total;
} //每遇到一个数,把当前值乘以10,加上遇到的数
total = 10 * total + num; //string右进一位
return ascii_to_interger(string + 1);
}

7.4  可变参数函数需要第一个参数必须为命名的确定参数。编写可变函数max_list求最大值。

#include <stdarg.h>

int max_list(int first_arg, ...)
{
//指向参数栈的指针
va_list va_arg;
//初始化指针
va_start (va_arg, first_arg); int value = va_arg(va_arg, int);
int max = first_arg; while (value > 0) {
if (max < value) {
max = value;
}
//循环取出值
value = va_arg(va_arg, int);
}
//将指针指向为NULL
va_end(va_arg); return max;
}

7.5实现简化版本的printf函数,能够处理%d %f %s %c格式码,假设以及存在print_interger和print_float,其他的两个用putchar打印。

#include <stdio.h>
#include <stdarg.h>
void print_integer(int integer)
{
printf("%d", integer);
} void print_float(float floatNum)
{
printf("%f", floatNum);
} //mini版printf只支持 %d %f %c %s
void mini_prinf(char *format, ...)
{
va_list arg; va_start(arg, format);
char *sPtr = format;
char *str;
float flt; while (*sPtr != '\0') {
//普通字符直接输出
if (*sPtr != '%') {
putchar(*sPtr++);
continue;
} // %%输出一个%
if ((*sPtr == *(sPtr + 1) == '%')) {
putchar(*sPtr++);
sPtr++;
continue;
} //遇到%后面有格式符,进行判断类型,然后读取打印参数,每次跳2位包括% 和后面的格式码
switch (*(sPtr + 1)){
case 'd':
print_integer(va_arg(arg, int));
sPtr += 2;
break;
case 'f':
/*C语言中,调用一个不带原型声明的函数时:
调用者会对每个参数执行“默认实际参数提升(default argument promotions)”。
同时,对可变长参数列表超出最后一个有类型声明的形式参数之后的每一个实际参数,也将执行上述提升工作。*/
//所以这里写double
print_float(va_arg(arg, double));
sPtr += 2;
break;
case 'c':
//字符也是小整型,直接当int取,char读出来
putchar(va_arg(arg, int));
sPtr += 2;
break;
case 's':
str = va_arg(arg, char *);
while (*str != '\0') {
putchar(*str++);
}
sPtr += 2;
break;
default:
sPtr += 2;
break;
}
}
}

整型提升:

——float类型的实际参数将提升到double
——char、short和相应的signed、
——unsigned类型的实际参数提升到int
——如果int不能存储原值,则提升到unsigned int

参考:http://blog.csdn.net/astrotycoon/article/details/8284501

7.6 编写函数:

void written_amount(unsigned int amount, char * buffer);

实现amount为16312,buffer中储存SIXTEEN THOUSAND THREE HUNDRED TEWLVE

#include <stdio.h>
#include <string.h>
//一千THOUSAND,一千的一千倍一百万MILLION,一百万的一千倍十亿BILLION,下面的数只是对一千以下的数进行num转字符串,更高位的只需三位分隔开,加上千,百万,十亿,单位即可。
int num_to_alp(unsigned int num, char * buffer)
{
if (num == 0) {
//返回0,标示num为0,便于后面不加thousand,billion单位
return 0;
}
static char *digits[] = {"", "ONE ", "TWO ", "THREE ", "FOUR ", "FIVE ", "SIX ", "SEVEN ", "EIGHT ", "NINE ", "TEN ", "ELEVEN ", "TWELVE ", "THIRTEEN ",
"FOURTEEN ", "FIFTEEN ", "SIXTEEN ", "SEVENTEEN ", "EIGHTEEN ", "NINETEEN " }; static char *tens[] = {"", "", "TWENTY ", "THIRTY ", "FORTY ", "FIFTY ", "SIXTY ", "SEVENTY ", "EIGHTY ", "NINETY "}; //如果百位有数,先添加百位
if (num / 100) {
int hud = num / 100;
strcat(buffer, digits[hud]);
strcat(buffer, "HUNDRED ");
} num = num % 100;
//对十位上的数判断处理,大于20用ty后缀,小于20用digits中字符串
int ten = num / 10; if (ten >= 2) {
//十位
strcat(buffer, tens[ten]);
//个位
num = num % 10;
strcat(buffer, digits[num]);
}else{
//小于20直接用digits中个位
strcat(buffer, digits[num]);
}
return 1;
} //将amount按三位分一组,进行分组。数组第一位指定组长eg 123456789 =>数组[3, 789, 456, 123]
unsigned int * div_amount(unsigned int amount)
{
unsigned int arr_amount[100]; unsigned int amount_dived;
int loc = 1;
do {
arr_amount[loc] = amount % 1000;
amount /= 1000;
loc++;
} while (amount); arr_amount[0] = loc - 1; return arr_amount;
} void written_amount(unsigned int amount, char *buffer)
{
if (amount == 0) {
strcat(buffer, "zero ");
}
//上千,百万,十亿,单位
static char *magnitudes[] = { "", "THOUSAND ", "MILLION ", "BILLION " };
//分割后的数组指针
unsigned int *dived_arr;
//分割的段数,数组长度
int len;
//分隔数字
dived_arr = div_amount(amount);
len = dived_arr[0]; //当分成三组时只需要magnitudes前三个
while (len > 0) {
          
//对每三个数字进行num转字符串
if (num_to_alp(dived_arr[len], buffer)) {
//如果三位数不是零,加上这三位数的单位
strcat(buffer, magnitudes[len - 1]);
}
len--;
}
}

  

 测试:

int main()
{
char buffer[1] = { '\0' };
unsigned int amount = 12345678910;
written_amount(amount, buffer);
printf("%s\n", buffer); buffer[0] = '\0';
amount = 1000001;
written_amount(amount, buffer);
printf("%s\n", buffer); buffer[0] = '\0';
amount = 1;
written_amount(amount, buffer);
printf("%s\n", buffer); buffer[0] = '\0';
amount = 0;
written_amount(amount, buffer);
printf("%s\n", buffer); while (1)
;
return 0;
}

  

 执行结果:

C和指针 第七章 习题的更多相关文章

  1. C和指针 第六章 习题

    6.1编写一个函数,它在一个字符串中进行搜索,查找所有在一个给定字符集中出现的字符,返回第一个找到的字符位置指针,未找到返回NULL #include <stdio.h> char * f ...

  2. C和指针 第十七章 习题

    17.8 为数组形式的树编写模块,用于从树中删除一个值,如果没有找到,程序节点 ArrayBinaryTree.c // // Created by mao on 16-9-18. // #inclu ...

  3. C和指针 第十三章 习题

    1,1标准输入读入字符,统计各类字符所占百分比 #include <stdio.h> #include <ctype.h> //不可打印字符 int isunprint(int ...

  4. C和指针 第十一章 习题

    1编写calloc,内部使用malloc函数获取内存 #include <stdio.h> #include <stdlib.h> void *myAlloc(unsigned ...

  5. C和指针 第七章 可变参数

    可变参数列表是通过stdarg.h内的宏来实现的: 类型 va_list 三个宏: va_start va_arg va_end 我们可以声明一个va_list变量,与这三个宏配合使用. 可变参数必须 ...

  6. C和指针 第七章 函数递归与迭代

    C语言通过运行时堆栈支持递归函数的实现,递归函数时直接或者间接调用自身的函数,经常有人拿斐波那契实现当做递归的实现,然后这样做效率并不高. n < 1;  Fib(1) =1 n = 2;  F ...

  7. C和指针 第五章 习题

    下列输出的值: #include <stdio.h> int func(){ static int count = 1; return ++count; } int main() { in ...

  8. C和指针 第四章 习题

    4.1正数的n的平方根可以通过: ai+1= (ai + n / ai ) / 2 得到,第一个a1是1,结果会越来越精确. #include <stdio.h> int main() { ...

  9. C和指针 第三章 习题

    在一个源文件中,有两个函数x和y,定义一个链接属性external储存类型static的变量a,且y可以访问,x不可以访问,该如何定义呢? #include <stdio.h> void ...

随机推荐

  1. 在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)

    说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...

  2. UVA11324 The Largest Clique[强连通分量 缩点 DP]

    UVA - 11324 The Largest Clique 题意:求一个节点数最大的节点集,使任意两个节点至少从一个可以到另一个 同一个SCC要选一定全选 求SCC 缩点建一个新图得到一个DAG,直 ...

  3. [No000071]C# 进制转换(二进制、十六进制、十进制互转)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. 【C#】【Thread】SpinLock

    SpinLock结构是一个低级别的互斥同步基元,它在等待获取锁时进行旋转. 在多核计算机上,当等待时间预计较短且极少出现争用情况时,SpinLock 的性能将高于其他类型的锁. 不过,我们建议您仅在通 ...

  5. 用纯css改变下拉列表select框的默认样式(不兼容IE10以下)

    在这篇文章里,我将介绍如何不依赖JavaScript用纯css来改变下拉列表框的样式.     事情是这样的,您的设计师团队向您发送一个新的PSD(Photoshop文档),它是一个新的网站的最终设计 ...

  6. Javascript四舍五入(Math.round()与Math.pow())

    代码 Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ ...

  7. 微信小程序--火车票查询

    微信小程序--火车票查询 写在最前面 微信小程序自九月份推出内测资格以来,经历了舆论热潮到现在看似冷清,但并不意味着大家不那么关注或者不关注了.我想不管是否有内测资格,只要是感兴趣的开发者已经进入潜心 ...

  8. Android ORM 框架之 greenDAO 使用心得

    前言 我相信,在平时的开发过程中,大家一定会或多或少地接触到 SQLite.然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等.所以,适用于 Android 的ORM  ...

  9. HTML5全局属性和事件详解

    属性: HTML5属性能够赋给标签元素含义和语境,下面的全局属性可用于任何 HTML5 元素. 属性 描述 contenteditable 规定是否允许用户编辑内容. contextmenu 规定元素 ...

  10. ubuntu搭建shad(-_-)owscoks(影梭)

    准备步骤 apt-get updateapt-get install python-gevent python-pippip install shadowsocks 新建一个json文件内容如下,文件 ...