下面代码结果是什么
int main()
{
int arr[] = {
1, 2, (3, 4), 5 };
printf("%d\n", sizeof(arr));//16
return 0;
}
上面代码结果是16,因为(3,4)是逗号表达式,只看最
后面的那个数字
下面代码运行的结果是什么
int main()
{
char str[] = "hello bit";
printf("%d %d\n", sizeof(str), strlen(str));//10,9
//sizeof(str)十个元素 hello空格bit\0 \0算一个元素 每个元素占了一个字节,所以10
//strlen是9\0只是字符串的结束标志,并不能算作字符串的长度
return 0;
}
上面代码的结果是 10,9
sizeof(str)十个元素 hello空格bit\0 \0算一个元素 每个元素占了一个字节,所以10
strlen是9 \0只是字符串的结束标志,并不能算作字符串的长度
数组元素个数认识
int main()
{
char acX[] = "abcdefg";
//这里是8个元素后面还有一个\0
char acY[] = {
'a', 'b', 'c', 'd', 'e', 'f', 'g' };
//这里是7个元素
return 0;
}
创建一个整型数组,完成对数组的操作
1.实现函数init()初始化数组为全0
2.实现print()打印数组的每个元素
3.实现reverse()函数完成数组元素的逆置
//==初始化数组为0==
void init(int arr[],int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
arr[i] = 0;
}
}
//打印数组的函数
void Print(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
//对数组进行逆置函数
void reverse(int arr[], int sz)
{
int left = 0;
int right = sz - 1;
while (left<right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
int main()
{
int arr[10] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sz = sizeof(arr) / sizeof(arr[0]);
//init(arr,sz);这里是将数组初始化为0
Print(arr,sz);
reverse(arr, sz);
Print(arr, sz);
return 0;
}
交换数组
将数组a中的内容和数组b中的内容交换一下
数组一样大
int main()
{
int arr1[] = {
1, 3, 5, 7, 9 };
int arr2[] = {
2, 4, 6, 8, 0 };
int tmp = 0;
int i = 0;
int sz = sizeof(arr1) / sizeof(arr1[0]);
for (i = 0; i < sz; i++)
{
tmp = arr1[i];
arr1[i] = arr2[i];
arr2[i] = tmp;
}
return 0;
}
下面代码运行出来的结果
int main()
{
int arr[] = {
1, 2, 3, 4, 5 };
short* p = (short*)arr;
//short只能访问两个字节而一个int 1 就占用了4个字节
int i = 0;
for (i = 0; i < 4; i++)
//所以这里循环了4次也只是访问了两个元素将两个元素换成了0
{
*(p + i) = 0;
}
for (i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
//所以这里的答案应该是00345
}
return 0;
}
下面代码运行出来的结果
int main()
{
int a = 0x11223344;
//在内存中是这样存储的 44 33 22 11 一个占一个字节一共4个字节441个331个221个11占1个字节
char* pc = (char*)&a;
*pc = 0;//这一步就相当于改成了 00 33 22 11这是在内存中存储的时候是这样的
//但是拿出来是反的是 11 22 33 00
printf("%x\n", a);//答案是:11 22 33 00
return 0;
}
多注意上面这个代码中的注释部分
下面代码运行的结果是什么
int i;//i是全局变量,全局变量不初始化默认是0
int main()
{
i--;
/*
i--之后就变成了-1
-1
原码10000000000000000000000000000001
反码11111111111111111111111111111110
补码11111111111111111111111111111111
*/
if (i > sizeof(i))
//sizeof返回无符号数
//sizeof()-计算变量/类型所占内存大小 >=0 返回无符号数
//所以i在和无符号数比较大小它先变成无符号数 -1变成无符号数它的补码就会变成原码
//那么这是一个非常大的数,所以它会比4大
{
printf(">\n");//答案是>
}
else
{
printf("<\n");
}
return 0;
}
全局变量,全局变量不初始化默认是0
sizeof返回无符号数
下面代码的结果是什么
int main()
{
int a, b, c;
a = 5;
c = ++a; //a=6 c=6
b = ++c, c++, ++a, a++;// c=8 b=7 a =8
b += a++ + c;//b+=8+8 b+16=7+16 =23 //b=23 a=9 c=8
printf("a=%d b=%d c=%d\n", a, b, c);
//结果是;9 23 8
return 0;
}
求二进制中不同位的个数
题目内容
编程实现:
两个int(32位)整数m和n的二进制表达式中,有多少个位(bit) 不同
输入例子
1999 2999
输出例子:7
int get_diff_bit(int m, int n)
{
int count = 0;
int tmp = m^n;
while (tmp)
{
tmp = tmp&(tmp - 1);
count++;
}
return count;
}
int main()
{
int m = 0;
int n = 0;
scanf("%d%d", &m, &n);
int count =get_diff_bit(m,n);
printf("%d\n", count);
return 0;
}
统计二进制中1的个数
写一个函数返回参数二进制中1的个数
比如:15 二进制是 00001111 4个1
第一种算法
int count_bit_one(unsigned int a)
{
int count = 0;
while (a)
{
if (a % 2 == 1)
{
count++;
}
a = a / 2;
}
return count;
}
第二种算法
int count_bit_one(int a)
{
int count = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
if (((a >> i) & 1) == 1)
{
count++;
}
}
return count;
}
第三种算法 最经典的写法
int count_bit_one(int n)
{
int count = 0;
while (n)
{
n = n&(n - 1);
count++;
}
return count;
}
/*
n = n&(n-1)
n
13
1101 n
1100 n-1
1000 n
0111 n-1
0000 n
*/
int main()
{
int a = 0;
scanf("%d", &a);
//写一个函数求a的二进制(补码)表示中有几个1
int count = count_bit_one(a);
printf("%d\n", count);
return 0;
}
题目名称 打印二进制的奇数位和偶数位
获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
void print(int m )
{
int i = 0;
printf("奇数位:\n");
for (i = 30; i >= 0; i -= 2)
{
printf("%d ", (m >> i) & 1);
}
printf("\n");
printf("偶数位:\n");
for (i = 31; i >= 1; i -= 2)
{
printf("%d ", (m >> i) & 1);
}
printf("\n");
}
int main()
{
int m = 0;
scanf("%d", &m);
print(m);
return 0;
}
交换两个变量,不允许创建临时变量
int main()
{
int a = 0;
int b = 1;
printf("交换前%d %d\n", a, b);
a = a^b;
b = a^b;
a = a^b;
printf("交换后%d %d\n", a, b);
return 0;
}
使用指针打印数组内容
写一个函数打印arr数组的内容,不使用数组下标,使用指针
arr是一个整型一维数组
void print(int* arr, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", *(arr + i));
}
}
int main()
{
int arr[10] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
print(arr, sz);
return 0;
}
下面开始递归递归常见题目问题
调用Fun(2)那么2就会进去下面代码
int Fun(int n)
{
if (n == 5)
return 2;
else
return 2 * Fun(n + 1);//最后返回值应该是16
}
函数判断素数
实现一个函数,判断一个数是不是素数
利用上面实现的函数打印100到200之间的素数
int is_prime(int n)
{
int j = 0;
for (j = 2; j < n; j++)
{
if (n%j == 0)
return 0;
}
return 1;
}
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)
{
if (is_prime(i) == 1)
printf("%d ", i);
}
return 0;
}
函数判断闰年
实现函数判断year是不是闰年
int is_leep_year(int x)
{
if ((x % 4 == 0 && x % 100 != 0) || (x & 400 == 0))
return 1;
else
return 0;
}
int main()
{
int year = 0;
scanf("%d", &year);
if (is_leep_year(year) == 1)
{
printf("i=%d\n", year);
}
return 0;
}
题目名称:交换两个整数
实现一个函数来交换两个整数的内容
void Add(int* pa, int* pb)
{
int tmp = 0;
tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main()
{
int pa = 10;
int pb = 20;
printf("交换前 a=%d b=%d\n", pa, pb);
Add(&pa, &pb);
printf("交换后 a=%d b=%d\n", pa, pb);
return 0;
}
实现一个函数,打印乘法口诀表,口诀表的行数和lli列数自己指定
如:输入9,输出99口诀表,输出1212的乘法口诀表
void print_table(int n)
{
int i = 0;
for (i = 1; i <= n; i++)
{
int j = 0;
for (j = 1; j <= i ; j++)
{
printf("%d*%d = %d ", i, j, i*j);
}
printf("\n");
}
}
int main()
{
int n = 0;
scanf("%d", &n);
print_table(n);
return 0;
}
打印一个数的每一位
题目内容
递归方式实现打印一个整数的每一位
void print(int num)
{
if (num > 9)
{
print(num / 10);
}
print("%d ", num % 10);
}
int main()
{
int num = 1234;
print(num);
return 0;
}
求阶乘
递归和非递归分别实现求n的阶乘(不考虑溢出的问题)
首先不用递归的方法
int print(int n)
{
int a = 0;
int b = 1;;
for (a = 1; a <= n; a++)
{
b = b*a;
}
return b;
}
int main()
{
int n = 0;
int result = 0;
scanf("%d", &n);
result = print(n);
printf("结果是:%d ", result);
return 0;
}
用递归的方式进行阶乘
int print(int n)
{
if (n <= 1)
return 1;
else
return n*print(n - 1);
}
int main()
{
int n = 0;
int result = 0;
scanf("%d", &n);
result = print(n);
printf("result = %d\n", result);
}
strlen的模拟(递归实现)
递归和非递归分别实现strlen
首先是不用递归实现的
int my_strlen(char* arr)
{
int count = 0;
while (*arr != '\0')
{
count++;
arr++;
}
return count;
}
int main()
{
char arr[] = "bitasdfasdf";
int len = my_strlen(arr);
printf("len =%d\n", len);
return 0;
}
下面是用递归实现的
int my_strlen(char* str)
{
if (*str != '\0')
{
return 1 + my_strlen(str + 1);
}
else
{
return 0;
}
}
int main()
{
char arr[] = "bitbitbitbytebyte";
int len = my_strlen(arr);
printf("len =%d\n", len);
return 0;
}
题目名称 字符串逆序(递归实现)
编写一个函数reverse_string(char* string)(递归实现)
实现:将参数字符串中的字符反向排列
要求:不能使用c函数库中的字符串操作函数
int my_strlen(char* str)//采用计数器的方法,实现my_strlen
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
void reverse_string(char arr[])
//这里是用循环的方法进行实现的,而题目里面用递归来实现
{
int left = 0;
int right = my_strlen(arr)-1;
while (left < right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
void reverse_string(char* arr)//通过递归来实现逆序
{
char tmp = arr[0];
int len = my_strlen(arr);
arr[0] = arr[len - 1];
arr[len - 1] = '\0';
if (my_strlen(arr + 1) >= 2)
reverse_string(arr + 1);
arr[len - 1] = tmp;
}
int main()
{
char arr[] = "qqqsssabcdef";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
题目名称:写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
输入1729,输出19
int DigitSum(unsigned int num)
{
if (num > 9)
{
return DigitSum(num / 10) + (num % 10);
}
else
{
return num;
}
}
int main()
{
unsigned int num = 0;
scanf("%d", &num);
int ret = DigitSum(num);
printf("ret = %d\n", ret);
return 0;
}
题目名称:递归实现n的k次方
编写一个函数实现n的k次方,使用递归实现
double Pow(int n, int k)
{
//n^k = n* n^(k-1)
if (k < 0)
return (1.0 / (pow(n, -k)));
else if (k == 0)
return 1;
else
return n*Pow(n, k - 1);
// 2的3次方 意思就是 2*pow(2^3-1)
}
int main()
{
int n = 0;
int k = 0;
printf("请输入n和k,n和k之间用空格隔开\n");
scanf("%d%d", &n, &k);
double ret = Pow(n,k);
printf("ret = %lf\n", ret);
return 0;
}
题目名称计算 斐波那契数列
题目内容
递归和非递归分别实现求第n个斐波那契数
例如:
输入:5 输出:5
输入:10 输出:55
输入:2 输出:1
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;
}