上機總結
1.素數
for(i=2;i<=sqrt(num);i++)//有等號
{
if(num%i==0)
return 0;
}
2.進位制
void print(int x)//把一個整數轉化為二進位制輸出
{
if(x)
{
print(x/2);
putchar(x%2 + '0');
}
}
3.冒泡優化
void sort(int a[],int n)
{
int i,j,temp,flag;
for(i=0;i<n-1;i++)
{
flag=0;
for(j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
flag=1;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
if(flag==0)
break;
}
}
4.字串轉為數值(二進位制字串為例)
int str_to_num(char x[])
{
int len = strlen(x);
int ret = 0;
int i;
int k=0;
for(i=len-1;i>=0;i--)
{
ret+=(x[i]-'0')*pow(2,k);
++k;
}
return ret;
}
5.兩字串加法
Char* GetSum(char *a,char *b)
{
int m,carry=0,s=0;
int pos_a = strlen(a)-1,pos_b=strlen(b)-1;
int pos_c = pos_a>pos_b?pos_a:pos_b;
int i=pos_a,j=pos_b,k=pos_c;
char *c = (char *)malloc(sizeof(char)*(pos_c)+1);
for(;i>=0 && j>=0;i--,j--,k--)
{
m = a[i] + b[j] - 2*'0' + carry;
carry = m/10;
c[k] = m>9 ? m-10+'0' : m+'0';
}
for(;i>=0;i--,k--)
{
m = a[i] - '0' + carry;
carry = m/10;
c[k] = m>9 ? m-10+'0' : m+'0';
}
for(;j>=0;j--,k--)
{
m = b[j] - '0' + carry;
carry = m/10;
c[k] = m>9 ? m-10+'0' : m+'0';
}
char *sum = (char *)malloc(sizeof(char)*(carry?pos_c+3:pos_c+2));
if(carry){
sum[0]='1';
s++;
}
for(m=0;m<=pos_c;)sum[s++]=c[m++];
sum[s]='\0';
return sum;
}
5.二進位制左右移操作
/*①unsigned long int資料高低位元組交換
②在①的基礎上對2、3位元組迴圈左移n位
③按二進位制格式輸出②,每八位一個空格*/
#include<stdio.h>
unsigned long int ulint;
void fun(unsigned long int ulint)
{
//實現第一步
unsigned long int hbyte=ulint>>24;
unsigned long int lbyte=ulint<<24;
unsigned long int temp=ulint&0x00ffff00;//注意十六進位制要用0x開頭
ulint=temp|hbyte;
ulint=ulint|lbyte;
printf("第一步轉化的結果是: %x\n",ulint);
//實現第二步
int n;
scanf("%d",&n);
n=n%16;
temp=ulint&0x00ffff00;
temp=temp>>8;
temp=temp<<n;
hbyte=(temp&0xffff0000)>>16;
lbyte=temp&0x0000ffff;
temp=hbyte|lbyte;
temp=temp<<8;
ulint=temp|(ulint&0xff0000ff);
printf("第二步轉化的結果是: %x\n",ulint);
//實現第三步
unsigned long int num=1;
int i;
printf("第三步後的轉化結果為:\n")
for(i=0;i<=31;i++)
{
if(i%8==0)
putchar(' ');
num=num<<(31-i);
num=num&ulint;
num=num>>(31-i);
printf("%d",num);
num=1;
}
putchar(10);
}
int main()
{
scanf("%x",&ulint);
fun(ulint);
return 0;
}
6.檔案操作
//使用者輸入一個文字,程式設計實現輸出文字中最長的一行和最短的一行。如果最長和最短的不止一行,請全部輸出
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 50
char temp[N][N];//儲存文字行
int maxLine=0,minLine=100;//儲存最大,最小行下表
int main()
{
//建立檔案並輸入文字
FILE *fp;
char ch;
char str[N];
int i=0,j;
if((fp=fopen("test.txt","w"))==NULL) //fp=fopen(“c:\a.txt”, “w”)
{
printf("開啟檔案失敗!\n");
exit(0);
}
printf("請輸入文字內容:\n");
while((ch=getchar())!=EOF)
fputc(ch,fp);//相應的fputs(str,fp)寫入一串字串到檔案中,str為字串指標
printf("已把內容寫入檔案之中!\n");
fclose(fp);
//開啟檔案,計算最長的最短的文字,並且輸出
if((fp=fopen("test.txt","r"))==NULL)
{
printf("開啟檔案失敗!\n");
exit(0);
}
while(!feof(fp))//不到達檔案尾
{
//ch=fgetc(fp);//得到單個字元
fgets(str,N,fp);//從fp所指檔案讀n-1個字元,然後在其後補充一個字串結束標記’\0’存入字元陣列str中;
//如果在讀完n-1個字元之前遇到回車換行符或EOF(檔案尾),讀入結束;
strcpy(temp[i++],str);//這裡多存了一次,因為沒有到達檔案尾
}
fclose(fp);
return 0;
}
7.函式指標
#include<stdio.h>
void taski()
{
printf("taski called!\n");
}
....
void execute(void (*p[])(),int i)
{
(*(p[i]))();//或者p[i]();
}
void shedule(void (*p[])(),char s[])
{
while((*s)!='\0')//以後就這樣用(*s),不用strlen
{
execute(p,(*s)-'0');
s++;
}
}
void main()
{
char s[30];
gets(s);
void (*p[9])()={task0,task1,task2,task3,task4,task5,task6,task7,task8};
shedule(p,s);
}
8.冗餘操作
//無冗餘地實現兩個字串的連線
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *s1=(char *)malloc(sizeof(char));
char *s2=(char *)malloc(sizeof(char));
char ch;
int k1=1,k2=1,i;
printf("請輸入兩個字串,換行隔開:\n");
while((ch=getchar())!='\n')
{
s1=(char *)realloc(s1,k1*sizeof(char));
*(s1+k1-1)=ch;
k1++;
}
*(s1+k1-1)='\0';//s1長k1-1
while((ch=getchar())!='\n')
{
s2=(char *)realloc(s2,k2*sizeof(char));
*(s2+k2-1)=ch;
k2++;
}
*(s2+k2-1)='\0';//s2長k2-1
//連線,接到s1上去
for(i=0;i<k2;i++)
*(s1+k1-1+i)=*(s2+i);
printf("%s\n",s1);
return 0;
}
//字元竄陣列
char** a=(char**)malloc(n*sizeof(char*));
c=getchar();//接受回車符
for(i=0;i<n;i++)
{
count=0;
a[i]=(char*)malloc(sizeof(char));
while((c=getchar())!='\n')
{
count++;
a[i]=(char*)realloc(a[i],count*(sizeof(char)));
a[i][count-1]=c;
}
a[i][count]='\0';
}
9.命令列
//命令列形式:mycopy 1.txt 2.txt 3.txt 4.txt ...
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char* argv[])
{
FILE* in,*out;
int i;
if(argc<3)
{
printf("error\n");
exit(0);
}
if((out=fopen(argv[argc-1],"w"))==NULL)
{
printf("cannot open outfile\n");
exit(0);
}
for(i=1;i<argc-1;i++)
{
if((in=fopen(argv[i],"r"))==NULL)
{
printf("cannot open outfile\n");
exit(0);
}
while(!feof(in))
fputc(fgetc(in),out);
}
fclose(in);
fclose(out);
return 0;
}
10.二叉樹
void CreateBiTree(BiTree &T)//先序構建二叉樹
{
char ch;
ch=getchar();
if(ch=='#')
T=NULL;
else
{
T=(BitNode *)malloc(sizeof(BitNode));
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
int Node0(BiTree T)//統計度數為0的結點(葉子結點)
{
int n1,n2,n=0;//n在遞迴呼叫時每次要初始化為0
if(T==NULL)
return 0;
else
{
if(T->lchild==NULL&&T->rchild==NULL)
n=1;
n1=Node0(T->lchild);
n2=Node0(T->rchild);
return n+n1+n2;
}
}
int High(BiTree T)//求樹高
{
int lhigh,rhigh;
if(T==NULL)
return 0;
else
{
lhigh=High(T->lchild);
rhigh=High(T->rchild);
return (lhigh>rhigh? lhigh+1:rhigh+1);
}
}
void ChangeLR(BiTree &T)//交換左右子樹,類似後序遍歷
{
BitNode *temp;
if(T==NULL)
return;
else
{
ChangeLR(T->lchild);
ChangeLR(T->rchild);
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
}
}
void CreatePaiXu(BiTree &T,char num)
{
if(T==NULL)
{
T=(BitNode*)malloc(sizeof(BitNode));
T->data=num;
T->lchild=T->rchild=NULL;//這一步置左右子樹為空一定不要掉了
}
else
{
if(num>(T->data))
CreatePaiXu(T->rchild,num);
else
CreatePaiXu(T->lchild,num);
}
}
int Width(BiTree T)//樹的寬度(背下來)
{
static int max=0;//樹的寬度的最大值
static int n[6]={0,0,0,0,0,0};//每一層的節點數
static int i=1;//層數
if(T)
{
if(i==1)
{
n[i]=1;
++i;
if(T->lchild )
n[i]++;
if(T->rchild )
n[i]++;
}
else
{
i++;
if(T->lchild)
n[i]++;
if(T->rchild )
n[i]++;
}
if(n[i]>max)
max=n[i];
Width(T->lchild );//遞迴遍歷左子樹
i--;//返回上一層
Width(T->rchild );//遞迴遍歷右子樹
}
return max;
}
//知道一顆二叉樹的先序和中序,構造二叉樹
BiTree PlanTree(char prior[],char middle[],int pf,int pr,int mf,int mr)
{
BiTree T=(BitNode*)malloc(sizeof(BitNode));
int k=mf;
if(pr-pf<0)//以pr-pf<0結束遞迴
return NULL;
while(prior[pf]!=middle[k])
k++;
if(k>mr)
{
printf("該先序和中序不能構造二叉樹!\n");
exit(0);
}
T->data=middle[k];
T->lchild=PlanTree(prior,middle,pf+1,pf+k-mf,mf,k-1);//pf+k-mf記住
T->rchild=PlanTree(prior,middle,pf+k-mf+1,pr,k+1,mr);
return T;
}
11.連結串列
void Sort(StuList &L)//對連結串列就地排序,類似插排的思想(此方法要記住)
{
StuNode *q=L,*p=L->next;
StuNode *np=p->next;
p->next=NULL;
p=np;
while(p)//兩個while迴圈要記住
{
np=p->next;//儲存p的下一結點
while(q->next)
{
if(p->avg>=(q->next)->avg)
{
p->next=q->next;
q->next=p;
q=L;//插完重置
break;
}
else
q=q->next;
}
if((q->next)==NULL)
{
p->next=q->next;
q->next=p;
q=L;//插完重置
}
p=np;
}
}
12.圖
/*
typedef struct ArcNode{
int adjVex;
double info;
struct ArcNode *nextArc;
}ArcNode;
typedef struct VexNode{
char *vexName;
struct ArcNode *firstArc;
}VexNode,AdjList[MAXVEX];
typedef struct Net{
AdjList vexs;
int arcNum,vexNum;
}Net;
int FindVex(Net ga,char *name)//找頂點的位置
{
int i;
for(i=0;i<ga.vexNum;i++)
{
if(strcmp(name,ga.vexs[i].vexName)==0)
return i;
}
return -1;
}
void CreateNet(Net &ga)
{
int i,li,lj;
char name1[10],name2[10];
double w=0;
ArcNode *p;
printf("輸入頂點數和弧數:\n");
scanf("%d%d",&ga.vexNum,&ga.arcNum);//scanf裡面的&不要忘了
printf("輸入%d個頂點名:\n",ga.vexNum);
for(i=0;i<ga.vexNum;i++)
{
ga.vexs[i].vexName=(char *)malloc(sizeof(char));
scanf("%s",ga.vexs[i].vexName);
ga.vexs[i].firstArc=NULL;
}
for(i=0;i<ga.arcNum;i++)
{
printf("輸入兩個相鄰的點和權值:\n");
scanf("%s%s%lf",name1,name2,&w);
li=FindVex(ga,name1);
lj=FindVex(ga,name2);
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjVex=lj;
p->info=w;
p->nextArc=ga.vexs[li].firstArc;//頭插法建立
ga.vexs[li].firstArc=p;
}
}
void DFS(Net ga,char *name,int visited[])//深搜
{
int l=FindVex(ga,name);
visited[l]=1;//表示訪問了
printf("%s",ga.vexs[l].vexName);
ArcNode *p=ga.vexs[l].firstArc;
while(p)
{
int adj=p->adjVex;
if(!visited[adj])
DFS(ga,ga.vexs[adj].vexName,visited);
else
p=p->nextArc;
}
}
void DFSTravel(Net ga,char *name)
{
int visited[MAXVEX];
int i;
for(i=0;i<ga.vexNum;i++)
visited[i]=0;
int l=FindVex(ga,name);
if(visited[l]==0)
DFS(ga,name,visited);
}
*/
typedef struct Graph{//鄰接矩陣資料結構
char vexs[MAXVEX][MAXVEX];//儲存結點字元陣列
double matric[MAXVEX][MAXVEX];
int vexNum,arcNum;
}Graph;
typedef struct Knode //用於克魯斯卡爾演算法中儲存一條邊及其對應的2個節點
{
char *ch1; //節點1
char *ch2; //節點2
double value;//權值
}Knode,Temp[MAXVEX];
int FindVex(Graph G,char *name)//找頂點位置
{
int i;
for(i=0;i<G.vexNum;i++)
{
if(strcmp(name,G.vexs[i])==0)
return i;
}
return -1;
}
void CreateGraph(Graph &G,Temp &T)//建立無向加權圖
{
int i,j;
double d;
char *ch1,*ch2;
int li,lj;
printf("請輸入頂點數和弧數:\n");
scanf("%d%d",&G.vexNum,&G.arcNum);
printf("請輸入%d個頂點:\n",G.vexNum);
for(i=0;i<G.vexNum;i++)
scanf("%s",&G.vexs[i]);
for(i=0;i<G.vexNum;i++)
{
for(j=0;j<G.vexNum;j++)
G.matric[i][j]=MAX;//初始化矩陣為很大的值
}
printf("請輸入兩個頂點和邊的權值:\n");
for(i=0;i<G.arcNum;i++)
{
ch1=(char *)malloc(sizeof(char));
ch2=(char *)malloc(sizeof(char));
scanf("%s%s%lf",ch1,ch2,&d);
li=FindVex(G,ch1);
lj=FindVex(G,ch2);
G.matric[li][lj]=d;//矩陣賦值
G.matric[lj][li]=d;//注意這是無向加權圖
T[i].ch1=ch1;
T[i].ch2=ch2;
T[i].value=d;
}
}
void Sort(Temp &T,Graph G)
{
int i,j;
double temp;
char *ch1,*ch2;
for(i=0;i<G.arcNum-1;i++)
{
for(j=0;j<G.arcNum-1-i;j++)
{
if(T[j].value>T[j+1].value)
{
temp=T[j].value;
T[j].value=T[j+1].value;
T[j+1].value=temp;
ch1=T[j].ch1;
T[j].ch1=T[j+1].ch1;
T[j+1].ch1=ch1;
ch2=T[j].ch2;
T[j].ch2=T[j+1].ch2;
T[j+1].ch2=ch2;
}
}
}
}
void KRSL(Graph G,Temp &T)//最小生成樹的演算法
{
int i,j,ii,jj;
int flag[MAXVEX];//標記陣列
Sort(T,G);//首先按權值排序
for(i=0;i<G.vexNum;i++)
flag[i]=i;
for(i=0;i<G.arcNum;i++)
{
ii=flag[FindVex(G,T[i].ch1)];
jj=flag[FindVex(G,T[i].ch2)];
if(ii!=jj)
{
printf("%s%s%lf\n",T[i].ch1,T[i].ch2,T[i].value);
for(j=0;j<G.vexNum;j++)
{
if(flag[j]==jj)
flag[j]=ii;
}
}
}
}
相關文章
- 機房上機總結
- Redis總結(上)Redis
- 上架總結
- Django model總結(上)Django
- Java虛擬機器總結給面試的你(上)Java虛擬機面試
- 《微機結構》總結
- 微機結構總結
- 機房合作總結
- 交換機埠總結
- 上傳模組開發總結
- GPU 渲染管線簡單總結(網上資料總結)GPU
- 感知機(perceptron)原理總結
- 機房重構總結
- slub機制偽總結
- java機制總結 一Java
- 交換機埠安全總結
- mysql鎖機制總結MySql
- 檔案上傳漏洞總結(全)
- vim總結貼上/複製篇
- 類載入機制總結
- Spring SPI 機制總結Spring
- 微機原理之DMA總結
- slab機制總結篇
- linux 關機命令總結Linux
- mac開關機技巧總結Mac
- Javascript繼承機制總結JavaScript繼承
- RMAN異機恢復總結
- Spark Core基礎面試題總結(上)Spark面試題
- 大二上學期個人總結
- Web檔案上傳方法總結大全Web
- 你不知道的JS(上) 【總結】JS
- 樹上啟發式合併總結
- 計算機考研經驗總結計算機
- Java類載入機制總結Java
- 華為機試題刷題總結
- PHP 的錯誤機制總結PHP
- PHP的錯誤機制總結PHP
- cisco交換機命令總結匯集