链表翻转。
给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现
1.struct Node{
2.int data;
3.Node*next;
4.};
5.void reverse(Node*head,Node*end){
6.if(head==NULL||end==NULL)return;
7.Node*pre=NULL,*cur=head,*stop=end->next;
8.while(cur!=stop){
9.Node*nxt=cur->next;
10.cur->next=pre;
11.pre=cur;
12.cur=nxt;
13.}
14.}
15.
16.Node*reverseAll(Node*head,int k){
17.if(head==NULL||k<=0)return NULL;
18.Node*cur=head;
19.for(int i=0;i<k-1;i++){
20.cur=cur->next;
21.if(cur==NULL)
22.break;
23.}
24.if(cur==NULL)return head;
25.Node*begin=cur->next,*end=begin;
26.Node*pre=head;
27.reverse(head,cur);
28.
29.while(begin!=NULL){
30.for(int i=0;i<k-1;i++){
31.end=end->next;
32.if(end==NULL)
33.break;
34.}
35.if(end==NULL){
36.pre->next=begin;
37.break;
38.}
39.else{
40.Node*nextbegin=end->next;
41.reverse(begin,end);
42.pre->next=end;
43.pre=begin;
44.begin=end=nextbegin;
45.}
46.}
47.return cur;
48.}
49.
50.int main(){
51.int a[]={1,2,3,4,5,6,7,8,9,10,11,12};
52.Node*nd[12];
53.for(int i=0;i<12;i++){
54.nd[i]=new Node;
55.nd[i]->next=NULL;
56.nd[i]->data=a[i];
57.}
58.for(int i=0;i<11;i++){
59.nd[i]->next=nd[i+1];
60.}
61.Node*tmp=reverseAll(nd[0],4);
62.for(;tmp!=NULL;tmp=tmp->next){
63.cout<<tmp->data<<endl;
64.}
65.system("pause");
66.return0;
67.}
快速幂运算
typedefunsignedint T;
Tfoo(Ta,Tb)因子不包含本身)
方法是以空间换时间.申请可以存放500万个整数的数组Divisor,数组存放每个数的亲和数.数n=Divisor[Divisor[n]]即为一对亲和数.
1.void Amicable_Pair(int n)
2.{
3.int*num=new int[n];
4.for(int i=0;i<n;i++)
5.num[i]=1;
6.for(int i=2;i<=n/2;i++)
7.{
8.int j=i+i;
9.while(j<n)
10.{
11.num[j]+=i;
12.j+=i;
13.}
14.}//求出1-n的所有约数(除去本身)
15.for(int i=220;i<n;i++)
16.{
17.if(i<num[i]&&num[i]<n&&i==num[num[i]])
18.cout<<i<<""<<num[i]<<endl;
19.}
20.delete[]num;
21.}。