按位取数
定义一个无符号整数 unsigned int num;
对第一位:%10;第二:/10%10;第三位:第三位:/100%10;
采取循环来取位;
unsinged int temp;
while(temp){
unsigned int position = temp %10; 去最后一位
printf("%2d",position); 打印最后一位
temp /= 10; 更新变量
}
从左往右打印每一位
采用递归:
void digui(int num){
递归终止条件
if(!num){
return;
}
递归操作:
digui(num/10);
printf("%2d",num%10);
}
斐波那契数列
f(n)=f(n-1)+f(n-2) (n>3)
int arr[31] = {0}; arr[0]表示斐波那契的第0项
void fib(int n) {
递归终止的条件
if(n==1 || n==2){
arr[n] = 1;
return 1;
}
递归操作
if(arr[n] == 0){
保存记录结果
arr[n] = fib(n - 1) + fib(n - 2);
}
return arr[n];
}
void fib1() {
int arr[31] = {0};
原始问题
arr[1] = arr[2] = 1;
for(int i = 3;i < 31;i++){
arr[i] = arr[i - 1] + arr[i - 2];
}
}
兔子生崽
月份 小的 中的 老的 sum
1 1 0 0 1
2 0 1 0 1
3 1 0 1 1
4 1 1 1 2
5 2 1 2 3
6 3 2 3 8
编写一个函数,不允许创建临时变量,统计字符串长度
#include <string.h>
void length() {
字符串? 使用双引号""引起的一串字符
字符?使用单引号''引起的
char arr[] = "hello";
求字符串长度
int leng = strlen("hello");
使用sizeof
length = sizeof(arr) / sizeof(arr[0]) - 1;
}
int my_length(char arr[]) {
int length = 0;
int i = 0;
while (arr[i++] != '\0'){
length++;
}
return length;
}
简化
int my_length(char arr[]) {
int i = 0;
while (!arr[i++]);
return i-1;
}
使用递归:
int srew(char *p) {
//递归终止条件
if(*p == '\0') {
return 0;
}
//递归操作
return 1+srew(p+1);
}
操作符和表达式
(num1 * 1.0 / num2)(类型转换)
整数在内存中肯定是以二进制的形式进行存储,而且存储的是补码
移位操作符
<<左移操作符:左边抛弃,右边补零
int num = 10;
移动的是二进制位 左边抛弃,右边补零
int temp = num << 1;
输出结果:20
temp = temp << 1;
输出结果:40
>>右移运算:逻辑移位与算数移位
逻辑移位:右边丢弃,左边用零补充
算术右移:除2(右边丢弃,左边补符号位
不能移动负数
按位或& 都是1才是1
按位与| 只要有1就是1
按位异或^ 相同即为0不同即为1
不使用临时变量实现数与数之间的交换
距离法:
a = 3, b = 5;
b = b-a; a = 3, b = 2
a = a + b; a=5,b=2
b=a-b; a=5,b=3
使用异或操作符;
a=a^b;
b=a^b;
a=a^b;