1. 逆置reverse()
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 --;
}
}
2. 根据题目,分析该例的结果。
#include<stdio.h>
int i;
int main()
{
i--;
if (i > sizeof(i))
{
printf(">\n");
}else
{
printf("<\n");
}
return 0;
}
分析:i作为全局变量,不给初始值,默认为0 .sizeof()计算的是变量/类型所占内存的大小,既然是大小,返回的数值必然是>=0,也就是无符号数。i--后,此时i=-1,那么要是有符号数和无符号数比较大小的话,有符号数需要先转换成无符号数才能进行比较。
3. 计算二进制中1的个数。
分析:在十进制中,例如1234,我们想要获得每一位,那需要用到模10除10的算法。类比这样的思想,在二进制中,也可以使用模2除2的方法。考虑非正常情况下,比如输入数字是-1呢?在计算机中都存放的是数值补码,-1的补码中1的个数有32个,所以需要修改参数类型为unsigned int,由此得到方法一。为了消除负数情况的误算,结合位运算符可以得到方法二。以-1为例,用-1的补码结合右移操作,分别和1相与,就可以得到1的个数。
此外还有一种开阔思维:如果n和n-1相与,由以下分析可以看出,相与一次就会消除右边的一个1,那直到1都消除完所用的次数,就得到1的个数。
//法1
int count_bit_one(unsigned int n)
{
int count = 0;
while(n)
{
if (n % 2 == 1)
{
count ++;
}
n /= 2;
}
return count;
}
//法2
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;
}
//法3
int count_bit_one(int n)
{
int count = 0;
while (n)
{
n = n&(n-1);
count ++;
}
return count;
}
int main()
{
int a = 0;
scanf("%d",&a);
int count = count_bit_one(a);
printf("count = %d\n",count);
return 0;
}
4. 求二进制中不同位的个数
分析:假设两个数是m和n,要比较两个数的二进制有几个不同位。异或的计算方式是相同为0,不同为1。于是我们可以存储m^n,再计算m^n中1的个数。
int Find_diff(int m, int n)
{
int temp = m ^ n;
return count_bit_one(temp);
}
int main()
{
int m = 0;
int n = 0;
scanf("%d %d",&m,&n);
int count = Find_diff(m,n);
printf("count = %d\n",count);
return 0;
}
5. 获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列。
void print(int n)
{
int i = 0;
printf("奇数位:");
for ( i = 30; i >= 0; i -= 2)
{
printf("%d ",(n >> i) & 1);
}
printf("\n");
printf("偶数位:");
for ( i = 31; i >= 1; i -= 2)
{
printf("%d ",(n >> i) & 1);
}
}
int main()
{
int a = 0;
scanf("%d",&a);
print(a);
return 0;
}
6. 用指针输出数组各元素,不用下标。
void print(int* p,int sz)
{
int i = 0;
for ( i = 0; i < sz; i++)
{
printf("%d ",(*(p + i)));
}
}
7. 实现一个函数,打印乘法口诀表,行数列数由自己制定。如:输入9,输出9*9口诀表,输入12,输出12*12口诀表。
需要注意:机器是横向打印,要用横向打印的思维考虑。
void List(int n)
{
int i = 0;
for ( i = 1; i <= n; i++)
{
int j = 0;
for ( j = 1; j <= i; j++)
// for(j = i; j <= n; j++)
{
printf("%d * %d = %-3d ",i,j,i*j);
}
printf("\n");
}
}
int main()
{
//打印口诀表 行列自定
int n = 0;
scanf("%d",&n);
List(n);
return 0;
}
8. 字符串逆序,要求:①用递归方法。②不使用C语言的库函数
分析:如果一列字符串想要逆序,按照递归的方法,可以分为4步。
①先把arr[0]存储备用
②把arr[my_strlen(arr) - 1]赋给arr[0],arr[my_strlen(arr)-1]放\0
③逆序剩下的元素
④再把先前存储的arr[0]放在arr[my_strlen(arr) - 2]上面
int my_strlen(char* str)
{
int count = 0;
while (*str !='\0')
{
count++;
str ++;
}
return count;
}
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[] = "abcdef";
reverse_string(arr);
printf("%s\n",arr);
return 0 ;
}
9. 用递归方法,计算一个数的每位之和。例如:输入1729,输出是1+7+2+9 = 19
//计算一个数的每位之和
int DigitSum(unsigned int n)
{
int sum = 0;
while (n != 0)
{
sum += n%10; //0+9+2+7+1
n /= 10; //1729-172-17-1
DigitSum(n);
}
return sum;
}
int main()
{
unsigned int n = 0;
scanf("%d",&n);
int sum = DigitSum(n);
printf("sum = %d",sum);
return 0;
}
10. 用递归方法实现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);
}
int main()
{
int n = 0;
int k = 0;
scanf("%d%d",&n,&k);
double ret = Pow(n,k);
printf("ret = %lf",ret);
return 0;
}