课后习题
原码/反码/补码
第一题
原码就是这个数直接转换为二进制。
正数的原码,反码,补码相同。
负数的反码是原码符号位不变,其他位按位取反,补码是反码二进制加1。
原码,反码,补码最高位是1表示负数,最高位是0表示正数。
第二题
在32位大端模式处理器上变量b等于
unsigned int a= 0x1234;
unsigned char b=*(unsigned char *)&a;
根据上图可知,b = 0x00。
第三题
大小端字节序指的是数据在电脑上存储的字节顺序。
第四题
杨辉三角
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int arr[100][100] = {0};
int i = 0;
int j = 0;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
if (i == j || j == 0)
{
arr[i][j] = 1;
}
else
{
arr[i][j] = arr[i-1][j] + arr[i-1][j-1];
}
}
}
for (i=0; i<n ; i++)
{
for (j=0; j<=i; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
第五题
题目名称:
猜凶手
题目内容:
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
#include <stdio.h>
int main()
{
int killer = 0;
for (killer='A', killer<='D', killer++)
{
if (killer!='A' + killer=='C' + killer=='D' + kiler!='D' = 3)
{
break;
}
}
prinf("%c\n", killer)
return 0;
}
数据的存储
第一题
int main()
{
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = 0;
c = a + b;
printf(“%d %d”, a+b,c);
return 0;
}
第二题
int main()
{
char a[1000] = {0};
int i=0;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}
第三题
题目名称:
猜名次
题目内容:
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
for (a=1; a<=5; a++)
{
for (b=1; b<=5; b++)
{
for (c=1; c<=5; c++)
{
for (d=1; d<=5; d++)
{
for (e=1; e<=5; e++)
{
if (b==2 + a==3 == 1 &&
b==2 + e==4 == 1 &&
c==1 + d==2 == 1 &&
c==5 + d==3 ==1 &&
e==4 + a==1 == 1)
{
if (a * b * c * d * e == 120)
{
break;
}
}
}
}
}
}
}
printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);
return 0;
}
数组
第一题
题目名称:
冒泡排序
题目内容:
实现一个对整形数组的冒泡排序
int main()
{
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i=0; i<sz-1; i++)
{
int j = 0;
for (j=sz-1; j>0; j--)
{
if (arr[j] < arr[j-1])
{
int tmp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tmp;
}
}
}
for (i=0; i<sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
第二题
题目名称:
交换数组
题目内容:
将数组A中的内容和数组B中的内容进行交换。(数组一样大)
void Reverse(int arr1[], int arr2[], int sz)
{
int i = 0;
for (i=0; i<sz; i++)
{
int tmp = arr1[i];
arr1[i] = arr2[i];
arr2[i] = tmp;
}
}
int main()
{
int arr1 = {1, 3, 5, 7, 9};
int arr2 = {2, 4, 6, 8, 0};
int sz = sizeof(arr1) / sizeof(arr1[0]);
Reverse(arr1, arr2, sz);
return 0;
}
第三题
题目名称:
数组操作
题目内容:
创建一个整形数组,完成对数组的操作
1.实现函数init() 初始化数组为全0
2.实现print() 打印数组的每个元素
3.实现reverse() 函数完成数组元素的逆置
要求:自己设计以上函数的参数,返回值。
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]);
}
}
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);
print(arr, sz);
reverse(arr, sz);
return 0;
}
操作符的使用
第一题
#include <stdio.h>
int main()
{
int a, b, c;
a = 5;
c = ++a;//c=6, a=6
b = ++c, c++, ++a, a++;//b=7,c=8, a=8
b += a++ + c;//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 2299
输出例子:7
#include <stdio.h>
int count_bit_one(int n)
{
int count = 0;
int i = 0;
for (i=0; i<32; i++)
{
if ((n>>i) & 1 == 1)
{
count++;
}
}
return count;
}
int count_diff_bit(int n, int m)
{
int t = n ^ m;
int count = count_bit_one(t);
return count;
}
int main()
{
int m = 0;
int n = 0;
scanf("%d %d", &n, &m);
int ret = count_diff_bit(n, m);
printf("%d\n", ret);
return 0;
}
第三题
题目名称:
打印整数二进制的奇数位和偶数位
题目内容:
获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
printf("打印偶数位:");
int i = 0;
for (i=31; i>0; i -= 2)
{
printf("%d", (n >> i) & 1);
}
printf("\n");
printf("打印奇数位:");
for (i=30; i>=0; i -= 2)
{
printf("%d", (n >> i) & 1)
}
return 0;
}
第四题
题目名称:
统计二进制中1的个数
题目内容:
写一个函数返回参数二进制中 1 的个数。
比如: 15 0000 1111 4 个 1
#include <stdio.h>
int count_bit_one(int n)
{
int count = 0;
int i = 0;
for (i=0; i<32; i++)
{
if ((n>>i) & 1 == 1)
{
count++;
}
}
return count;
}
int main()
{
int num = 0;
scanf("%d", &num);
int ret = count_bit_one(num);
printf("%d\n", ret);
return 0;
}
第二种解法:
int count_bit_one(int n)
{
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
int main()
{
int num = 0;
scanf("%d", &num);
int ret = count_bit_one(num);
printf("%d\n", ret);
return 0;
}
2 0010
4 0100
8 1000
这里如果二进制位1的个数是1,那么就是2的次方。
算术转换
第一题
题目名称:
计算求和
题目内容:
求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,
例如:2+22+222+2222+22222
#include <stdio.h>
int main()
{
int a = 0;
int n = 0;
int sum = 0;
int k = 0;
scanf("%d %d", &a, &n);
int i = 0;
for (i=0; i<n; i++)
{
k = k * 10 + a;
sum += k;
}
printf("%d\n", sum);
return 0;
}
第二题
题目名称:
打印水仙花数
题目内容:
求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=13+53+3^3,则153是一个“水仙花数”。
自幂数
#include <stdio.h>
int count(int n)
{
int cnt = 1;
while (n /= 10)
{
cnt++;
}
return cnt;
}
int main()
{
int i = 0;
for (i=0; i<=100000; i++)
{
int sum = 0;
int cnt = count(i);
while (i)
{
sum += pow(i % 10, cnt);
i /= 10;
}
if (sum == i)
printf("%d ", i);
}
return 0;
}
指针初阶
第一题
题目名称:
字符串逆序
题目内容:
写一个函数,可以逆序一个字符串的内容。
第二题
题目名称:
打印菱形
题目内容:
用C语言在屏幕上输出以下图案:
第三题
题目名称:
喝汽水问题
题目内容:
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。
Debug和Release的区别
第一题
题目名称:
程序死循环解释
题目内容:
VS开发环境调试下面的代码,画图解释下面代码的问题
#include <stdio.h>
int main()
{
int i = 0;
int arr[] = {1,2,3,4,5,6,7,8,9,10};
for(i=0; i<=12; i++)
{
arr[i] = 0;
printf("hello bit\n");
}
return 0;
}
第二题
题目名称:
调整奇数偶数顺序
题目内容:
调整数组使奇数全部都位于偶数前面。
题目:
输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
字符指针
第一题
题目名称:
字符串左旋
题目内容:
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
- 第一种解法
#include <stdio.h>
#include <string.h>
#include <assert.h>
void left_move(char* p, int len, int k)
{
assert(p);
int i = 0;
for (i=0; i<k; i++)
{
//左旋一个字符
//1.保存第一个字符
char tmp = *p;
//2.把后续的字符往前移动一次
int j = 0;
for (j=0; j<len-1; j++)
{
p[j] = p[j+1];
}
//3.把保存的第一个字符放到最后面
p[len-1] = tmp;
}
}
int main()
{
char arr[] = "abcdef";
int len = strlen(arr);
int k = 0;
scanf("%d", &k);
k %= len;
left_move(arr, len, k);
printf("%s\n", arr);
return 0;
}
- 第二种解法
#include <stdio.h>
#include <string.h>
#include <assert.h>
void reverse(char* left, char* right)
{
assert(left && right);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void left_move(char* p, int len, int k)
{
assert(p);
reverse(p, p+k-1);//逆序左边
reverse(p+k, p+len-1);//逆序右边
reverse(p, p+len-1);//逆序整体
}
int main()
{
char arr[] = "abcdef";
int len = strlen(arr);
int k = 0;
scanf("%d", &k);
k %= len;
left_move(arr, len, k);
printf("%s\n", arr);
return 0;
}
第二题
题目名称:
字符串旋转结果
题目内容:
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
- 第一种解法
#include <stdio.h>
#include <string.h>
#include <assert.h>
void reverse(char* left, char* right)
{
assert(left && right);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void left_move(char* p1, int k, int len1)
{
assert(p1);
reverse(p1, p1 + k - 1);
reverse(p1 + k, p1 + len1 - 1);
reverse(p1, p1 + len1 - 1);
}
int is_left_move(char* p1, char* p2)
{
assert(p1 && p2);
int len1 = strlen(p1);
int i = 0;
for (i = 0; i < len1; i++)
{
left_move(p1, 1, len1);
if (strcmp(p1, p2) == 0)
return 1;
}
return 0;
}
int main()
{
char arr1[] = "AABCD";
char arr2[] = "CDAAB";
int ret = is_left_move(arr1, arr2);
if (ret == 1)
printf("YES\n");
else
printf("NO\n");
return 0;
}
- 第二种解法
#include <stdio.h>
#include <string.h>
int is_left_move(char* p1, char* p2)
{
int len1 = strlen(p1);
int len2 = strlen(p2);
if (len1 != len2)
return 0;
strncat(p1, p1, len1);
if (strstr(p1, p2) == NULL)
return 0;
else
return 1;
}
int main()
{
char arr1[20] = "AABCD";
char arr2[] = "CDAAB";
int ret = is_left_move(arr1, arr2);
if (ret == 1)
printf("YES\n");
else
printf("NO\n");
return 0;
}
函数指针
第一题
题目名称:
qsort使用练习
题目内容:
练习使用库函数,qsort排序各种类型的数据
- qsort排序整型数据
#include <stdio.h>
#include <stdlib.h>
int cmp(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
void print1(int arr[], int sz)
{
int i = 0;
for (i=0; i<sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp);
print1(arr, sz);
return 0;
}
- qsort排序结构体类型数据
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Stu
{
char name[20];
int age;
double score;
};
int cmp_name(const void* p1, const void* p2)
{
return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}
void print2(struct Stu s[], int sz)
{
int i = 0;
for (i=0; i<sz; i++)
{
printf("%s ", s[i].name);
}
}
int main()
{
struct Stu s[3] = {{"yelei", 23, 98}, {"zhangsan", 25, 78}, {"wangwu", 28, 65.5}};
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_name);
print2(s, sz);
return 0;
}
第二题
题目名称:
杨氏矩阵
题目内容:
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N);
#include <stdio.h>
int main()
{
return 0;
}
指针和数组运算
第一题
题目名称:
qsort模拟实现
题目内容:
模仿qsort的功能实现一个通用的冒泡排序
#include <string.h>
struct Stu
{
char name[20];
int age;
double score;
};
int cmp(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
int cmp_name(const void* p1, const void* p2)
{
return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}
Swap(char* p1, char* p2, size_t size)
{
int i = 0;
for (i = 0; i < size; i++)
{
char tmp = *(p1 + i);
*(p1 + i) = *(p2 + i);
*(p2 + i) = tmp;
}
}
void BubbleSort(void* base, size_t num, size_t size, int (*p)(const void*, const void*))
{
int i = 0;
for (i = 0; i < num - 1; i++)
{
int j = 0;
for (j = num - 1; j > 0; j--)
{
if (p((char*)base + (j - 1) * size, (char*)base + j * size) > 0)
{
Swap((char*)base + (j - 1) * size, (char*)base + j * size, size);
}
}
}
}
void print1(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
void print2(struct Stu* p, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%s ", p[i].name);
}
}
//struct Stu
//{
// char name[20];
// int age;
// double score;
//};
int main()
{
//int arr[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
struct Stu s[3] = { {"zhangsan", 21, 66.3}, {"wangwu", 25, 78.5}, {"yelei", 23, 100} };
//int sz = sizeof(arr) / sizeof(arr[0]);
int sz = sizeof(s) / sizeof(s[0]);
//BubbleSort(arr, sz, sizeof(arr[0]), cmp);
BubbleSort(s, sz, sizeof(s[0]), cmp_name);
//print1(arr, sz);
print2(s, sz);
return 0;
}