二进制
十进制:
*10:固定小数点,把数组左移
/10:固定小数点,把数字右移
整数整除10:删除最后一位
整数模(%)10 :提取最后一位
二进制:
*2:固定小数点,把数字左移
/2:固定小数点,把数字右移
整数整除2:删除最后一位
整数模(%)2: 提取最后一位
K进制:
*k:固定小数点,把数字左移
/k:固定小数点,把数字右移
整数整除k:删除最后一位
整数模(%)k: 提取最后一位
进制取数:
- 提至小数点前第一位
- 去掉小数
- 提取数字
如何依次求出整数部分的数(从小数点开始):
- 输出模(%)k(进制数)
- 整除k(删除第一位)
任何依次求出小数部分的数(同上):
- 输出第一位:乘k再变int(自动删小数)输出
- 去掉第一位
进制转换
整数部分怎么转:
从个位开始求,往个位上面填上那个要转换的值(后面都称a)模2的值
然后求第二位,现在a变成了用来的a整除2的结果,然后往第二位上面填上a模2的值
以此类推…………直到最后a变成了0
小数部分(有限小数)怎么转:
从小数点后第一位开始求,把要转2进制的值(后面称a)乘2,然后看整数部分模2的结果填到小数点后第一位的位置,并去掉整数部分,小数点后第二位,还是把a乘2,然后看整数部分模2的结果填到小数点第二位然后去掉整数部分………………以此类推到还是a=0
举例:
求6.625的二进制,可以这样:首先求整数部分的数字6(在右边下方(个位6模2=0,剩下的是6整除2=3,第二位3模2=1,剩下的是3整除2=1,第三位1模2=1,整除2剩下的为0,结束得出整数部分为110),为110
再求小数部分一个一个提到整数部分求,(左边下方(小数点后第一位0.625*2,得1.25,取整数部分为得小数点后第一位为1然后去整数部分,剩下0.25*2=0.5,0.5取整数部分,得小数点后第二位为0,再去整数部分,0.5*2=1,得小数点后第三位为1,去整数为0,得出小数部分为0.101))小数部分为0.101
组合为110.101
意义:
进制只是一种用来表示数的表示方法,比如假设有一棵苹果树,树上有8(10进制个苹果),用8进制的外星人说:这有10个苹果。地球人说:这有8个苹果。10(8进制)和8(10进制)只是表示方法不同,但都是0的下一个的下一个的下一个的下一个的下一个的下一个的下一个的下一个的数。
分数(无限小数)转换:
步骤
假如它是真分数,那么就跳过这步
假如它是假分数,那么把整数部分分离出来直接解决
然后再进行小数的运算
无限小数怎么转:
将减去整数部分的分数从小数点后第一位开始求,把要转2进制的值(后面称a)乘2,然后看整数部分模2的结果填到小数点后第一位的位置,并去掉整数部分,小数点后第二位,还是把a乘2,然后看整数部分模2的结果填到小数点第二位然后去掉整数部分………………以此类推到发现循环节就直接写循环节拼接整数好了。
二进制数字表示方法:
拿short举例,它是用16个二进制数字包括)以下的开头是1(用来结尾),所以它最多能存-32768-32768的数
浮点数:
意义:
c++创建浮点数的意义是存储近似数,不是存储精确数
存了精确数会怎样:
由于浮点数能存储的浮点数位数是有限的,所以遇到无限小数或有效数字超出范围时,它会删除超出范围的数字。从而差了那么一点点。
举例:
比如你想用一个double 存4/3,答案是它会偏差一点点,因为double只能存52位的数,存到第52位后面的就不存了
链表:
是什么:
由节点组成每个节点里面会写下一个的指针,最后一个总是nullptr。
举例:
下面有好几个函数,前三行是用来添加节点的结构体Node
struct Node{//用来定义链表的结构体Node
Node *next;//每次使用在里面加一个下一个的指针。
};
Node *makelistForwards(Int n){//创建一个不断向后面添加节点创建链表的函数,链表的节点个数是n
if(n);else return nullptr;//如果n不是0的话,那么它的布尔值肯定是true,所以要是n是0的话肯定会进入else,只有0个节点的链表的没有第一个,所以返回nullptr即可。
Node *head=new Node{nullptr};//创建表示链表头的Node指针head在空链表里面创建第一个节点,然后下一个为nullptr。
Node *p =head;//创建Node指针p指向head
(相当于也现在指向第一个节点)
for(Int i=2;i<=n;i++){//因为如果要创建只有1个节点的链表的话,前两行是对的,所以从2开始for
p->next=new Node{nullptr};//往p后面添加一个新的节点,它的后面变成了nullptr,
p=p->next;//把p向后移
}return head;//返回链表头(根据链表头能找到链表,可链表尾p不行)
}
Node *makelistBackwards(Int n){//创建一个不断向前面添加节点创建链表的函数,链表的节点个数是n,考试创建链表建议用这种,简单
Node *head=nullptr;//创建表示链表头的Node指针head,为nullptr。
for(Int i=1;i<=n;i++)//没法直接完成1个节点的链表了,从1开始for
head=new Node{head};//不停new Node新节点的下一个为当前链表头,不停往链表头前面添加节点直到结束
return head;
}
Int getsize(Node *head){//用来计算链表有几个节点
Node *p=head;//创建Node指针p指向链表头
Int sum=0;//用来计数
for(Node *p=head;p;p=p->next)//如果遇到nullptr p就是false了,没碰到的时候sum+1
sum++;
return sum;
}
Node *getNodeByIndex(Node *head,Int n){//用来查找链表第几个的指针
Node *p=head;//创建Node指针p指向链表头
Int cnt;//用来计数
for(cnt=1;cnt<n;cnt++){//
p=p->next;//每for一次往后一个节点
}
return p;
}
Node *pushFrint(Node *head){//在链表头的前面加一个节点,返回它的指针
Node *p=new Node{head};//创建p指向新创建的指针
return p;
}
Node *insertBetween(Node *left,Node *right){//在right和between的中间添加节点并返回指针
return left->next =new Node{right};//left的下一个是新节点,它的下一个是right
}
Node *insertAftrer(Node *head){//在链表头后面添加节点
return head->next=new Node{head->next};//第一个的下一个是新节点,新节点的下一个是现在的第一个的下一个
}
Node *insertAftrerByIndex(Node *head,Int n){//在n的后面添加一个节点
Node *p=getNodeByIndex(head, n);//用getNodeByIndex求出n的地址
p->next=new Node{p->next};//然后创建新节点,第n个的下一个是新节点,新节点的下一个是现在的第n个的下一个
return head;
}
Node *insertBeforeByIndex(Node *head,Int n){//创建新节点在第n个之前
if(n==1)return pushFrint(head);//众所周知,在第n个之前插入和在第n-1个之后插入没区别,就是在n==1的时候不可以用,所以n==1时直接用pushfrint即可。
Node *p;
p=getNodeByIndex(head, n-1);//否则创建Node指针p求出n-1的指针,然后把它添加在n-1之后,n之前。
p->next=new Node{p->next};
return head;
}
void removeAfter(Node *left){//删除left后面的
Node *p=left->next;//用指针p指向left的下一个
Node *right=p->next;//用指针right指向要删除的东西的下一个
delete p;//删除节点
left->next=right;//补上
}
Node *popFront(Node *head){//删除链表头,输出新的链表头
Node *newHead=head->next;//先赋值新链表头(旧链表头删了就没了)
delete head;//删除链表头
return newHead;
}
Node *removeByIndex(Node *head,Int n){//删除第n个
if(n==1)return popFront(head);
removeAfter(getNodeByIndex(head, n-1));//如果是1就无法找到第0个,直接删除第一个删除,否则删除n-1的下一个n。
return head;
}//这个函数大部分用其他函数写的就不画了