面试的算法2(C语言)(整理)
生活随笔
收集整理的這篇文章主要介紹了
面试的算法2(C语言)(整理)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
<pre name="code" class="cpp"><pre name="code" class="cpp">/*
寫一個函數,它的原形是int continumax(char *outputstr,char *intputstr)
功能:在字符串中找出連續最長的數字串,并把這個串的長度返回,并把這個最長數字串付給其中一個函數參數outputstr所指內存。例如:"abc123def123456eec123456789dd"的首地址傳給intputstr后,函數將返回9,outputstr所指的值為123456789。
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//自己寫的 把每個數字串都存下來再判斷 對于這道題的要求 略顯麻煩了 但如果要輸出每個數字串 可在這個基礎上改改就出來了
int FindMax_NumStr(char *outputstr,char *inputstr)
{char *in = inputstr,*out = outputstr;int numcnt=0;//記錄數字串數 一共有多少次 int *count=(int*)malloc(10*sizeof(int));//存數字串的長度char *temp[10];//存數字串的地址memset(count,0,10*sizeof(int));int max=0;//下標 記錄最長數字串int i;int flag=0;//flag 0:字母 1:數字if(*in>='0'&&*in<='9')flag=1;count--;//記錄每個數字串以及長度while(*in!='\0'){while(*in>='0'&&*in<='9'){if(flag==0){count++;temp[numcnt]=in;numcnt++;flag=1;}if(flag==1){(*count)++;}in++;}//字母:in++;flag=0;}//比較count[],求最長數字串count=(count-numcnt+1);max=numcnt-1;int tempnum=count[numcnt-1];for(i=0;i<numcnt-1;i++)if(count[i]>tempnum){max=i;tempnum=count[i];}/**(temp[max]+tempnum)='\0';outputstr=temp[max];*///保存最長數字串for(i=0;i<tempnum;i++){*out=*temp[max];out++;temp[max]++;}*out='\0';return tempnum;
}void main(void)
{char input[]="abc123def123456eec123456789dd";char output[10];int maxlen;maxlen = FindMax_NumStr(output,input);printf("the str is :%s\n",output);printf("the maxlen is :%d\n",maxlen);
}
//答案的 每次都先作比較 只保存一個最長數字串 int FindMax_NumStr(char *outputstr,char *inputstr) {char *in = inputstr,*out = outputstr,*temp;char *final;int count = 0;int maxlen = 0;int i;while(*in!='\0'){if(*in > 47 && *in < 58){for(temp = in;*in> 47 && *in <58;in++)count++;}elsein++;if(maxlen < count){maxlen = count;count = 0;final = temp;}}for(i =0;i<maxlen;i++){*out = *final;out++;final++;}*out = '\0';return maxlen; } /* 求1000!的未尾有幾個0;求出1->1000里,能被5整除的數的個數n1,能被25整除的數的個數n2,能被125整除的數的個數n3,能被625整除的數的個數n4.1000!末尾的零的個數=n1+n2+n3+n4;只要是末尾是5的數它乘以一個偶數就會出現一個0,而末尾是0的數乘以任何數也都會出現0 而末尾是0的如果是一個0肯定能被5整除,兩個0肯定能被25整數,以此類推3個0就能被5的三次方整除,也就是1251000!就是1-1000數的相乘,能被5整除的所有數分別乘以一個偶數就會出現這些個的0,而例如100,既能被5整除,也能被25整除,所以就是兩個01000,既能被5,25,也能被125整除,所以算三個0例如是10!=1*2*3*4*5*6*7*8*9*10,里面有兩個數能被5整除,就是10和5,而 5隨便乘以一個偶數就出現一個0,而10乘以其它數也會出現一個0,所以10!會有兩個0 *///方法一: #include<stdio.h> #define NUM 1000void main() {int n1=0,n2=0,n3=0,n4=0;for(int i=5;i<=NUM;i=i+5){if((i>=5)&&(i%5==0))n1++;if((i>=25)&&(i%25==0))n2++;if((i>=125)&&(i%125==0))n3++;if((i>=625)&&(i%625==0))n4++;}printf("%d\r\n",n1+n2+n3+n4); }//方法二:遞歸 #include <stdio.h> #define NUM 1000int find5(int num) {int ret = 0;while(num%5==0){num/=5;ret++;}return ret; }void main(void) {int result = 0;int i;for(i=5;i<=NUM;i+=5)result +=find5(i);printf("the total zero number is %d\n",result); } /* 編寫一個 C 函數,該函數在一個字符串中找到可能的最長的子字符串,且該字符串是由同一字符組成的。 */ //dfggggsrer455555frtrrrtvvvwwwwwwf445t56 #include <stdio.h> #include <string.h> #include <stdlib.h> #define NUM 10 //類似第一道的方法 每次比較 存出現次數最多的字符 char *find(char *str) {char finalch;//字符串字符char *final=(char*)malloc(NUM*sizeof(char));char ch;int i;int curcnt=0;int maxcnt=0;int flag=0;//第一個字符開始標志while(*str!='\0'){if(flag==0){ch=*str;curcnt++;flag=1;str++;}if(flag==1){while(*str==ch){curcnt++;str++;}flag=0;}if(curcnt>maxcnt){finalch=ch;maxcnt=curcnt;}curcnt=0;}for(i=0;i<maxcnt;i++){final[i]=finalch;}final[i]='\0';return final; }void main() {char str[]="dfggggsrer455555frtrrrtvvvwwwwwwf445t56";char *final;final=find(str);printf("最長子串為:%s\r\n",final); }
//答案的 每次都先作比較 只保存一個最長數字串 int FindMax_NumStr(char *outputstr,char *inputstr) {char *in = inputstr,*out = outputstr,*temp;char *final;int count = 0;int maxlen = 0;int i;while(*in!='\0'){if(*in > 47 && *in < 58){for(temp = in;*in> 47 && *in <58;in++)count++;}elsein++;if(maxlen < count){maxlen = count;count = 0;final = temp;}}for(i =0;i<maxlen;i++){*out = *final;out++;final++;}*out = '\0';return maxlen; } /* 求1000!的未尾有幾個0;求出1->1000里,能被5整除的數的個數n1,能被25整除的數的個數n2,能被125整除的數的個數n3,能被625整除的數的個數n4.1000!末尾的零的個數=n1+n2+n3+n4;只要是末尾是5的數它乘以一個偶數就會出現一個0,而末尾是0的數乘以任何數也都會出現0 而末尾是0的如果是一個0肯定能被5整除,兩個0肯定能被25整數,以此類推3個0就能被5的三次方整除,也就是1251000!就是1-1000數的相乘,能被5整除的所有數分別乘以一個偶數就會出現這些個的0,而例如100,既能被5整除,也能被25整除,所以就是兩個01000,既能被5,25,也能被125整除,所以算三個0例如是10!=1*2*3*4*5*6*7*8*9*10,里面有兩個數能被5整除,就是10和5,而 5隨便乘以一個偶數就出現一個0,而10乘以其它數也會出現一個0,所以10!會有兩個0 *///方法一: #include<stdio.h> #define NUM 1000void main() {int n1=0,n2=0,n3=0,n4=0;for(int i=5;i<=NUM;i=i+5){if((i>=5)&&(i%5==0))n1++;if((i>=25)&&(i%25==0))n2++;if((i>=125)&&(i%125==0))n3++;if((i>=625)&&(i%625==0))n4++;}printf("%d\r\n",n1+n2+n3+n4); }//方法二:遞歸 #include <stdio.h> #define NUM 1000int find5(int num) {int ret = 0;while(num%5==0){num/=5;ret++;}return ret; }void main(void) {int result = 0;int i;for(i=5;i<=NUM;i+=5)result +=find5(i);printf("the total zero number is %d\n",result); } /* 編寫一個 C 函數,該函數在一個字符串中找到可能的最長的子字符串,且該字符串是由同一字符組成的。 */ //dfggggsrer455555frtrrrtvvvwwwwwwf445t56 #include <stdio.h> #include <string.h> #include <stdlib.h> #define NUM 10 //類似第一道的方法 每次比較 存出現次數最多的字符 char *find(char *str) {char finalch;//字符串字符char *final=(char*)malloc(NUM*sizeof(char));char ch;int i;int curcnt=0;int maxcnt=0;int flag=0;//第一個字符開始標志while(*str!='\0'){if(flag==0){ch=*str;curcnt++;flag=1;str++;}if(flag==1){while(*str==ch){curcnt++;str++;}flag=0;}if(curcnt>maxcnt){finalch=ch;maxcnt=curcnt;}curcnt=0;}for(i=0;i<maxcnt;i++){final[i]=finalch;}final[i]='\0';return final; }void main() {char str[]="dfggggsrer455555frtrrrtvvvwwwwwwf445t56";char *final;final=find(str);printf("最長子串為:%s\r\n",final); }
總結
以上是生活随笔為你收集整理的面试的算法2(C语言)(整理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试的算法1(C语言)(整理)(组合数
- 下一篇: 面试中经常出现的算法1(整理)