#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
使用宏实现两个数中求较大值
//#define MAX(a,b) (a)>(b)?(a):(b)
//
//int main()
//{
// int max = MAX(3,4);
// printf("max = %d",max);
// return 0;
//}
写一个宏可以将一个数字的奇数位和偶数位交换
//#define SWAP(a,b,c) (c = a) ; (a = b); (b = c)
//int main()
//{
// int i = 0;
// int a = 0;
// int j = 0;
// int m = 0;
// int n = 0;
// int tmp = 0;
// scanf("%d",&a);
// for(i=31;i>=0;i-=2)
// {
// j = i;
// m = (a>>j)&1;
// n = (a>>(j-1))&1;
// //tmp = m;
// //m = n;
// //n = tmp;
// SWAP(m,n,tmp); //(() = ();() = ();()=());
// printf("%d%d",m,n);
// }
// return 0;
//}
//#define SWAP(num) (num = ((num & 0xaaaaaaaa) >> 1) | ((num & 0x55555555) << 1))
//int main()
//{
// int num = 30;
// SWAP(num);
// printf("%d\n",num);
// return 0;
//}
#define _CRT_SECURE_NO_WARNINGS 1
#include
编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回 值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
//typedef unsigned int unit;
//#include
//unsigned int reverse_bit(unsigned int value)
//{
// int i = 0;
// unsigned int num = 0;
// for(i=0;i<32;i++)
// {
// //num = (unit)(num + ((value >> i) & 1) * pow(2,32-i-1));
// num |= ((value >> i) & 1) << (31 - i); //效率更高 (拿到那一位将它左移到对应位,进行或等就会得到翻转的值)
//
// }
// return num;
//}
//
//int main()
//{
// unsigned int i = 0;
// unsigned int ret = 0;
// scanf("%d",&i); //不能写成 scanf("%u",%i); 程序会崩溃
// ret = reverse_bit(i);
// printf("%u\n",ret);
// //printf("%d\n",sizeof(unit));
// return 0;
//}
不使用(a+b)/2这种方式,求两个数的平均值
方法一
//int Average(int x, int y)
//{
// return y+(x-y)/2;
//}
方法二
//00001010 10
//00010100 20
//
//00000000 &
//00011110 ^
//00001111 ^ >>1
首先,&得到的数字位,只有两个1才得到1,就是进位的1,
而本该向前进一位的1待在了本位。实际上
应该让得到的结果左移1(让进位的1进到合适的位置),
然后再右移1(除以2),得到进位的平均数。
然后,^得到的数字位,实际得到的是本位得到的结果(不包括进位),
让他右移1,得到本位的平均数。
两个平均数相加,得到整个数完整的平均数。
//#include
//int Average(int x, int y)
//{
// return (x & y) + ((x ^ y) >> 1); //(x&y) x和y相同位的平均值 (x^y)>>1 x和y不同位的平均值
//}
//
//int main()
//{
// int a = 25;
// int b = 15;
// int ret = 0;
// ret = Average(a,b);
// printf("%d\n",ret);
// return 0;
//}
编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
//int look_out(int *a, int len)
//{
// int i = 0;
// int ret = 0;
// for(i=0;i
#define _CRT_SECURE_NO_WARNINGS 1
//#include
递归和非递归分别实现求第n个斐波那契数
递归的方法
/*int Fib(int n)
{
if(n<=2)
{
return 1;
}
else
{
return Fib(n-1)+Fib(n-2);
}
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = Fib(n);
printf("ret = %d\n",ret);
return 0;
}*/
循环的方法
/*int Fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while(n>2)
{
c = a+b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = Fib(n);
printf("ret = %d\n",ret);
return 0;
}*/
编写一个函数实现n^k,使用递归实现
n^k = n*n^k-1
/*int second_party(int n ,int k)
{
if(k>0)
{
return second_party(n,k-1)*n;
}
else
{
return 1;
}
}
int main()
{
int n = 0;
int k = 0;
int ret = 0;
scanf("%d %d",&n,&k);
ret = second_party(n,k);
printf("n的k次方是:%d\n",ret);
return 0;
}*/
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
/*int dig_itsum(int n)
{
if((n/10)>0)
{
return n%10 + dig_itsum(n/10);
}
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = dig_itsum(n);
printf("ret = %d\n",ret);
return 0;
}*/
递归和非递归分别实现strlen
非递归
/*#include
int my_strlen(char *p)
{
int count = 0;
assert(p != NULL);
while(*p != '\0')
{
count++;
*p++;
}
return count;
}
int main()
{
char *ch = "abcdefg"; // 错误的写法char = "abcdef";
int i = 0;
i = my_strlen(ch);
printf("%d\n",i);
return 0;
}*/
递归
/*#include
int my_strlen(char *p)
{
assert(p != NULL);
if(*p != '\0')
{
return 1 + my_strlen(p+1);//错误的写法(*p+1)
}
else
{
return 0;
}
}
int main()
{
char *ch = "abcdefgh";
int i = 0;
i = my_strlen(ch);
printf("%d\n",i);
}*/
递归和非递归分别实现求n的阶乘
非递归
/*int Fun(int n)
{
int i = 0;
int ret = 1;
for(i = 1;i<=n;i++)
{
ret = ret * i;
}
return ret;
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = Fun(n);
printf("%d\n",ret);
return 0;
}*/
递归
/*int Fun(int n)
{
if(n<2)
{
return 1;
}
else
{
return n * Fun(n-1);
}
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = Fun(n);
printf("%d\n",ret);
return 0;
}*/
递归方式实现打印一个整数的每一位
/*void Fun(int num)
{
if(num >9)
{
Fun(num/10); // printf()不能写到 if语句的里面
}
printf("%d ",num%10);
}
int main()
{
int num = 0;
scanf("%d",&num);
Fun(num);
return 0;
}*/
编写一个函数reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中的字符串操作函数。
//#include
//void reverse_string(const char *p)
//{
// assert(p != NULL);
// if(*p != '\0')
// {
// reverse_string(p+1);
// }
// printf("%c ",*p);
//}
//
//int main()
//{
// char *ch = "abcdef";
// reverse_string(ch);
// return 0;
//}
#define _CRT_SECURE_NO_WARNINGS 1
//#include
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
找出这两个数字,编程实现。
//int Find(int sz, int arr[])
//{
// int i = 0;
// int ret = 0;
// for(i=0;i++;i1)
// {
// water = water + bottle/2;
// bottle = bottle/2+bottle%2;
// }
// return water;
// //return money*2-1;
//}
//int main()
//{
// int i = 0;
// int ret = 0;
// scanf("%d",&i);
// ret = Exchange(i);
// printf("%d\n",ret);
// return 0;
//}
模拟实现strcpy
//#include
//char *my_strcpy(char *dst, const char *src)
//{
// char *ret = dst;
// assert(dst != NULL);
// assert(src != NULL);
//
// while(*src != '\0')
// {
// *dst = *src;
// dst++;
// src++;
// }
// return dst;
//}
//char *my_strcpy(char *dst, const char *src)
//{
// char *ret = dst;
// assert(dst != NULL);
// assert(src != NULL);
//
// while(*dst++ = *src++)
// {
// ;
// }
// return dst;
//}
//
//int main()
//{
// char *ch = "abcdef";
// char buf[10] = {0};
// char *ret = my_strcpy(buf,ch);
// printf("buf:%s\n",buf);
// return 0;
//}
模拟实现strcat
//#include
//
//char *my_strcat(char *dst,const char *src)
//{
// char *ret = dst;
// assert(dst != NULL);
// assert(src != NULL);
// while(*dst)
// {
// dst++;
// }
// while(*dst++ = *src++)
// {
// ;
// }
// return ret;
//}
//
//int main()
//{
// char arr1[20] = "abcd"; //定义的数组大小要大于链接后的大小
// char arr2[] = "aefgh";
// //char *ret = my_strcat(arr1,arr2);
// my_strcat(arr1,arr2);
// printf("连接后的结果:%s\n",arr1);
// return 0;
//}
#define _CRT_SECURE_NO_WARNINGS 1
#include
作业19
模拟strcpy函数
//#include
//char *my_strcpy(char *dst, const char *src)
//{
// char *p = dst;
// assert(dst);
// assert(src);
// while(*dst++ = *src++)
// {
// ;
// }
// return dst;
//}
//
//int main()
//{
// char *cp = "abcde12345";
// char arr[20];
// printf("%s\n",cp);
// my_strcpy(arr,cp);
// printf("%s\n",arr);;
// return 0;
//}
模拟strcat(字符串拼接)
//#include
//char *my_strcat(char *dst, const char *src)
//{
// char *p = dst;
// assert(dst);
// assert(src);
// while(*dst) //while(*dst++) 错误的 //while((*dst)++) 错误的
// {
// dst++;
// }
// while(*dst++ = *src++)
// {
// ;
// }
// return p;
//}
//
//int main()
//{
// char arr[20] = "abcde";
// char *cp = "456789";
// printf("%s\n",arr);
// my_strcat(arr,cp);
// printf("%s\n",arr);
// return 0;
//}
模拟strstr(判断字符串1是不是字符串2的子串)
#include
#include
char *my_strstr(const char *dst,const char *src)
{
const char *end = dst + strlen(dst) - strlen(src) + 1; //优化的地方
const char *d = dst;
assert(dst);
assert(src);
while(d < end)
{
const char *p = d;
const char *s = src;
while(*s)
{
if(*p == *s)
{
p++;
s++;
}
else
{
break;
}
}
if(*s == '\0')
{
return d;
}
d++;
}
}
//#include
//char *my_strstr(const char *dst, const char *src)
//{
// const char *d = dst;
// assert(dst);
// assert(src);
// while(d)
// {
// const char *p = d;
// const char *s = src;
// while((*p != '\0') && (*s != '\0') && (*p == *s))
// {
// s++;
// p++;
// }
// if(*s == '\0')
// {
// return d;
// }
// d++;
// }
//}
//
//int main()
//{
// char *s = "abcdefg";
// char *p = "cdef";
// //char *ch = "higk";
// char * ret = my_strstr(s,p);
// //char * ret = my_strstr(s,ch);
// printf("%s\n",ret);
// return 0;
//}
//模拟实现strchr
//#include
//char *my_strchr(const char *dst, char c)
//{
// assert(dst);
// while((*dst != c) && (*dst != '\0'))
// {
// dst++;
// }
// return *dst == c ? dst:NULL;
//}
//
//int main()
//{
// char *s = "abcdef";
// char c = 'g';
// char *ret = my_strchr(s, c);
// printf("%s\n",ret);
// return 0;
//}
模拟实现strcmp
//#include
//int my_strcmp(const char *dst, const char *src)
//{
// assert(dst);
// assert(src);
// while(*dst != '\0' && *src != '\0')
// {
// if(*dst == *src)
// {
// dst++;
// src++;
// }
// else if(*dst > *src)
// {
// return 1;
// }
// else
// {
// return -1;
// }
// }
// if(*dst != '\0')
// {
// return 1;
// }
// if(*src != '\0')
// {
// return -1;
// }
// return 0;
//}
//#include
//int my_strcmp(const char *dst, const char *src)
//{
// int ret = 0;
// assert(dst);
// assert(src);
// while(!(ret = *(unsigned char *)dst - *(unsigned char *)src) && *src)
// {
// dst++;
// src++;
// }
// if(ret > 0)
// {
// ret = 1;
//
// }
// else
// {
// return -1;
// }
// return ret;
//}
//
//int main()
//{
// char *ch = "abcde";
// char *cp = "abcdef";
// int ret = my_strcmp(ch,cp);
// printf("%d\n",ret);
// return 0;
//}
模拟实现memcpy
//#include
//#include
//char *my_memcpy(void *dst, const void *src, int count)
//{
// char *d = dst;
// const char *s = src;
// assert(dst);
// assert(src);
// while(count--)
// {
// *d = *s;
// ++d;
// ++s;
// }
// return dst;
//}
//
//int main()
//{
// char p[] = "abcdef";
// char arr[10];
//
// //printf("%d\n",strlen(s));
// my_memcpy(arr,p,sizeof(p));
// printf("%s\n",arr);
// return 0;
//}
模拟实现memmove
//#include
//#include
//void *my_memmove(void *dst, const void *src, int count)
//{
// char *d = dst;
// const char *s = src;
// assert(dst);
// assert(src);
//
//if(s < d && s+count >d)
//{
// d = d + count -1;
// s = s + count -1;
// while(count--)
// {
// *d = *s;
// --d;
// --s;
// }
//}
//else
//{
// while(count--)
// {
// *d = *s;
// ++d;
// ++s;
// }
//}
// if(d <= s || s+count <= d) //错误的 if(d <= s && s+count <= d)
// {
// while(count--)
// {
// *d = *s;
// ++d;
// ++s;
// }
// }
// else
// {
// d = d + count -1;
// s = s + count -1;
// while(count--)
// {
// *d = *s;
// d--;
// s--;
// /*--s;
// --d;*/
// }
// }
//
// return dst;
//}
//
//int main()
//{
// char ch[64]= "abcdefghijk";
// my_memmove(ch,ch+1,strlen(ch));
// printf("%s\n",ch);
// return 0;
//}
#define _CRT_SECURE_NO_WARNINGS 1
///作业20
//int *p; --> 指针
//int arr[5]; --> 数组
//int *p[5]; --> 指针数组
//int (*p)[5]; --> 数组指针
//int *((*p)[5]); --> 指针数组的指针
//int *((*p)[10])[5]; --> 指针数组指针的数组
//int (*p[10])[5]; --> 数组指针数组
//int *(*p[5])[5]; --> 数组指针数组的指针
//
//
//int test() --> 函数的声明
//int *ptest() -->指针函数 //是否存在? 不存在
//viod *ptest() -->函数指针
//int (*ptest)() --> 函数指针
//
//(void (*)() 函数指针 --> void(*)()0 将0强转为函数指针 -->
//(void(*)()0) 对0这个函数指针解引用 --> (*(void(*)()0)() -->
//调用函数,这个函数为:无返回类型参数为空的函数
//
//void(*signal(int,void(*)(int)))(int);
//
//typedef void(*pfun_t)(int); -->定义了一个 函数指针类型
//返回值为void 参数为int 的函数指针类型
//
//pfun_t signal(int, pfun_t) --> 返回值为 函数指针 参数为 int和函数指针 的函数声明
//
//int (*p[5])() -->函数指针数组
//int *p[5]() --> 不存在这样的东西
//int (*)()p[5] -->错误的,语法错误
//
//int ((*p)[5])() -->数组指针函数
//int (*(*p)[5])() -->函数指针数组指针
//int (*(*p[10])[5])() -->函数指针数组指针的数组
#define _CRT_SECURE_NO_WARNINGS 1
#include
函数指针数组的用法(转移表) 计算器
//int add(int x, int y)
//{
// return x+y;
//}
//
//int sub(int x, int y)
//{
// return x-y;
//}
//
//int mul(int x, int y)
//{
// return x*y;
//}
//
//int div(int x, int y)
//{
// return x/y;
//}
//
//
//int main()
//{
// int input = 1; //初值不能为零
// int x = 0;
// int y = 0;
// int ret = 0;
// int (*p[5])(int x, int y) = {0,add,sub,mul,div}; //转移表
// while(input)
// {
// printf("*************************\n");
// printf("***1.add 2.sub***\n");
// printf("***3.mul 4.div***\n");
// printf("*************************\n");
// printf("请选择: ");
// scanf("%d",&input);
// if((input>0) && (input<5))
// {
// printf("请输入操作数 ");
// scanf("%d%d",&x,&y);
// ret = (*p[input])(x, y);
// }
// else
// {
// printf("选择错误");
// break;
// }
// printf("ret = %d\n",ret);
// printf("\n");
// printf("\n");
// printf("\n");
// printf("-------------------------\n");
// }
// return 0;
//}
回调函数
模拟实现qsort(采用冒泡法)
//int int_cmp(const void *x, const void *y)
//{
// int *a = (int *)x;
// int *b = (int *)y;
// return *a > *b ? 1 : *a < *b ? -1 : 0;
//}
//
//void swap(void *x, void *y,int size)
//{
// char *a = (char *)x;
// char *b = (char *)y;
// while(size--)
// {
// *a ^= *b;
// *b ^= *a;
// *a ^= *b;
// a++; //不能少
// b++;
// }
//}
//
//void bubble(void *arr, int count, int size, int(*cmp)(void *x, void *y))
//{
// int i = 0;
// int j = 0;
// int flag = 0;
// for(i = 0;i 0) //注意最后的>0
// {
// flag = 1;
// swap((char *)arr + j*size, (char *)arr + (j+1)*size, size);
// }
// }
// if(0 == flag)
// {
// break;
// }
// }
//}
//
//void print_arr(int arr[10], int sz)
//{
// int i = 0;
// for(i=0;i
#define _CRT_SECURE_NO_WARNINGS 1
#include
模拟实现strncat
//#include
//#include
//
//char *my_strncat(char *dst, const char *src, int num)
//{
// char *ret = dst;
// assert(dst);
// assert(src);
// while(*dst)
// {
// ++dst;
// }
// while(num--)
// {
// *dst = * src;
// dst++;
// src++;
// }
// return ret;
//}
//
//int main()
//{
// char arr[64] = "abcdefg";
// char *ch = "hijklmn";
// int sz = strlen(ch);
// char *ret = my_strncat(arr,ch,sz);
// printf("%s\n",ret);
// return 0;
//}
模拟实现strncpy
//#include
//#include
//char *my_strncpy(char *dst, const char *src, int num)
//{
// char *ret = dst;
// assert(dst);
// assert(src);
// while(num--)
// {
// *dst = *src;
// dst++;
// src++;
// }
// return ret;
//}
//
//int main()
//{
// char arr[64];
// char *ch = "opqrstuvwxyz";
// int sz = strlen(ch) + 1; //需要手动加\0
// char *ret = my_strncpy(arr,ch,sz);
// printf("%s\n",ret);
// return 0;
//}
模拟实现strncmp
//#include
//int my_strncmp(const char *p, const char *q, int num)
//{
// assert(p);
// assert(q);
// while(num--)
// {
// if(*p > *q)
// {
// return 1;
// }
// else if(*p < *q)
// {
// return -1;
// }
// else
// {
// p++;
// q++;
// }
// }
// return 0;
//}
//
//int main()
//{
// char *ch = "abcde";
// char *cp = "abcdef";
// int ret = my_strncmp(ch,cp,6);
// printf("%d\n",ret);
// return 0;
//}
#define _CRT_SECURE_NO_WARNINGS 1
//#include
交换俩个整形变量的值
//int main()
//{
解法一
//int a = 10;
//int b = 20;
//int c = 0;
//c = a;
//a = b;
//b = c;
//解法二
//int a = 34;
//int b = 26;
//a = a+b;
//b = a-b;
//a = a-b;
//解法三
//int a = 97;
//int b = 25;
//a = a^b;
//b = a^b;
//a = a^b;
//printf("%d,%d",a,b);
//return 0;
//}
求10 个整数中最大值(可以改变数组的值)
//int main()
//{
// int arr[] = {-6,-8,-4,-9,-2,-10,-7,2,-1,-5};
// int max = arr[0];
// int i = 0;
// for(i=1;i<10;i++)
// {
// if(arr[i]>max)
// {
// max = arr[i];
// }
// }
// printf("%d\n",max);
//return 0;
//}
将三个数按从大到小输出 或者 //用函数的方式
//void Swap(int *p1 , int *p2)
//{
// int tmp = *p1;
// *p1 = *p2;
// *p2 = tmp;
//}
//int main ()
//{
// int a = 0;
// int b = 0;
// int c = 0;
// int tmp = 0;
// scanf("%d %d %d",&a,&b,&c);
//
// if(a
//int main()
//{
// int i = 0;
// double sum = 0.0;
// double n = -1;
// for(i=1;i<=100;i++)
// {
// n = -1; //每次进入循环n都要初始化
// n = pow (n, (i+1));
// sum = sum + n * (1.0/i);
// }
// printf("%lf",sum);
//return 0;
//}
//int main()
//{
// int i = 0;
// double sum = 0.0;
// int flag = -1;
// for(i=1;i<=100;i++)
// {
// sum = sum+flag*1.0/i;
// flag = -flag;
// }
// printf("%lf",sum);
//return 0;
//}
将数组A中的内容和数组B中的内容进行交换
//int main ()
//{
// int arrA[] = {1,2,3,4,5,6,7,8,9,10};
// int arrB[] = {-1,-2,-3,-4,-5,-6,-7,-8,-9,-10};
// int tmp = 0;
// int i = 0;
// //int sz = sizeof(arrA)/sizeof(arrA[0]);
//
// //交换两个数组的内容
// for(i=0;i<10;i++) //for(i=0;i
//int main()
//{
// int i = 0;
// int bit = 1;
// for(i=0;i<1000;i++)
// {
// //计算是几位数
// //scanf("%d",&i);
// int tmp = i;
// int sum = 0;
// bit = 1; 这一句很重要(每一个数进来要将bit置1)
// while(tmp/10)
// {
// bit++;
// tmp = tmp/10;
// }
// //printf("%d",bit);
// 取下每一位
// tmp = i;
// while(tmp) //不能是(tmp%10),会将370 ,407 这样有零的数字丢失
// {
// sum = sum + pow(tmp%10,bit);
// tmp = tmp /10;
// }
// if(sum == i)
// {
// printf(" %d ", i );
// }
//
// }
// return 0;
//}
求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和
//int main()
//{
//
// int i = 0;
// int a = 0;
// int sn = 0;
// int ret = 0;
// int tmp = 0;
//
// scanf("%d%d",&a,&tmp);
// for(i=0;i
//int main()
//{
// int ch = 0;
// while((ch = getchar()) != EOF)
// {
// if((ch>='a')&&(ch<='z'))
// {
// putchar(toupper(ch));
// //putchar(ch-32);
// //putchar(ch-('a'-'A'));
// }
// else if((ch>='A')&&(ch<='Z'))
// {
// putchar(tolower(ch));
// //putchar(ch+32);
// //putchar(ch+'a'-'A');
// }
// }
//return 0;
//}
#define _CRT_SECURE_NO_WARNINGS 1
//#include
//int main()
//{
// //printf("file:%s line:%d\n",__FILE__,__LINE__);
// printf("date:%d time:%d",__DATE__,__TIME__);
// return 0;
//}
//int main()
//{
// int i = 0;
// int arr[10] = {0};
//
// for(i=0;i<=12;i++)
// {
// arr[i] = i;
// printf("hehe\n");
// }
// return 0;
//}
使用宏实现两个数中求较大值
//#define MAX(a,b) (a)>(b)?(a):(b)
//
//int main()
//{
// int max = MAX(3,4);
// printf("max = %d",max);
// return 0;
//}
写一个宏可以将一个数字的奇数位和偶数位交换
//#define SWAP(a,b,c) (c = a) ; (a = b); (b = c)
//int main()
//{
// int i = 0;
// int a = 0;
// int j = 0;
// int m = 0;
// int n = 0;
// int tmp = 0;
// scanf("%d",&a);
// for(i=31;i>=0;i-=2)
// {
// j = i;
// m = (a>>j)&1;
// n = (a>>(j-1))&1;
// //tmp = m;
// //m = n;
// //n = tmp;
// SWAP(m,n,tmp); //(() = ();() = ();()=());
// printf("%d%d",m,n);
// }
// return 0;
//}
计算奇数的个数
//int Detr(int arr[],int sz)
//{
// int i = 0;
// int count = 0;
// for(i=0;i2)&&(n>2))
// {
// printf("找不到\n");
// }
//}
//
//int main()
//{
// int arr[3][3] = {{1,2,3},{2,3,4},{3,4,5}};
// //int i = 0;
// //int j = 0;
// //for(i=0;i<3;i++)
// //{
// // for(j=0;j<3;j++)
// // {
// // printf("%d",arr[i][j]);
// // }
// // printf("\n");
// //}
// int key = 6;
// Rearch(arr,3,3,key);
// return 0;
//}
//
//#include
//int main()
//{
// char arr[] = "abcdef";
// //int sz = sizeof(arr)/sizeof(arr[0])-1;
// //Levo();
// //int sz = strlen(arr);
//
// printf("%d\n",arr);
//
//
// return 0;
//}
//int main()
//{
// int i = 0;
// int arr[10] = {0};
// for(i=0;i<=12;i++)
// {
// arr[i] = 0;
// printf("hehe\n");
// }
// return 0;
//}
//int main()
//{
// main();
// return 0;
//}
接受一个整型值(无符号),把它转换为字符并打印它
例如 输入1234 输出1 2 3 4
//void Print(int num)
//{
// if(num>9)
// {
// Print(num/10);
// }
// printf("%d ",num%10);
// //return num%10 ; 不能用return 无输出
//}
//
//int main()
//{
// int num = 1234;
// Print(num);
// return 0;
//}
编写函数不允许创建临时变量,求字符串长度
//#include
//int my_strlen(const char *str)
//{
// //int count = 0;
//
// assert(str != NULL);
//
// //while(*str != '\0')
// //{
// // count++;
// // *str++;
// //}
//
//
// if(*str != '\0')
// {
// //str++;
// return 1+my_strlen(str+1); //return 1+my_strlen(str);
// }
// else
// return 0;
//
// //return count;
//}
//
//
//int main()
//{
// char *ch = "abcdefghijklmn"; //不能写成char ch = "abcdef";
// int ret = my_strlen(ch);
// printf("%d\n",ret);
// return 0;
//}
//求n的阶乘
//
//int Fun(int n)
//{
// if(n<=1) //0的阶乘是1
// {
// return 1;
// }
// else
// {
// return n*Fun(n-1);
// }
//}
//
//int main()
//{
// int n = 0;
// int ret = 0;
// scanf("%d",&n);
// ret= Fun(n);
// printf("%d",ret);
// return 0;
//}
求第n个斐波那契数(不考虑溢出)
1 1 2 3 5 8 13 21 34 55 89 ......
循环方式
//int Fbc(int n)
//{
//
// int a = 1;
// int b = 1;
// int c = 1;
// while(n>2)
// {
// n = n-1;
// c = a+b;
// a = b;
// b = c;
//
// }
// return c;
//}
递归的方式
//Fbc(int n)
//{
//
// if(n<=2)
// return 1;
// else
// return Fbc(n-1)+Fbc(n-2);
//
//}
//int main()
//{
// int ret = 0;
// int n = 0;
// scanf("%d",&n);
// ret = Fbc(n);
// printf("%d",ret);
// return 0;
//}
//int main(int argc, char*argv[], char*envp[])
//{
// int i = 0;
// for(i=0;i
//int Add(int x, int y)
//{
// return x+y;
//}
//
//int Sub(int x, int y)
//{
// return x-y;
//}
//
//int Mul(int x, int y)
//{
// return x*y;
//}
//
//int Div(int x, int y)
//{
// return x/y;
//}
//
//int main(int argc, char*argv[], char*envp[])
//{
// int x = 0;
// int y = 0;
// int ret = 0;
// if(argc != 4)
// {
// printf("参数有误\n");
// return 1;
// }
// x = atoi(argv[2]);
// y = atoi(argv[3]);
// switch(*(argv[1]+1))
// {
// case'a':
// ret = Add(x, y);
// break;
// case's':
// ret = Sub(x, y);
// break;
// case'm':
// ret = Mul(x, y);
// break;
// case'd':
// ret = Div(x, y);
// break;
// }
// printf("ret = %d",ret);
// return 0;
//}
作业15
使用可变参数,实现函数,求函数参数的平均值
//#include
//int avervge(int n,...)
//{
// int i = 0;
// int sum = 0;
// va_list arg; ///是宏 不是函数
// // typedef char * va_list;
// va_start(arg,n);
// //#define va_start _crt_va_start
// //#define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
// // (arg = (char *) &(n))+(向上取整(1-4,取4;5-8,取8))
//
// for(i=0;i (*(&(n)+2+i)) ) 这里很容易出错,注意书写
// {
// max = max;
// }
// else
// {
// max = *(&(n)+2+i); 这里很容易出错,注意书写
// }
// }
//
// return max;
//}
//
//
//int main()
//{
// int max = 0;
// max = Max(5,7,25,5,3,36);
// printf("max = %d\n",max);
// return 0;
//}
求任意个数的平均值
//int average(int n,...)
//{
// int i = 0;
// int sum = 0;
// for(i=0;i0)
// {
// return second_party(n,k-1)*n;
// }
// else
// {
// return 1;
// }
//}
//
//int main()
//{
// int n = 0;
// int k = 0;
// int ret = 0;
// scanf("%d %d",&n,&k);
// ret = second_party(n,k);
// printf("n的k次方是:%d\n",ret);
// return 0;
//}
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
//int dig_itsum(int n)
//{
// while(n/10) //if((n/10)>0)
// {
// return n%10 + dig_itsum(n/10);
// }
//}
//
//int main()
//{
// int n = 0;
// int ret = 0;
// scanf("%d",&n);
// ret = dig_itsum(n);
// printf("ret = %d\n",ret);
// return 0;
//}
//#include
//int my_strlen(const char *p)
//{
// int count = 0;
// assert(p != NULL);
// while(*p != '\0')
// {
// count++;
// *p++;
// }
// return count;
//}
//
//int main()
//{
// char *ch = "abcdefg";
// int i = 0;
// i = my_strlen(ch);
// printf("%d\n",i);
// return 0;
//}
//#include
//int my_strlen(char *p)
//{
// assert(p != NULL);
// if(*p != '\0')
// {
// return 1 + my_strlen(p+1);// 错误的写法 (*p+1)
// }
// else
// {
// return 0;
// }
//}
//
//int main()
//{
// char *ch = "abcdefgh";
// int i = 0;
// i = my_strlen(ch);
// printf("%d\n",i);
//}
//void Fun(int num)
//{
// if(num >9)
// {
// Fun(num/10);
// }
// printf("%d ",num%10);
//}
//
//int main()
//{
// int num = 0;
// scanf("%d",&num);
// Fun(num);
// return 0;
//}
作业 15 递归
//#include
递归和非递归分别实现求第n个斐波那契数
递归的方法
/*int Fib(int n)
{
if(n<=2)
{
return 1;
}
else
{
return Fib(n-1)+Fib(n-2);
}
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = Fib(n);
printf("ret = %d\n",ret);
return 0;
}*/
循环的方法
/*int Fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while(n>2)
{
c = a+b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = Fib(n);
printf("ret = %d\n",ret);
return 0;
}*/
编写一个函数实现n^k,使用递归实现
n^k = n*n^k-1
/*int second_party(int n ,int k)
{
if(k>0)
{
return second_party(n,k-1)*n;
}
else
{
return 1;
}
}
int main()
{
int n = 0;
int k = 0;
int ret = 0;
scanf("%d %d",&n,&k);
ret = second_party(n,k);
printf("n的k次方是:%d\n",ret);
return 0;
}*/
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
/*int dig_itsum(int n)
{
if((n/10)>0)
{
return n%10 + dig_itsum(n/10);
}
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = dig_itsum(n);
printf("ret = %d\n",ret);
return 0;
}*/
递归和非递归分别实现strlen
非递归
/*#include
int my_strlen(char *p)
{
int count = 0;
assert(p != NULL);
while(*p != '\0')
{
count++;
*p++;
}
return count;
}
int main()
{
char *ch = "abcdefg"; // 错误的写法char = "abcdef";
int i = 0;
i = my_strlen(ch);
printf("%d\n",i);
return 0;
}*/
递归
/*#include
int my_strlen(char *p)
{
assert(p != NULL);
if(*p != '\0')
{
return 1 + my_strlen(p+1);//错误的写法(*p+1)
}
else
{
return 0;
}
}
int main()
{
char *ch = "abcdefgh";
int i = 0;
i = my_strlen(ch);
printf("%d\n",i);
}*/
递归和非递归分别实现求n的阶乘
非递归
/*int Fun(int n)
{
int i = 0;
int ret = 1;
for(i = 1;i<=n;i++)
{
ret = ret * i;
}
return ret;
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = Fun(n);
printf("%d\n",ret);
return 0;
}*/
递归
/*int Fun(int n)
{
if(n<2)
{
return 1;
}
else
{
return n * Fun(n-1);
}
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = Fun(n);
printf("%d\n",ret);
return 0;
}*/
递归方式实现打印一个整数的每一位
/*void Fun(int num)
{
if(num >9)
{
Fun(num/10); // printf()不能写到 if语句的里面
}
printf("%d ",num%10);
}
int main()
{
int num = 0;
scanf("%d",&num);
Fun(num);
return 0;
}*/
编写一个函数reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中的字符串操作函数。
//#include
//void reverse_string(const char *p)
//{
// assert(p != NULL);
// if(*p != '\0')
// {
// reverse_string(p+1);
// }
// printf("%c ",*p);
//}
//
//int main()
//{
// char *ch = "abcdef";
// reverse_string(ch);
// return 0;
//}
作业17
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
找出这两个数字,编程实现。
//int Find(int sz, int arr[])
//{
// int i = 0;
// int ret = 0;
// for(i=0;i++;i1)
// {
// water = water + bottle/2;
// bottle = bottle/2+bottle%2;
// }
// return water;
// //return money*2-1;
//}
//int main()
//{
// int i = 0;
// int ret = 0;
// scanf("%d",&i);
// ret = Exchange(i);
// printf("%d\n",ret);
// return 0;
//}
模拟实现strcpy
//#include
//char *my_strcpy(char *dst, const char *src)
//{
// char *ret = dst;
// assert(dst != NULL);
// assert(src != NULL);
//
// while(*src != '\0')
// {
// *dst = *src;
// dst++;
// src++;
// }
// return ret;
//}
//char *my_strcpy(char *dst, const char *src)
//{
// char *ret = dst;
// assert(dst != NULL);
// assert(src != NULL);
//
// while(*dst++ = *src++)
// {
// ;
// }
// return ret;
//}
//
//int main()
//{
// char *ch = "abcdef";
// char buf[10] = {0};
// char *ret = my_strcpy(buf,ch);
// printf("buf:%s\n",buf);
// return 0;
//}
模拟实现strcat
//#include
//
//char *my_strcat(char *dst,const char *src)
//{
// char *ret = dst;
// assert(dst != NULL);
// assert(src != NULL);
// while(*dst)
// {
// dst++;
// }
// while(*dst++ = *src++)
// {
// ;
// }
// return ret;
//}
//
//int main()
//{
// char arr1[20] = "abcd"; //定义的数组大小要大于链接后的大小
// char arr2[] = "aefgh";
// //char *ret = my_strcat(arr1,arr2);
// my_strcat(arr1,arr2);
// printf("连接后的结果:%s\n",arr1);
// return 0;
//}
#define _CRT_SECURE_NO_WARNINGS 1
//#include
计算器
//#include
//int Add(int x, int y)
//{
// return x+y;
//}
//
//int Sub(int x, int y)
//{
// return x-y;
//}
//
//int Mul(int x, int y)
//{
// return x*y;
//}
//
//int Div(int x, int y)
//{
// return x/y;
//}
//
//int main(int argc, char*argv[], char*envp[])
//{
// int x = 0;
// int y = 0;
// int ret = 0;
// if(argc != 4)
// {
// printf("参数有误\n");
// return 1;
// }
// x = atoi(argv[2]);
// y = atoi(argv[3]);
// switch(*(argv[1]+1))
// {
// case'a':
// ret = Add(x, y);
// break;
// case's':
// ret = Sub(x, y);
// break;
// case'm':
// ret = Mul(x, y);
// break;
// case'd':
// ret = Div(x, y);
// break;
// }
// printf("ret = %d\n",ret);
// return 0;
//}
冒泡排序可以排序字符串
//#include
//void Swap(char *x,char *y)
//{
// assert(x);
// assert(y);
// *x ^= *y;
// *y ^= *x;
// *x ^= *y;
//}
//
数组下标索引的方式
//void bubble_sort(char arr[],int len)
//{
// int i = 0;
// int j = 0;
// for(i=0;iarr[j+1])
// {
// flag = 1;
// Swap(&arr[j],&arr[j+1]);
//
// }
// }
// if(0 == flag) //
// {
// break;
// }
// }
//}
指针的方式1
//void bubble_sort(char *arr, int len)
//{
// char *start = arr;
// char *end = (arr+len-1);
// assert(arr);
// while(end > arr)
// {
// int flag = 0;
// for(start = arr; start < end; start++)
// {
//
// if(*start > *(start+1))
// {
// Swap(start,(start+1)); //传的本身就是地址
// flag = 1;
// }
//
// }
if(!flag)
// {
// break;
// }
// end--; // 不能忘记
// }
//}
指针的方式2
void bubble_sort(char *arr,int len)
{
char *start = arr;
char *end = arr+len-1;
for(end =(arr+len-1);end > arr;end--)
{
int flag = 0;
for(start = arr;start < end;start++)
{
if(*start >*(start+1))
{
Swap(start,start+1);//传的本身就是地址
flag = !flag;
}
}
if(0 == flag)
{
break;
}
}
}
//void Show(char arr[],int len)
//{
// int i = 0;
// for(i=0;i
//int main()
//{
// char arr[] = "kjhadsbc";
// //printf("%d\n",strlen(ch));
// int len = 0;
// len = sizeof(arr)/sizeof(arr[0])-1;
// //len = strlen(arr);
// Show(arr,len);
// bubble_sort(arr,len);
// Show(arr,len);
// return 0;
//}
//int main()
//{
// int count = 0;
// char ch = 0;
// while((ch = getchar()) != EOF)
// {
// if(ch == '{')
// count++;
// else if((ch == '}') && (count == 0))
// {
// printf("不匹配\n");
// return 0;
// }
// else if(ch == '}')
// count--;
// }
// if(count == 0)
// printf("匹配\n");
// else
// printf("不匹配\n");
// return 0;
//}
//杨氏矩阵
//有一个二维数组.
//数组的每行从左到右是递增的,每列从上到下是递增的.
//在这样的数组中查找一个数字是否存在。
//时间复杂度小于O(N);
//
//数组:
//1 2 3
//2 3 4
//3 4 5
//
//
//1 3 4
//2 4 5
//4 5 6
数组的方式
//int Seek(int arr[][4],int row, int key)
//{
// int i = 0;
// int j = row-1;
// while(i=0)
// {
// if(arr[i][j] == key)
// {
// printf("存在\n");
// return 0;
// }
// else if(arr[i][j] > key)
// {
// j--;
// }
// else
// {
// i++;
// }
// }
// printf("不存在\n");
// return 0;
//}
指针的方式
//#include
//int Seek(int *arr, int row , int col, int key)
//{
// int i = 0;
// int j = col -1;
// assert(arr);
// //printf("arr=%d\narr+1 = %d\n",arr,arr+1);
// while(i=0)
// {
// if(arr[i*col+j] == key)
// {
// printf("存在\n");
// return 0;
// }
// else if(arr[i*col+j] > key)
// {
// j--;
// }
// else
// {
// i++;
// }
// }
// printf("不存在\n");
// return 0;
//}
//
//
//int main()
//{
// int arr[][4] = { {1,4,7,10},
// {9,12,15,18},
// {17,20,23,26},
// {25,28,31,34},
// };
//
// int key = 0;
// printf("请输入要查找的数:> ");
// scanf("%d",&key);
// //Seek(arr,4,key);
// //printf("%d\n",*(int*)arr+1);
// //printf("arr=%d\n(int*)arr=%d\n&arr=%d",arr,(int*)arr,&arr);
// Seek((int*)arr,4,4,key);
// return 0;
//}
#define _CRT_SECURE_NO_WARNINGS 1
//#include
作业19
模拟strcpy函数
//#include
//char *my_strcpy(char *dst, const char *src)
//{
// char *p = dst;
// assert(dst);
// assert(src);
// while(*dst++ = *src++)
// {
// ;
// }
// return dst;
//}
//
//int main()
//{
// char *cp = "abcde12345";
// char arr[20];
// printf("%s\n",cp);
// my_strcpy(arr,cp);
// printf("%s\n",arr);;
// return 0;
//}
模拟strcat(字符串拼接)
//#include
//char *my_strcat(char *dst, const char *src)
//{
// char *p = dst;
// assert(dst);
// assert(src);
// while(*dst) //while(*dst++) 错误的 //while((*dst)++) 错误的
// {
// dst++;
// }
// while(*dst++ = *src++)
// {
// ;
// }
// return p;
//}
//
//int main()
//{
// char arr[20] = "abcde";
// char *cp = "456789";
// printf("%s\n",arr);
// my_strcat(arr,cp);
// printf("%s\n",arr);
// return 0;
//}
模拟strstr(判断字符串1是不是字符串2的子串)
//#include
//#include
//char *my_strstr(const char *dst,const char *src)
//{
// const char *end = dst + strlen(dst) - strlen(src) + 1; //优化的地方
// const char *d = dst;
// assert(dst);
// assert(src);
// while(d < end)
// {
// const char *p = d;
// const char *s = src;
// while(*s)
// {
// if(*p == *s)
// {
// p++;
// s++;
// }
// else
// {
// break;
// }
// }
// if(*s == '\0')
// {
// return d;
// }
// d++;
// }
//
//}
//#include
//char *my_strstr(const char *dst, const char *src)
//{
// char *d = dst;
// assert(dst);
// assert(src);
// while(d)
// {
// const char *p = d;
// const char *s = src;
// while((*p != '\0') && (*s != '\0') && (*p == *s))
// {
// s++;
// p++;
// }
// if(*s == '\0')
// {
// return d;
// }
// d++;
// }
//}
//
//int main()
//{
// char *s = "abcdefg";
// char *p = "cdef";
// //char *ch = "higk";
// char * ret = my_strstr(s,p);
// //char * ret = my_strstr(s,ch);
// printf("%s\n",ret);
// return 0;
//}
模拟实现strchr
//
//#include
//char *my_strchr(const char *dst, char c)
//{
// assert(dst);
// while((*dst != c) && (*dst != '\0'))
// {
// dst++;
// }
// return *dst == c ? dst:NULL;
//}
//
//int main()
//{
// char *s = "abcdef";
// char c = 'g';
// char *ret = my_strchr(s, c);
// printf("%s\n",ret);
// return 0;
//}
模拟实现strcmp
//#include
//int my_strcmp(const char *dst, const char *src)
//{
// assert(dst);
// assert(src);
// while(*dst != '\0' && *src != '\0')
// {
// if(*dst == *src)
// {
// dst++;
// src++;
// }
// else if(*dst > *src)
// {
// return 1;
// }
// else
// {
// return -1;
// }
// }
// if(*dst != '\0')
// {
// return 1;
// }
// if(*src != '\0')
// {
// return -1;
// }
// return 0;
//}
//#include
//int my_strcmp(const char *dst, const char *src)
//{
// int ret = 0;
// assert(dst);
// assert(src);
// while(!(ret = *(unsigned char *)dst - *(unsigned char *)src) && *src)
// {
// dst++;
// src++;
// }
// if(ret > 0)
// {
// ret = 1;
//
// }
// else
// {
// return -1;
// }
// return ret;
//}
//
//int main()
//{
// char *ch = "abcde";
// char *cp = "abcdef";
// int ret = my_strcmp(ch,cp);
// printf("%d\n",ret);
// return 0;
//}
模拟实现memcpy
//#include
//#include
//char *my_memcpy(void *dst, const void *src, int count)
//{
// char *d = dst;
// const char *s = src;
// assert(dst);
// assert(src);
// while(count--)
// {
// *d = *s;
// ++d;
// ++s;
// }
// return dst;
//}
//
//int main()
//{
// char p[] = "abcdef";
// char arr[10];
//
// //printf("%d\n",strlen(s));
// my_memcpy(arr,p,sizeof(p));
// printf("%s\n",arr);
// return 0;
//}
模拟实现memmove
//#include
//#include
//void *my_memmove(void *dst, const void *src, int count)
//{
// char *d = dst;
// const char *s = src;
// assert(dst);
// assert(src);
//
//if(s < d && s+count >d)
//{
// d = d + count -1;
// s = s + count -1;
// while(count--)
// {
// *d = *s;
// --d;
// --s;
// }
//}
//else
//{
// while(count--)
// {
// *d = *s;
// ++d;
// ++s;
// }
//}
// if(d <= s || s+count <= d) //错误的 if(d <= s && s+count <= d)
// {
// while(count--)
// {
// *d = *s;
// ++d;
// ++s;
// }
// }
// else
// {
// d = d + count -1;
// s = s + count -1;
// while(count--)
// {
// *d = *s;
// d--;
// s--;
// /*--s;
// --d;*/
// }
// }
//
// return dst;
//}
//
//int main()
//{
// char ch[64]= "abcdefghijk";
// my_memmove(ch,ch+1,strlen(ch));
// printf("%s\n",ch);
// return 0;
//}
作业20
//int *p; --> 指针
//int arr[5]; --> 数组
//int *p[5]; --> 指针数组
//int (*p)[5]; --> 数组指针
//int *((*p)[5]); --> 指针数组的指针
//int *((*p)[10])[5]; --> 指针数组指针的数组
//int (*p[10])[5]; --> 数组指针数组
//int *(*p[5])[5]; --> 数组指针数组的指针
//
//
//int test() --> 函数的声明
//int *ptest() -->指针函数 //是否存在? 是
//int (*ptest)() --> 函数指针
//
//(void (*)() 函数指针 --> void(*)()0 将0强转为函数指针 -->
//(void(*)()0) 对0这个函数指针解引用 --> (*(void(*)()0)() -->
//调用函数,这个函数为:无返回类型参数为空的函数
//
//void(*signal(int,void(*)(int)))(int);
//
//typedef void(*pfun_t)(int); -->定义了一个 函数指针类型
//返回值为void 参数为int 的函数指针类型
//
//pfun_t signal(int, pfun_t) --> 返回值为 函数指针 参数为 int和函数指针 的函数声明
//
//int (*p[5])() -->函数指针数组
//int *p[5]() --> 不存在这样的东西
//int (*)()p[5] -->错误的,语法错误
//
//int ((*p)[5])() -->数组指针函数
//int (*(*p)[5])() -->函数指针数组指针
//int (*(*p[10])[5])() -->函数指针数组指针的数组
求一个整数存储在内存中的二进制中1的个数
//int Count(int num)
//{
// int count = 0;
// while(num)
// {
// count++;
// num &= (num-1);
// }
// return count;
//}
//
//int main()
//{
// int a = 0;
// int ret = 0;
// scanf("%d",&a);
// ret = Count(a);
// printf("%d\n",ret);
// return 0;
//}
函数指针数组的用法(转移表) 计算器
//int add(int x, int y)
//{
// return x+y;
//}
//
//int sub(int x, int y)
//{
// return x-y;
//}
//
//int mul(int x, int y)
//{
// return x*y;
//}
//
//int div(int x, int y)
//{
// return x/y;
//}
//
//
//int main()
//{
// int input = 1; //初值不能为零
// int x = 0;
// int y = 0;
// int ret = 0;
// int (*p[5])(int x, int y) = {0,add,sub,mul,div}; //转移表
// while(input)
// {
// printf("*************************\n");
// printf("***1.add 2.sub***\n");
// printf("***3.mul 4.div***\n");
// printf("*************************\n");
// printf("请选择: ");
// scanf("%d",&input);
// if((input>0) && (input<5))
// {
// printf("请输入操作数 ");
// scanf("%d%d",&x,&y);
// ret = (*p[input])(x, y);
// }
// else
// {
// printf("选择错误");
// break;
// }
// printf("ret = %d\n",ret);
// printf("\n");
// printf("\n");
// printf("\n");
// printf("-------------------------\n");
// }
// return 0;
//}
回调函数
模拟实现qsort(采用冒泡法)
//int int_cmp(const void *x, const void *y)
//{
// int *a = (int *)x;
// int *b = (int *)y;
// return *a > *b ? 1 : *a < *b ? -1 : 0;
//}
//
//void swap(void *x, void *y,int size)
//{
// char *a = (char *)x;
// char *b = (char *)y;
// while(size--)
// {
// *a ^= *b;
// *b ^= *a;
// *a ^= *b;
// a++; //不能少
// b++;
// }
//}
//
//void bubble(void *arr, int count, int size, int(*cmp)(void *x, void *y))
//{
// int i = 0;
// int j = 0;
// int flag = 0;
// for(i = 0;i 0) //注意最后的>0
// {
// flag = 1;
// swap((char *)arr + j*size, (char *)arr + (j+1)*size, size);
// }
// }
// if(0 == flag)
// {
// break;
// }
// }
//}
//
//void print_arr(int arr[10], int sz)
//{
// int i = 0;
// for(i=0;i
//#include
//
//char *my_strncat(char *dst, const char *src, int num)
//{
// char *ret = dst;
// assert(dst);
// assert(src);
// while(*dst)
// {
// ++dst;
// }
// while(num--)
// {
// *dst = * src;
// dst++;
// src++;
// }
// return ret;
//}
//
//int main()
//{
// char arr[64] = "abcdefg";
// char *ch = "hijklmn";
// int sz = strlen(ch);
// char *ret = my_strncat(arr,ch,sz);
// printf("%s\n",ret);
// return 0;
//}
模拟实现strncpy
//#include
//#include
//char *my_strncpy(char *dst, const char *src, int num)
//{
// char *ret = dst;
// assert(dst);
// assert(src);
// while(num--)
// {
// *dst = *src;
// dst++;
// src++;
// }
// return ret;
//}
//
//int main()
//{
// char arr[64];
// char *ch = "opqrstuvwxyz";
// int sz = strlen(ch) + 1; //需要手动加\0
// char *ret = my_strncpy(arr,ch,sz);
// printf("%s\n",ret);
// return 0;
//}
模拟实现strncmp
//#include
//int my_strncmp(const char *p, const char *q, int num)
//{
// assert(p);
// assert(q);
// while(num--)
// {
// if(*p > *q)
// {
// return 1;
// }
// else if(*p < *q)
// {
// return -1;
// }
// else
// {
// p++;
// q++;
// }
// }
// return 0;
//}
//
//int main()
//{
// char *ch = "abcde";
// char *cp = "abcdef";
// int ret = my_strncmp(ch,cp,6);
// printf("%d\n",ret);
// return 0;
//}
//int main()
//{
// int i = 0;
// printf("请输入要转换的十进制数: \n");
// scanf("%d",&i);
// printf("该数转换为十六进制数为:%x\n",i );
// return 0;
//}
//int *f1(void)
//{
// int x = 10;
// return &x;
//}
//
//int main()
//{
// int *ret = f1();
// printf("%d\n",*ret);
// return 0;
//}
//struct B
//{
// int a;
//};
//
//typedef struct A
//{
// int a;
// char b;
// double c;
// float d;
// struct A *obj;
//}x;
//struct B
//{
// int a;
// char b;
//}*p,arr[20];
//struct B;
//struct A
//{
// int x;
// struct B *b;
//};
//
//struct B
//{
// int y;
// struct A *a;
//};
//struct A
//{
// char a;
// int c;
// char b;
//};
//
//
//int main()
//{
// printf("%d\n",sizeof(struct A));
// //struct point p2 = {1,2};
// //p1.x = 1;
// //p1.y = 2;
// //p1 = {1,2}; //错误
// //x obx;
// //printf("%#p\n",&x);
// //printf("%#p\n",&(x.a));
// //printf("%#p\n",&(x.b));
// //printf("%#p\n",&(x.c));
// //printf("%#p\n",&(x.d));
// //struct A *p = &x;
// //x.a = 10;
// //x.b = 'A';
// //
// //p->a = 300;
// //p->b = 'C';
// //(*p).a = 20;
// //(*p).b = 'B';
// //p = &x; //错误的
// return 0;
//}
将8个比特为的某一位改为flag
//void fun(int i, int step, int flag)
//{
// int j = 0;
// for(j = 7;j>=0;j--)
// {
// if(j == (8-step+1))
// {
// if(((i >> j) & 1) == flag)
// {
// printf("%d",(i >> j) & 1);
// }
// else
// {
// printf("%d",!((i >> j) & 1));
// }
// }
//
// else
// {
// printf("%d",(i >> j) & 1);
// }
// }
//}
//
//
//int main()
//{
// char a = 5;
// fun(a,5,1);
// return 0;
//}
编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回 值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
//typedef unsigned int unit;
//#include
//unsigned int reverse_bit(unsigned int value)
//{
// int i = 0;
// unsigned int num = 0;
// for(i=0;i<32;i++)
// {
// //num = (unit)(num + ((value >> i) & 1) * pow(2,32-i-1));
// num |= ((value >> i) & 1) << (31 - i); //效率更高 (拿到那一位将它左移到对应位,进行或等就会得到翻转的值)
//
// }
// return num;
//}
//
//int main()
//{
// unsigned int i = 0;
// unsigned int ret = 0;
// scanf("%d",&i); //不能写成 scanf("%u",%i); 程序会崩溃
// ret = reverse_bit(i);
// printf("%u\n",ret);
// //printf("%d\n",sizeof(unit));
// return 0;
//}
不使用(a+b)/2这种方式,求两个数的平均值
方法一
//int Average(int x, int y)
//{
// return y+(x-y)/2;
//}
方法二
//00001010 10
//00010100 20
//
//00000000 &
//00011110 ^
//00001111 ^ >>1
首先,&得到的数字位,只有两个1才得到1,就是进位的1,
而本该向前进一位的1待在了本位。实际上
应该让得到的结果左移1(让进位的1进到合适的位置),
然后再右移1(除以2),得到进位的平均数。
然后,^得到的数字位,实际得到的是本位得到的结果(不包括进位),
让他右移1,得到本位的平均数。
两个平均数相加,得到整个数完整的平均数。
//#include
//int Average(int x, int y)
//{
// return (x & y) + ((x ^ y) >> 1); //(x&y) x和y相同位的平均值 (x^y)>>1 x和y不同位的平均值
//}
//
//int main()
//{
// int a = 25;
// int b = 15;
// int ret = 0;
// ret = Average(a,b);
// printf("%d\n",ret);
// return 0;
//}
编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
//int look_out(int *a, int len)
//{
// int i = 0;
// int ret = 0;
// for(i=0;i
区间位左闭右闭
//int banary_search(int arr[], int len, int num)
//{
// int left = 0;
// int right = len - 1; //[ ]左闭右闭的情况
//
// while(left <= right) 要小于等于
// {
// int mid = left + ((right - left) >> 1);//
// if(arr[mid] == num)
// {
// return mid;
// }
// else if(arr[mid] < num)
// {
// left = mid + 1; //保证左闭
// //mid = left + ((right - left)/2);
// //mid = left + ((right - left) >> 1);
// //mid = (left & right) + ((left ^ right) >> 1);
// }
// else
// {
// right = mid - 1; //保证右闭
// //mid = left + ((right - left)/2);
// //mid = left + ((right - left) >> 1);
// //mid = (left & right) + ((left ^ right) >> 1);
// }
// }
// return -1;
//}
区间为左闭右开
//int banary_search(int *arr, int len, int num)
//{
// int left = 0;
// int right = len; // [ ) 左闭右开
//
// while(left < right) //
// {
// int mid = (left & right) + ((left ^ right) >> 1);//
//
// if(arr[mid] == num)
// {
// return mid;
// }
// else if(arr[mid] < num)
// {
// left = mid + 1; //
// //mid = (left & right) + ((left ^ right) >> 1);
// }
// else
// {
// right = mid;
// //right = mid - 1; //如果恰巧middle-1就是查找的元素,那么就会找不到这个元素
// //mid = (left & right) + ((left ^ right) >> 1);
// }
// }
// return -1;
//}
递归的方式 (时间复杂度O(log2 n) 空间复杂度O(n))
//int banary_search(int arr[], int left, int right, int num)
//{
// int mid = (left & right) + ((left ^ right) >> 1);
// if(left > right)
// {
// return -1;
// }
// else
// {
// if(arr[mid] == num)
// return mid;
// else if(arr[mid] < num)
// banary_search(arr,mid+1,right,num); //
// else
// banary_search(arr,left,mid-1,num); //
// }
//}
//
//
//int main()
//{
// int arr[] = {1,2,3,4,5,6,7,8,9,10};
// //int len = sizeof(arr)/sizeof(arr[0]);
// int left = 0;
// int right = sizeof(arr)/sizeof(arr[0])-1;
// int ret = banary_search(arr,left,right,5);
// //int ret = banary_search(arr,len,5);
// printf("%d\n",ret);
// return 0;
//}
斐波那契数列(循环方式)(时间复杂度 O(n) 空间复杂度 O(1))
//int fibonacci_sequence(int n)
//{
// int a = 1;
// int b = 1;
// int c = 1;
// while(n>2)
// {
// c = a + b;
// a = b;
// b = c;
// --n;
// }
// return c;
//
//}
//0 1 1 2 3 5 8 13 21 34 55
递归方式(时间复杂度O(2^n) 空间复杂度O(n))
//int fibonacci_sequence(int n)
//{
// if(n<3)
// return 1;
// return fibonacci_sequence(n-1)+fibonacci_sequence(n-2);
//}
//
//int main()
//{
// printf("%d\n",fibonacci_sequence(7));
// return 0;
//}
#define _CRT_SECURE_NO_WARNINGS 1
//#include
猜数字游戏
#include
#include
//#include
//#include
//enum Option
//{
// EXIT,
// PLAY,
//};
//
//void menu()
//{
// printf("*************************\n");
// printf("*** 1.play 0.exit ***\n");
// printf("*************************\n");
//
//}
//
//void game()
//{
// int ret=0;
// int num=0;
// ret = rand()%100+1;
// while(1)
// {
// printf("请猜数字; ");
// scanf("%d",&num);
// if(num == ret)
// {
// printf("恭喜你,猜对了\n");
// break;
// }
// else if(num>ret)
// {
// printf("猜大了\n");
// }
// else
// {
// printf("猜小了\n");
// }
// }
//}
//
//int main()
//{
// int input=0;
// srand((unsigned int)time(NULL));
// do
// {
// menu();
// printf("请选择: ");
// scanf("%d",&input);
// switch(input)
// {
// case 1:
// game();
// break;
// case 0:
// break;
// default:
// printf("选择错误\n");
// break;
// }
// }
// while (input);
//
//return 0;
//}
用2分法查找数组里面的元素,找到时返回该元素下标
//int main()
//{
// int key = 10;
// int arr[] = {0,1,2,3,4,5,6,7,8,9};
// int left = 0;
// int right = sizeof(arr)/sizeof(arr[0])-1;
// int mid = left+(right-left)/2;
//
// while(left<=right)
// {
// mid=left+(right-left)/2;
// if(arr[mid]==key) // 切记: 比较的时候不能写为 if(arr==key)
// {
// printf("找到了\n");
// printf("%d\n",mid);
// break;
// }
// else if(arr[mid]right)
// {
// printf ("没找到\n");
// }
//
//return 0;
//}
模拟用户登录密码只有3次输入机会
//#include
//int main()
//{
// int i = 0;
// char passwed [10] = {0};
//
// while(i<3) //或者用for(i=0;i<3;i++)则去掉后面的i++。continue有没有不影响
// {
// printf("请输入密码\n:");
// scanf("%s",&passwed); // 切记 :前俩句不能放在循环外部。一定要放在循环内部,因为每次都要输入密码再判断。
// if(0 == strcmp(passwed,"123456"))
// {
// printf("登陆成功!\n");
// break;
// }
// else
// {
// printf("密码错误!\n");
// i++;
// continue; //结束本次循环,进入下次循环的判断部分
// }
// }
// if(i == 3)
// {
// printf("退出系统!");
// }
//
//return 0;
//}
计算有几位
// int main()
// {
// int i = 0;
// int m = 0;
// int bit = 1;
// scanf("%d",&i);
// m=i;
// while(m/10)
// {
// bit++;
// m=m/10;
// }
// return 0;
// }
写一个函数返回参数二进制中 1 的个数
i大于15和负数 没有输出
//int main()
//{
// int i = 0;
// int count = 0;
// scanf("%d",&i);
// while(i)
// {
// if(i%2 == 1)
// {
// count++;
// i=i/2;
// }
// }
// printf("%d",count);
//return 0;
//}
//int main()
//{
// int num = 0;
// int i = 0;
// int count = 0;
// scanf("%d",&num);
// for(i=0;i<32;i++)
// {
// if(((num>>i) & 1) == 1)
// {
// count++;
// }
// }
// printf("%d",count);
// return 0;
//}
//int main()
//{
// int num = 0;
// int count = 0;
// scanf("%d",&num);
// while(num)
// {
// count++;
// num = num & (num-1);
// }
// printf("%d",count);
// return 0;
//}
获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列
//int main()
//{
// int i = 0;
// int j = 0;
// int a = 0;
// scanf("%d",&i);
// printf("奇数位\n");
// for(j=0;j<31;j+=2)
// {
// //先打印奇数位
// i=i >> j;
// a=i & 1;
// printf("%d",a);
// }
// //打印偶数位
// printf("\n");
// printf("偶数位\n");
// for(j=1;j<32;j+=2)
// {
// i = i >> j;
// a = i & 1;
// printf("%d",a);
// }
//return 0;
//}
//输出一个整数的每一位
//int main ()
//{
// int i = 0;
// int tmp = 0;
// int bit = 1;
// scanf("%d",&i);
//
// // 计算这个数有几位
// tmp = i;
// while(tmp/10)
// {
// bit++;
// tmp=tmp/10;
// }
// // 取下每一位的数字
// while(i%10)
// {
// printf("%d\n",i%10);
// i=i/10;
// }
//
//return 0;
//}
编程实现:
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
//int main()
//{
// int m = 0;
// int n = 0;
// int i = 0;
// int count = 0;
// scanf("%d%d",&m,&n);
// m=m^n;
// for(i=0;i<32;i++)
// {
// if(((m>>i) &1 ) == 1)
// {
// count++;
// }
// }
// printf("%d",count);
//return 0;
//}
用函数打印自己可以控制行列的乘法口诀表
//void Mul(int x, int y,int n)
//{
// for(x=1;x<=n;x++)
// {
// for(y=1;y<=x;y++)
// {
// printf("%2d*%2d=%2d ",x,y,x*y); //不要写成 printf("%2d*%2d=%2d",x*y);这样打印的是i*随机值
// }
// printf("\n");
// }
//}
//
//
//int main()
//{
// int i = 0;
// int j = 0;
// int n = 0;
// scanf("%d",&n);
// Mul (i,j,n);
//return 0 ;
//}
用函数的方式交换两个数
//void Swap (int *p1, int *p2)
//{
// int tmp = 0;
// tmp = *p1;
// *p1 = *p2;
// *p2 = tmp;
// printf("交换a和b:");
// printf("\n");
// printf("a=%d\nb=%d",*p1,*p2);
//}
//
//
//int main ()
//{
// int a = 0;
// int b = 0;
// printf("请输入a和b:");
// printf("\n");
// scanf("%d%d",&a,&b);
// Swap(&a,&b);
//
//return 0;
//}
用函数的方式判断是不是闰年
//void Year (int x)
//{
// if((x%4==0)&&(x%100 != 0)||(x%400==0))
// {
// printf("是闰年\n");
// }
// else
// {
// printf("不是闰年\n");
// }
//}
//
//
//int main()
//{
// int i = 0;
// printf("请输入年份:");
// scanf("%d",&i);
// Year (i);
//return 0;
//}
求两个数的最小公倍数
//int main ()
//{
// int a = 0;
// int b = 0;
// int c = 0;
// int d = 0;
// int tmp = 0;
// scanf("%d%d",&a,&b);
// c = a;
// d = b;
// //先求最大公约数
// while(c%d)
// {
// //if(c%d != 0)
// //{
// tmp = c%d;
// c = d;
// d = tmp;
// // }
// }
// //求最小公倍数
// a = a*b/d;
// printf("%d",a);
//return 0;
//}
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
//int main()
//{
// int killer = 0;
// for(killer = 'a'; killer<='d'; killer++)
// {
// if(3==(killer != 'a')
// +(killer == 'c')
// +(killer == 'd')
// +(killer != 'd'))
// {
// printf("%c\n",killer);
// }
// }
//return 0;
//}
//打印杨辉三角
//int main()
//{
// int arr[10][10]={0};
// int i = 0;
// int j = 0;
// int sz = 10;
//
// for(i=0;i1)&&(j>0))
// {
// arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
// }
// }
//
// }
//
// for(i=0;i1&&j>0)
// {
// arr[i][j] = arr[i-1][j-1]+arr[i-1][j];
// }
// }
//
// for(j=0;j
在这里插入代码片