欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      C語(yǔ)言常用算法歸納

      時(shí)間:2019-05-12 16:51:19下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫寫幫文庫(kù)小編為你整理了多篇相關(guān)的《C語(yǔ)言常用算法歸納》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫(kù)還可以找到更多《C語(yǔ)言常用算法歸納》。

      第一篇:C語(yǔ)言常用算法歸納

      C語(yǔ)言常用算法歸納

      應(yīng)當(dāng)掌握的一般算法

      一、基本算法:

      交換、累加、累乘

      二、非數(shù)值計(jì)算常用經(jīng)典算法:

      窮舉、排序(冒泡,選擇)、查找(順序即線性)

      三、數(shù)值計(jì)算常用經(jīng)典算法:

      級(jí)數(shù)計(jì)算(直接、簡(jiǎn)接即遞推)、一元非線性方程求根(牛頓迭代法、二分法)、定積分計(jì)算(矩形法、梯形法)

      四、其他:

      迭代、進(jìn)制轉(zhuǎn)換、矩陣轉(zhuǎn)置、字符處理(統(tǒng)計(jì)、數(shù)字串、字母大小寫轉(zhuǎn)換、加密等)、整數(shù)各數(shù)位上數(shù)字的獲取、輾轉(zhuǎn)相除法求最大公約數(shù)(最小公倍數(shù))、求最值、判斷素?cái)?shù)(各種變形)、數(shù)組元素的插入(刪除)、二維數(shù)組的其他典型問(wèn)題(方陣的特點(diǎn)、楊輝三角形)

      詳細(xì)講解

      一、基本算法

      1.交換(兩量交換借助第三者)

      1、任意讀入兩個(gè)整數(shù),將二者的值交換后輸出。main(){ int a,b,t;

      scanf(“%d%d”,&a,&b);

      printf(“%d,%dn”,a,b);t=a;a=b;b=t;

      printf(“%d,%dn”,a,b);} 1 【解析】程序中加粗部分為算法的核心,如同交換兩個(gè)杯子里的飲料,必須借助第三個(gè)空杯子。

      假設(shè)輸入的值分別為3、7,則第一行輸出為3,7;第二行輸出為7,3。其中t為中間變量,起到“空杯子”的作用。

      注意:三句賦值語(yǔ)句賦值號(hào)左右的各量之間的關(guān)系!

      【應(yīng)用】

      2、任意讀入三個(gè)整數(shù),然后按從小到大的順序輸出。main(){ int a,b,c,t;scanf(“%d%d%d”,&a,&b,&c);/*以下兩個(gè)if語(yǔ)句使得a中存放的數(shù)最小*/ if(a>b){ t=a;a=b;b=t;} if(a>c){ t=a;a=c;c=t;} /*以下if語(yǔ)句使得b中存放的數(shù)次小*/ if(b>c){ t=b;b=c;c=t;} printf(“%d,%d,%dn”,a,b,c);} 2.累加

      累加算法的要領(lǐng)是形如“s=s+A”的累加式,此式必須出現(xiàn)在循環(huán)中才能被反復(fù)執(zhí)行,從而實(shí)現(xiàn)累加功能?!癆”通常是有規(guī)律變化的表達(dá)式,s在進(jìn)入循環(huán)前必須獲得合適的初值,通常為0。

      1、求1+2+3+……+100的和。main(){ int i,s;s=0;i=1;while(i<=100){ s=s+i;/*累加式*/

      i=i+1;/*特殊的累加式*/

      }

      printf(“1+2+3+...+100=%dn”,s);} 【解析】程序中加粗部分為累加式的典型形式,賦值號(hào)左右都出現(xiàn)的變量稱為累加器,其中“i = i + 1”為特殊的累加式,每次累加的值為1,這樣的累加器又稱為計(jì)數(shù)器。

      3.累乘

      累乘算法的要領(lǐng)是形如“s=s*A”的累乘式,此式必須出現(xiàn)在循環(huán)中才能被反復(fù)執(zhí)行,從而實(shí)現(xiàn)累乘功能?!癆”通常是有規(guī)律變化的表達(dá)式,s在進(jìn)入循環(huán)前必須獲得合適的初值,通常為1。

      1、求10!

      [分析] 10!=1×2×3×……×10

      main(){ int i;long c;c=1;i=1;while(i<=10){ c=c*i;/*累乘式*/

      i=i+1;} printf(“1*2*3*...*10=%ldn”,c);}

      二、非數(shù)值計(jì)算常用經(jīng)典算法

      1.窮舉

      也稱為“枚舉法”,即將可能出現(xiàn)的每一種情況一一測(cè)試,判斷是否滿足條件,一般采用循環(huán)來(lái)實(shí)現(xiàn)。

      1、用窮舉法輸出所有的水仙花數(shù)(即這樣的三位正整數(shù):其每位數(shù)位上的數(shù)字的立方和與該數(shù)相等,比如:1*1*1+5*5*5+3*3*3=153)。

      [法一] main(){ int x,g,s,b;for(x=100;x<=999;x++){ g=x%10;s=x/10%10;b=x/100;

      if(b*b*b+s*s*s+g*g*g==x)printf(“%dn”,x);} } 【解析】此方法是將100到999所有的三位正整數(shù)一一考察,即將每一個(gè)三位正整數(shù)的個(gè)位數(shù)、十位數(shù)、百位數(shù)一一求出(各數(shù)位上的數(shù)字的提取算法見下面的“數(shù)字處理”),算出三者的立方和,一旦與原數(shù)相等就輸出。共考慮了900個(gè)三位正整數(shù)。

      [法二] main(){int g,s,b;for(b=1;b<=9;b++)for(s=0;s<=9;s++)for(g=0;g<=9;g++)

      if(b*b*b+s*s*s+g*g*g==b*100+s*10+g)printf(“%dn”,b*100+s*10+g);} 【解析】此方法是用1到9做百位數(shù)字、0到9做十位和個(gè)位數(shù)字,將組成的三位正整數(shù)與每一組的三個(gè)數(shù)的立方和進(jìn)行比較,一旦相等就輸出。共考慮了900個(gè)組合(外循環(huán)單獨(dú)執(zhí)行的次數(shù)為9,兩個(gè)內(nèi)循環(huán)單獨(dú)執(zhí)行的次數(shù)分別為10次,故if語(yǔ)句被執(zhí)行的次數(shù)為9×10×10=900),即900個(gè)三位正整數(shù)。與法一判斷的次數(shù)一樣。

      2.排序

      (1)冒泡排序(起泡排序)

      假設(shè)要對(duì)含有n個(gè)數(shù)的序列進(jìn)行升序排列,冒泡排序算法步驟是:

      ①?gòu)拇娣判蛄械臄?shù)組中的第一個(gè)元素開始到最后一個(gè)元素,依次對(duì)相鄰兩數(shù)進(jìn)行比較,若前者大后者小,則交換兩數(shù)的位置;

      ②第①趟結(jié)束后,最大數(shù)就存放到數(shù)組的最后一個(gè)元素里了,然后從第一個(gè)元素開始到倒數(shù)第二個(gè)元素,依次對(duì)相鄰兩數(shù)進(jìn)行比較,若前者大后者小,則交換兩數(shù)的位置;

      ③重復(fù)步驟①n-1趟,每趟比前一趟少比較一次,即可完成所求。例

      1、任意讀入10個(gè)整數(shù),將其用冒泡法按升序排列后輸出。#define n 10 main(){ int a[n],i,j,t;for(i=0;i

      scanf(“%d”,&a[i]);for(j=1;j<=n-1;j++)

      /*n個(gè)數(shù)處理n-1趟*/

      for(i=0;i<=n-1-j;i++)/*每趟比前一趟少比較一次*/

      if(a[i]>a[i+1]){ t=a[i];a[i]=a[i+1];a[i+1]=t;} for(i=0;i

      (2)選擇法排序

      選擇法排序是相對(duì)好理解的排序算法。假設(shè)要對(duì)含有n個(gè)數(shù)的序列進(jìn)行升序排列,算法步驟是:

      ①?gòu)臄?shù)組存放的n個(gè)數(shù)中找出最小數(shù)的下標(biāo)(算法見下面的“求最值”),然后將最小數(shù)與第1個(gè)數(shù)交換位置;

      ②除第1個(gè)數(shù)以外,再?gòu)钠溆鄋-1個(gè)數(shù)中找出最小數(shù)(即n個(gè)數(shù)中的次小數(shù))的下標(biāo),將此數(shù)與第2個(gè)數(shù)交換位置;

      ③重復(fù)步驟①n-1趟,即可完成所求。

      1、任意讀入10個(gè)整數(shù),將其用選擇法按升序排列后輸出。#define n 10 main(){ int a[n],i,j,k,t;for(i=0;i

      if(a[j] < a[k])k = j;

      if(k!= i){ t = a[i];a[i] = a[k];a[k] = t;} } for(i=0;i

      printf(“%dn”,a[i]);}

      (3)插入法排序

      要想很好地掌握此算法,先請(qǐng)了解“有序序列的插入算法”,就是將某數(shù)據(jù)插入到一個(gè)有序序列后,該序列仍然有序。插入算法參見下面的“數(shù)組元素的插入”。

      1、將任意讀入的整數(shù)x插入一升序數(shù)列后,數(shù)列仍按升序排列。#define n 10 main(){ int a[n]={-1,3,6,9,13,22,27,32,49},x,j,k;

      /*注意留一個(gè)空間給待插數(shù)*/ scanf(“%d”,&x);if(x>a[n-2])a[n-1]=x;

      /*比最后一個(gè)數(shù)還大就往最后一個(gè)元素中存放*/ else

      /*查找待插位置*/

      { j=0;

      while(j<=n-2 && x>a[j])j++;

      for(k=n-2;k>=j;k--)/*從最后一個(gè)數(shù)開始直到待插位置上的數(shù)依次后移一位*/ a[k+1]=a[k];

      a[j]=x;

      /*插入待插數(shù)*/ }

      for(j=0;j<=n-1;j++)printf(“%d ”,a[j]);} 插入法排序的要領(lǐng)就是每讀入一個(gè)數(shù)立即插入到最終存放的數(shù)組中,每次插入都使得該數(shù)組有序。

      2、任意讀入10個(gè)整數(shù),將其用插入法按降序排列后輸出。(提示:將第2至第10個(gè)數(shù)一一有序插入到數(shù)組a中)#define n 10 main(){ int a[n],i,j,k,x;scanf(“%d”,&a[0]);/*讀入第一個(gè)數(shù),直接存到a[0]中*/ for(j=1;j

      { scanf(“%d”,&x);

      if(x

      else /*以下查找待插位置*/

      { i=0;

      while(x

      /*以下for循環(huán)從原最后一個(gè)數(shù)開始直到待插位置上的數(shù)依次后移一位*/

      for(k=j-1;k>=i;k--)a[k+1]=a[k];

      a[i]=x;/*插入待插數(shù)*/

      }

      } for(i=0;i

      (4)歸并排序

      即將兩個(gè)都升序(或降序)排列的數(shù)據(jù)序列合并成一個(gè)仍按原序排列的序列。

      1、有一個(gè)含有6個(gè)數(shù)據(jù)的升序序列和一個(gè)含有4個(gè)數(shù)據(jù)的升序序列,將二者合并成一個(gè)含有10個(gè)數(shù)據(jù)的升序序列。

      #define m 6 #define n 4 main(){ int a[m]={-3,6,19,26,68,100} ,b[n]={8,10,12,22};int i,j,k,c[m+n];i=j=k=0;while(i

      /*將a、b數(shù)組中的較小數(shù)依次存放到c數(shù)組中*/ { if(a[i]

      else {c[k]=b[j];j++;}

      k++;} while(i>=m && j=n && i

      (1)順序查找(即線性查找)順序查找的思路是:將待查找的量與數(shù)組中的每一個(gè)元素進(jìn)行比較,若有一個(gè)元素與之相等則找到;若沒(méi)有一個(gè)元素與之相等則找不到。

      1、任意讀入10個(gè)數(shù)存放到數(shù)組a中,然后讀入待查找數(shù)值,存放到x中,判斷a中有無(wú)與x等值的數(shù)。

      #define N 10 main(){ int a[N],i,x;for(i=0;i

      (2)折半查找(即二分法)

      順序查找的效率較低,當(dāng)數(shù)據(jù)很多時(shí),用二分法查找可以提高效率。使用二分法查找的前提是數(shù)列必須有序。

      二分法查找的思路是:要查找的關(guān)鍵值同數(shù)組的中間一個(gè)元素比較,若相同則查找成功,結(jié)束;否則判別關(guān)鍵值落在數(shù)組的哪半部分,就在這半部分中按上述方法繼續(xù)比較,直到找到或數(shù)組中沒(méi)有這樣的元素值為止。

      1、任意讀入一個(gè)整數(shù)x,在升序數(shù)組a中查找是否有與x等值的元素。#define n 10 main(){ int a[n]={2,4,7,9,12,25,36,50,77,90};int x,high,low,mid;/*x為關(guān)鍵值*/ scanf(“%d”,&x);high=n-1;low=0;mid=(high+low)/2;while(a[mid]!=x&&low

      else low=mid+1;/*修改區(qū)間下界*/

      mid=(high+low)/2;} if(x==a[mid])printf(“Found %d,%dn”,x,mid);else printf(“Not foundn”);}

      三、數(shù)值計(jì)算常用經(jīng)典算法

      1.級(jí)數(shù)計(jì)算

      級(jí)數(shù)計(jì)算的關(guān)鍵是“描述出通項(xiàng)”,而通項(xiàng)的描述法有兩種:一為直接法、二為間接法又稱遞推法。

      直接法的要領(lǐng)是:利用項(xiàng)次直接寫出通項(xiàng)式;遞推法的要領(lǐng)是:利用前一個(gè)(或多個(gè))通項(xiàng)寫出后一個(gè)通項(xiàng)。

      可以用直接法描述通項(xiàng)的級(jí)數(shù)計(jì)算例子有:(1)1+2+3+4+5+……

      (2)1+1/2+1/3+1/4+1/5+……等等。

      可以用間接法描述通項(xiàng)的級(jí)數(shù)計(jì)算例子有:(1)1+1/2+2/3+3/5+5/8+8/13+……(2)1+1/2!+1/3!+1/4!+1/5!+……等等。(1)直接法求通項(xiàng)

      1、求1+1/2+1/3+1/4+1/5+……+1/100的和。main(){ float s;int i;s=0.0;for(i=1;i<=100;i++)s=s+1.0/i;printf(“1+1/2+1/3+...+1/100=%fn”,s);} 【解析】程序中加粗部分就是利用項(xiàng)次i的倒數(shù)直接描述出每一項(xiàng),并進(jìn)行累加。注意:因?yàn)閕是整數(shù),故分子必須寫成1.0的形式!

      (2)間接法求通項(xiàng)(即遞推法)

      2、計(jì)算下列式子前20項(xiàng)的和:1+1/2+2/3+3/5+5/8+8/13+……。[分析]此題后項(xiàng)的分子是前項(xiàng)的分母,后項(xiàng)的分母是前項(xiàng)分子分母之和。main(){ float s,fz,fm,t,fz1;int i;s=1;/*先將第一項(xiàng)的值賦給累加器s*/ fz=1;fm=2;t=fz/fm;/*將待加的第二項(xiàng)存入t中*/ for(i=2;i<=20;i++){ s=s+t;

      /*以下求下一項(xiàng)的分子分母*/

      fz1=fz;/*將前項(xiàng)分子值保存到fz1中*/

      fz=fm;/*后項(xiàng)分子等于前項(xiàng)分母*/

      fm=fz1+fm;/*后項(xiàng)分母等于前項(xiàng)分子、分母之和*/ t=fz/fm;} printf(“1+1/2+2/3+...=%fn”,s);}

      下面舉一個(gè)通項(xiàng)的一部分用直接法描述,另一部分用遞推法描述的級(jí)數(shù)計(jì)算的例子:

      3、計(jì)算級(jí)#include float g(float x,float eps);main()

      數(shù)的值,當(dāng)通項(xiàng)的絕對(duì)值小于eps時(shí)計(jì)算停止。

      { float x,eps;scanf(“%f%f”,&x,&eps);printf(“n%f,%fn”,x,g(x,eps));} float g(float x,float eps){ int n=1;float s,t;s=1;t=1;do { t=t*x/(2*n);

      s=s+(n*n+1)*t;/*加波浪線的部分為直接法描述部分,t為遞推法描述部分*/

      n++;}while(fabs(t)>eps);return s;} 2.一元非線性方程求根

      (1)牛頓迭代法

      牛頓迭代法又稱牛頓切線法:先任意設(shè)定一個(gè)與真實(shí)的根接近的值x0作為第一次近似根,由x0求出f(x0),過(guò)(x0,f(x0))點(diǎn)做f(x)的切線,交x軸于x1,把它作為第二次近似根,再由x1求出f(x1),過(guò)(x1,f(x1))點(diǎn)做f(x)的切線,交x軸于x2,……如此繼續(xù)下去,直到足夠接近(比如|x-x0|<1e-6時(shí))真正的根x*為止。

      而f '(x0)=f(x0)/(x1-x0)所以 x1= x0-f(x0)/ f '(x0)

      例如,用牛頓迭代法求下列方程在1.5附近的根:2x3-4x2+3x-6=0。#include “math.h” main(){ float x,x0,f,f1;x=1.5;do{ x0=x;

      f=2*x0*x0*x0-4*x0*x0+3*x0-6;

      f1=6*x0*x0-8*x0+3;

      x=x0-f/f1;}while(fabs(x-x0)>=1e-5);printf(“%fn”,x);}

      (2)二分法

      算法要領(lǐng)是:先指定一個(gè)區(qū)間[x1, x2],如果函數(shù)f(x)在此區(qū)間是單調(diào)變化的,則可以根據(jù)f(x1)和 f(x2)是否同號(hào)來(lái)確定方程f(x)=0在區(qū)間[x1, x2]內(nèi)是否有一個(gè)實(shí)根;如果f(x1)和 f(x2)同號(hào),則f(x)在區(qū)間[x1, x2]內(nèi)無(wú)實(shí)根,要重新改變x1和x2的值。當(dāng)確定f(x)在區(qū)間[x1, x2]內(nèi)有一個(gè)實(shí)根后,可采取二分法將[x1, x2]一分為二,再判斷在哪一個(gè)小區(qū)間中有實(shí)根。如此不斷進(jìn)行下去,直到小區(qū)間足夠小為止。

      具體算法如下:

      (1)輸入x1和x2的值。(2)求f(x1)和f(x2)。

      (3)如果f(x1)和f(x2)同號(hào)說(shuō)明在[x1, x2] 內(nèi)無(wú)實(shí)根,返回步驟(1),重新輸入x1和x2的值;若f(x1)和f(x2)不同號(hào),則在區(qū)間[x1, x2]內(nèi)必有一個(gè)實(shí)根,執(zhí)行步驟(4)。(4)求x1和x2的中點(diǎn):x0=(x1+ x2)/2。(5)求f(x0)。

      (6)判斷f(x0)與f(x1)是否同號(hào)。

      ①如果同號(hào),則應(yīng)在[x0, x2]中尋找根,此時(shí)x1已不起作用,用x0代替x1,用f(x0)代替f(x1)。

      ②如果不同號(hào),則應(yīng)在[x1, x0]中尋找根,此時(shí)x2已不起作用,用x0代替x2,用f(x0)代替f(x2)。

      (7)判斷f(x0)的絕對(duì)值是否小于某一指定的值(例如10-5)。若不小于10-5,則返回步驟(4)重復(fù)執(zhí)行步驟(4)、(5)、(6);否則執(zhí)行步驟(8)。(8)輸出x0的值,它就是所求出的近似根。

      例如,用二分法求方程2x3-4x2+3x-6=0在(-10,10)之間的根。#include “math.h” main(){ float x1,x2,x0,fx1,fx2,fx0;do { printf(“Enter x1&x2”);

      scanf(“%f%f”,&x1,&x2);

      fx1=2*x1*x1*x1-4*x1*x1+3*x1-6;

      fx2=2*x2*x2*x2-4*x2*x2+3*x2-6;

      }while(fx1*fx2>0);do { x0=(x1+x2)/2;

      fx0=2*x0*x0*x0-4*x0*x0+3*x0-6;

      if((fx0*fx1)<0){ x2=x0;fx2=fx0;}

      else {x1=x0;fx1=fx0;}

      }while(fabs(fx0)>1e-5);printf(“%fn”,x0);} 3.梯形法計(jì)算定積分

      定積分 的幾何意義是求曲線y=f(x)、x=a、x=b以及x軸所圍成的面積。

      可以近似地把面積視為若干小的梯形面積之和。例如,把區(qū)間[a, b]分成n個(gè)長(zhǎng)度相等的小區(qū)間,每個(gè)小區(qū)間的長(zhǎng)度為h=(b-a)/n,第i個(gè)小梯形的面積為[f(a+(i-1)·h)+f(a+i·h)]·h/2,將n個(gè)小梯形面積加起來(lái)就得到定積分的近似值:

      根據(jù)以上分析,給出“梯形法”求定積分的N-S結(jié)構(gòu)圖:

      輸入?yún)^(qū)間端點(diǎn):a,b 輸入等分?jǐn)?shù)n h=(b-a)/2, s=0 i從1到n

      si=(f(a+(i-1)*h)+f(a+i*h))*h/2 s=s+si 輸出s 11 上述程序的幾何意義比較明顯,容易理解。但是其中存在重復(fù)計(jì)算,每次循環(huán)都要計(jì)算小梯形的上、下底。其實(shí),前一個(gè)小梯形的下底就是后一個(gè)小梯形的上底,完全不必重復(fù)計(jì)算。為此做出如下改進(jìn):

      矩形法求定積分則更簡(jiǎn)單,就是將等分出來(lái)的圖形當(dāng)作矩形,而不是梯形。例如:求定積分的值。等分?jǐn)?shù)n=1000。

      #include “math.h” float DJF(float a,float b){ float t,h;int n,i;float HSZ(float x);n=1000;h=fabs(a-b)/n;t=(HSZ(a)+HSZ(b))/2;for(i=1;i<=n-1;i++)t=t+HSZ(a+i*h);t=t*h;return(t);} float HSZ(float x){ return(x*x+3*x+2);} main(){ float y;y=DJF(0,4);

      printf(“%fn”,y);}

      四、其他常見算法

      1.迭代法

      其基本思想是把一個(gè)復(fù)雜的計(jì)算過(guò)程轉(zhuǎn)化為簡(jiǎn)單過(guò)程的多次重復(fù)。每次重復(fù)都從舊值的基礎(chǔ)上遞推出新值,并由新值代替舊值。

      例如,猴子吃桃問(wèn)題。猴子第一天摘下若干個(gè)桃子,當(dāng)即吃了一半,還不過(guò)癮,又多吃了一個(gè)。第二天早上又將剩下的桃子吃掉一半,又多吃了一個(gè)。以后每天早上都吃了前一天剩下的一半零一個(gè)。到第10天早上想再吃時(shí),就只剩一個(gè)桃子了。編程求第一天共摘多少桃子。

      main(){ int day,peach;peach=1;for(day=9;day>=1;day--)peach=(peach+1)*2;printf(“The first day:%dn”,peach);} 又如,用迭代法求x= 的根。

      求平方根的迭代公式是:xn+1=0.5×(xn+a/ xn)[算法](1)設(shè)定一個(gè)初值x0。

      (2)用上述公式求出下一個(gè)值x1。

      (3)再將x1代入上述公式,求出下一個(gè)值x2。

      (4)如此繼續(xù)下去,直到前后兩次求出的x值(xn+1和xn)滿足以下關(guān)系: | xn+1-xn|<10-5 #include “math.h” main(){ float a,x0,x1;scanf(“%f”,&a);x0=a/2;x1=(x0+a/x0)/2;do{ x0=x1;

      x1=(x0+a/x0)/2;

      }while(fabs(x0-x1)>=1e-5);

      printf(“%fn”,x1);} 2.進(jìn)制轉(zhuǎn)換

      (1)十進(jìn)制數(shù)轉(zhuǎn)換為其他進(jìn)制數(shù) 一個(gè)十進(jìn)制正整數(shù)m轉(zhuǎn)換成r進(jìn)制數(shù)的思路是,將m不斷除以r取余數(shù),直到商為0時(shí)止,以反序輸出余數(shù)序列即得到結(jié)果。

      注意,轉(zhuǎn)換得到的不是數(shù)值,而是數(shù)字字符串或數(shù)字串。

      例如,任意讀入一個(gè)十進(jìn)制正整數(shù),將其轉(zhuǎn)換成二至十六任意進(jìn)制的字符串。void tran(int m,int r,char str[],int *n){ char sb[]=“0123456789ABCDEF”;int i=0,g;do{ g=m%r;

      str[i]=sb[g];

      m=m/r;

      i++;

      }while(m!=0);*n=i;} main(){ int x,r0;/*r0為進(jìn)制基數(shù)*/ int i,n;/*n中存放生成序列的元素個(gè)數(shù)*/

      char a[50];

      scanf(“%d%d”,&x,&r0);if(x>0&&r0>=2&&r0<=16){ tran(x,r0,a,&n);for(i=n-1;i>=0;i--)printf(“%c”,a[i]);

      printf(“n”);} else exit(0);}(2)其他進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)

      其他進(jìn)制整數(shù)轉(zhuǎn)換為十進(jìn)制整數(shù)的要領(lǐng)是:“按權(quán)展開”,例如,有二進(jìn)制數(shù)101011,則其十進(jìn)制形式為1×25+0×24+1×23+0×22+1×21+1×20=43。若r進(jìn)制數(shù)an……a2a1(n位數(shù))轉(zhuǎn)換成十進(jìn)制數(shù),方法是an×r n-1+……a2×r1+a1×r0。

      注意:其他進(jìn)制數(shù)只能以字符串形式輸入。

      1、任意讀入一個(gè)二至十六進(jìn)制數(shù)(字符串),轉(zhuǎn)換成十進(jìn)制數(shù)后輸出。

      #include “string.h” #include “ctype.h” main(){ char x[20];int r,d;gets(x);/*輸入一個(gè)r進(jìn)制整數(shù)序列*/ scanf(“%d”,&r);/*輸入待處理的進(jìn)制基數(shù)2-16*/ d=Tran(x,r);printf(“%s=%dn”,x,d);} int Tran(char *p,int r){ int d,i,cr;char fh,c;d=0;fh=*p;if(fh=='-')p++;for(i=0;i

      if(toupper(c)>='A')cr=toupper(c)-'A'+10;

      else cr=c-'0';

      d=d*r+cr;} if(fh=='-')d=-d;return(d);} 3.矩陣轉(zhuǎn)置

      矩陣轉(zhuǎn)置的算法要領(lǐng)是:將一個(gè)m行n列矩陣(即m×n矩陣)的每一行轉(zhuǎn)置成另一個(gè)n×m矩陣的相應(yīng)列。

      1、將以下2×3矩陣轉(zhuǎn)置后輸出。即將 1 2 3 轉(zhuǎn)置成 1 4

      6

      main(){ int a[2][3],b[3][2],i,j,k=1;for(i=0;i<2;i++)

      for(j=0;j<3;j++)

      a[i][j]=k++;/*以下將a的每一行轉(zhuǎn)存到b的每一列*/ for(i=0;i<2;i++)for(j=0;j<3;j++)

      b[j][i]=a[i][j];for(i=0;i<3;i++)/*輸出矩陣b*/ { for(j=0;j<2;j++)

      printf(“%3d”,b[i][j]);

      printf(“n”);} } 4.字符處理

      (1)字符統(tǒng)計(jì):對(duì)字符串中各種字符出現(xiàn)的次數(shù)的統(tǒng)計(jì)。典型例題:任意讀入一個(gè)只含小寫字母的字符串,統(tǒng)計(jì)其中每個(gè)字母的個(gè)數(shù)。#include “stdio.h ” main(){ char a[100];int n[26]={0};int i;/*定義26個(gè)計(jì)數(shù)器并置初值0*/ gets(a);for(i=0;a[i]!= '