C和指针 第七章 习题
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和指针 第七章 习题的更多相关文章
- C和指针 第六章 习题
6.1编写一个函数,它在一个字符串中进行搜索,查找所有在一个给定字符集中出现的字符,返回第一个找到的字符位置指针,未找到返回NULL #include <stdio.h> char * f ...
- C和指针 第十七章 习题
17.8 为数组形式的树编写模块,用于从树中删除一个值,如果没有找到,程序节点 ArrayBinaryTree.c // // Created by mao on 16-9-18. // #inclu ...
- C和指针 第十三章 习题
1,1标准输入读入字符,统计各类字符所占百分比 #include <stdio.h> #include <ctype.h> //不可打印字符 int isunprint(int ...
- C和指针 第十一章 习题
1编写calloc,内部使用malloc函数获取内存 #include <stdio.h> #include <stdlib.h> void *myAlloc(unsigned ...
- C和指针 第七章 可变参数
可变参数列表是通过stdarg.h内的宏来实现的: 类型 va_list 三个宏: va_start va_arg va_end 我们可以声明一个va_list变量,与这三个宏配合使用. 可变参数必须 ...
- C和指针 第七章 函数递归与迭代
C语言通过运行时堆栈支持递归函数的实现,递归函数时直接或者间接调用自身的函数,经常有人拿斐波那契实现当做递归的实现,然后这样做效率并不高. n < 1; Fib(1) =1 n = 2; F ...
- C和指针 第五章 习题
下列输出的值: #include <stdio.h> int func(){ static int count = 1; return ++count; } int main() { in ...
- C和指针 第四章 习题
4.1正数的n的平方根可以通过: ai+1= (ai + n / ai ) / 2 得到,第一个a1是1,结果会越来越精确. #include <stdio.h> int main() { ...
- C和指针 第三章 习题
在一个源文件中,有两个函数x和y,定义一个链接属性external储存类型static的变量a,且y可以访问,x不可以访问,该如何定义呢? #include <stdio.h> void ...
随机推荐
- google的云盘与公司网盘
很多人都很期待Google推出的云存储服务,也就是公司网盘.因为多数人相信,没有比google更适合做云存储的公司了,作为一个标准的Web公司或者说互联网公司,云端理所应当的优秀.但比起几年前听传言时 ...
- BZOJ 2120 数颜色&2453 维护队列 [带修改的莫队算法]【学习笔记】
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 3665 Solved: 1422[Submit][Status][Discuss] ...
- NYOJ 478
月老的烦恼(1) 描述 月老最近遇到了一个很棘手的问题,就是“剩男”“剩女”急速增长,而自己这边又人手不足导致天天都得加班.现在需要你来帮助月老解决这个问题,牵红绳的规则很简单:每个男生都一个编号n( ...
- 网盘的选择,百度网盘、google drive 还是 Dropbox
我是国内用户,需要越过Chinawall 我使用的是一枝红杏,用着还行 如果要买,结账时输入'laod80' 一枝红杏官网:官网地址 Dropbox: 稳定,速度快 Dropbox官网:链接 操作十分 ...
- jenkins,jmeter,ant报告模板
http://www.cnblogs.com/yangxia-test/p/5283139.html
- @Autowired 与@Resource的区别
1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2 @Autowired默认按类型装配(这个注解是属业spring的),默认情况下 ...
- PAT 1035. 插入与归并(25)
根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭 ...
- sql server 使用nolock提升性能
博客园有许多关于nolock的文章,大部分都写得很好,例如:http://www.cnblogs.com/huangxincheng/p/4292320.html 这里仅结合个人项目,作为个人笔记记录 ...
- 有border和没有border是两回事
id="box"设立border的话,里边的p样式为display:block;margin-top:20px; 如果你把margin-top的值不断添加的话,会显示为距borde ...
- session过期返回登录页面跳出frame
session 过期返回登录页面 方法1, HttpSession session = request.getSession(); String LOGIN_ID = (String) session ...