一、快速幂
快速幂即是如何快速求解底数的n次幂的过程
快速幂算法的核心思想就是每一步都把指数分成两半,而相应的底数做平方运算。这样不仅能把非常大的指数给不断变小,所需要执行的循环次数也变小,而最后表示的结果却一直不会变。
1.传统解法
int ksm1(int x,int n)
{
if(x==0||n<=0) return 0;
int ans=1;
while(n)
{
if(n%2==0)
{
n/=2;
x*=x;
}
else
{
ans*=x;
n--;
}
}
return ans;
}
2.位运算解法
这里值得说明的是,直接让n与1做位运算,如果得到的1,说明该位置为1,即对应的二进制位是1,直接乘即可,x=x^2,然后n向右整体偏移一位,重复比较。
int ksm2(int x,int n)
{
if(x==0||n<=0) return 0;
int ans=1;
while(n)
{
if(n&1==1)
{
ans*=x;
}
n>>=1;
x*=x;
}
return ans;
}
二、链表
1.链表的一些知识
- 链表是一种物理存储结构上非连续 、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。
- 节点类型是结构体,结构体包含数据域和指针域,数据域用来存放节点保存的数据,指针域保存下一个节点的地址。
- 存储空间可以不连续,可以在符合基本规则的情况下随意增删节点。
- 链表只有头增头删是O(1),别的位置进行增删都是O(n),虽然增删比较方便 但是其实都需要遍历。尾插能维持数据的原本顺序,头插会与原来的顺序相反。
- 头插法:优点:在不是空表的情况下,插入结点不需要从头到尾查找直到找到尾结点,效率较高
缺点:插入的顺序相反 - 尾插法:优点:插人的顺序相同
缺点:在不是空表的情况下,插人结点需要从头到尾查找直到找到尾结点,效率低
2.链表的创建
List * CreateList()
{
List * pHead = NULL;
List * pTail = NULL;
int len;
int num;
printf("请输入链表的长度\n");
scanf("%d",&len);
List * pTemp =NULL;
while(len)
{
printf("请输入数据:\n");
scanf("%d",&num);
//malloc的类型是void*
pTemp = (List*)malloc(sizeof(List));//一次一个大小就行
pTemp->data=num;
pTemp->next=NULL;
//空链表
if(pHead==NULL)
{
pHead = pTemp;
pTail = pTemp;
}else
{
pTail->next=pTemp;
}
pTail = pTemp;
len--;
}
return pHead;
}