c语言数组如何把一串数字存入数组_C语言经典编程题(下)
C語言字符串加密和解密算法
在本實例中要求設計一個加密和解密算法。在對一個指定的字符串加密之后,利用解密函數(shù)能夠對密文解密,顯示明文信息。加密的方式是將字符串中每個字符加上它在字符串中的位置和一個偏移值 5。以字符串“mrsoft”為例,第一個字符“m”在字符串中的位置為 0,那么它對應的密文是“'m'+0+5",即 r。
算法思想
在 main() 函數(shù)中使用 while 語句設計一個無限循環(huán),并定義兩個字符數(shù)組,用來保存,明文和密文字符串,在首次循環(huán)中要求用戶輸入字符串,進行將明文加密成密文的操作, 之后的操作則是根據(jù)用戶輸入的命令字符進行判斷,輸入 1 加密新的明文,輸入 2 對剛加密的密文進行解密,輸入 3 退出系統(tǒng)。
#include?#include int main(){ int result=1; int i; int count=0; char Text[128]={'\0'}; char cryptograph[128]={'\0'}; while(1) { if(result==1) { printf("請輸入要加密的明文:\n"); scanf ("%s",&Text); count=strlen(Text); for(i=0;i { cryptograph[i]=Text[i]+i+5; } cryptograph[i]='\0'; printf("加密后的密文是:%s\n",cryptograph); } else if(result==2) { count=strlen(Text); for(i=0;i { Text[i]=cryptograph[i]-i-5; } Text[i]='\0'; printf("解密后的明文是:%s\n",Text); } else if(result==3) { break; } else { printf("請輸入正確的命令符:\n"); } printf("輸入1加密新的明文,輸入2對剛加密的密文進行解密,輸入3退出系統(tǒng):\n"); printf("請輸入命令符:\n"); scanf("%d",&result); } return 0;}調試運行結果本實例中,輸入了 I love Xichang College 字符串作為例證,因此輸出是多個加密后的字符串,結果如下所示:請輸入要加密的明文:I Love Xichang College加密后的密文是:N輸入1加密新的明文,輸入2對剛加密的密文進行解密,輸入3退出系統(tǒng):請輸入命令符:請輸入要加密的明文:加密后的密文是:Qu}m輸入1加密新的明文,輸入2對剛加密的密文進行解密,輸入3退出系統(tǒng):請輸入命令符:請輸入要加密的明文:加密后的密文是:]ojpjxr輸入1加密新的明文,輸入2對剛加密的密文進行解密,輸入3退出系統(tǒng):請輸入命令符:請輸入要加密的明文:加密后的密文是:Hustnqp輸入1加密新的明文,輸入2對剛加密的密文進行解密,輸入3退出系統(tǒng):請輸入命令符:C語言輸出等腰三角形
本實例要求從鍵盤輸入任意整數(shù) n,通過程序運行輸出對應高度為 n 的等腰三角形。算法思想
① 設計以高度 n 為參數(shù)的一個函數(shù),函數(shù)返回值為空,在函數(shù)體中實現(xiàn)等腰三角形的打印;圖形的最終打印需要利用二層循環(huán)設計實現(xiàn)。② 圖形共輸出 n 行,外循環(huán)變量 i 表示 n 行的輸出,循環(huán)變量的變化范圍為 0~(n—1)。③ 循環(huán)變量 j 表示每一行的“*”號輸出。由于每一行的輸出不同,第 j 行輸出空格的個數(shù)為 (n—i),第 j 行輸出“*”號的個數(shù)為(2*i+1)。控制“*”號輸出的內循環(huán)變量 j 的變化范圍為 0~(2*i)。④ 在主函數(shù)中輸入 n 作為實參,調用定義函數(shù),打印等腰三角形。
#include?int trangle(int n){ int i,j; for(i=0;i { for(j=0;j<=n-i;j++) putchar(' '); for(j=0;j<=2*i;j++) putchar('*'); putchar('\n'); } return 0;}int main(){ int n; printf("Enter n:"); scanf("%d",&n); printf("\n"); trangle(n); return 0;}調試運行結果當 n 取值為 8 時,打印出的等腰三角形如下所示:Enter n:8 * *** ***** ******* ********* *********** ************* ***************C語言約瑟夫環(huán)問題
編號為 1,2,3,…,n 的 n 個人圍坐一圈,任選一個正整數(shù) m 作為報數(shù)上限值,從第一個人開始按順時針方向報數(shù),報數(shù)到 m 時停止,報數(shù)為 m 的人出列。從出列人的順時針方向的下一個人開始又從 1 重新報數(shù),如此下去,直到所有人都全部出列為止。算法思想
每個人的編號存放在一個數(shù)組 a 中,主函數(shù)中決定人數(shù)的個數(shù)以及報數(shù)的上限值 m,設計一個函數(shù)實現(xiàn)對應的操作。函數(shù)的形參有整型數(shù)組 a、整數(shù) n 和 m,n 用來接收傳遞的人數(shù),m 用來接收報數(shù)上限,函數(shù)的返回值為空;函數(shù)體中輸出出列人的順序。函數(shù)中利用循環(huán)訪問數(shù)組中 n 個元素,每次訪問元素,設定內循環(huán)連續(xù)訪問 m 個元素,元素訪問的下標為 k,訪問到第 m 個元素時,如果元素不是 0,此時輸出元素 a[k],再設定 a[k] 為 0,繼續(xù)訪問后面的元素。主函數(shù)中設定數(shù)組 a,從鍵盤輸入 n 和 m,利用循環(huán)產生 n 的位置序號存放到數(shù)組 a 中,調用函數(shù)實現(xiàn)相應的操作。
#include #define N 100int josef(int a[],int n,int m){ int i,j,k=0; for(i=0;i { j=1; while(j { while(a[k]==0) k=(k+1)%n; j++; k=(k+1)%n; } while(a[k]==0) k=(k+1)%n; printf("%d ",a[k]); a[k]=0; } return 0;}int main(){ int a[100]; int i,j,m,n; printf("input n and m:"); scanf("%d%d",&n,&m); for(i=0;i a[i]=i+1; printf("\n output:\n"); josef(a,n,m); printf("\n"); return 0;}調試運行結果15 個人圍坐在一起,報數(shù)上限為 4 時的出列順序如下所示:input n and m:15 4output:4 8 12 1 6 11 2 9 15 10 5 3 7 14 13C語言整數(shù)逆序輸出
將一個從鍵盤輸入的整數(shù)存放到一個數(shù)組中,通過程序的運行按照數(shù)組中的逆序輸出該整數(shù),利用遞歸的方法解決問題。算法思想
設計函數(shù)實現(xiàn)數(shù)據(jù)的逆序存放,設定形參數(shù)組接收實參數(shù)組的地址,來存儲數(shù)據(jù)的每一位。函數(shù)體采用遞歸的方式解決問題,因此考慮遞歸進行的條件。例如,把數(shù)據(jù) n 存放到數(shù)組 s 中,若 n 是一位數(shù),則存放 n 到數(shù)組中;若 n 不是一位數(shù),則存放 n/10 到數(shù)組中。問題解決的難點在于找到數(shù)據(jù)的存放地址,通過不斷地取余和整除 10 來得到數(shù)據(jù)的每一位。為了實現(xiàn)數(shù)據(jù)的逆序存放,每一次整除 10 的時候,同時把存放數(shù)據(jù)的數(shù)組地址后移,這樣得到的第一位數(shù)存放在數(shù)組的最后一位……通過依次前移,即遞歸的回歸,實現(xiàn)整個數(shù)據(jù)的存放。通過函數(shù) convert() 實現(xiàn)字符串中的數(shù)字的逆序轉換。#include?int convert(char s[],int n){ int i; if((i=n/10)!=0) convert(s+1,i); *s=n%10+'0'; return 0;}int main(){ int num; char str[10]=" "; printf("input integer data:"); scanf("%d",&num); convert(str,num); printf("output string:\n"); puts(str); return 0;}C語言三色旗問題
有一根繩子,上面有紅、白、藍三種顏色的旗子。繩子上旗子的顏色并沒有順序,現(xiàn)在要對旗子進行分類,按照藍色、白色、紅色的順序排列。只能在繩子上進行移動,并且一次只能調換兩面旗子,怎樣移動才能使旗子移動的次數(shù)最少?
算法思想旗子在繩子上移動,而且一次只能調換兩面旗子,因此只要保證在移動旗子時,從繩子的開頭開始,遇到藍色旗子向前移動,遇到白色旗子則留在中間,而遇到紅色的旗子則向后移動。要使移動次數(shù)最少,可以使用三個指針 b、w、r 分別作為藍旗、白旗和紅旗的指針。若 w 指針指向的當前旗子為白色,則 w 指針增加 1,表示白旗部分增加一面。若 w 指針指向的當前旗子為藍色,則將 b 指針與 w 指針所指向的旗子交換,同時 b 指針與 w 指針都增加 1,表示藍旗和白旗部分都多了一個元素。若 w 指針指向的當前旗子為紅色,則將 w 指針與 r 指針所指向的旗子交換,同時 r 指針減 1,即 r 指針向前移動,未處理的部分減 1。剛開始時,r 指向繩子中最后一個旗子,之后 r 指針不斷前移,當其位于 w 指針之前,即 r 的值小于 w 的值時,全部旗子處理完畢,可以結束比較和移動旗子操作。
在程序中通過宏定義用大寫字母 'B' 'W' 'R' 分別代表藍色、白色和紅色;字符數(shù)組 “char color[]”表示繩子上的各種顏色的旗子;旗子移動時通過一個 while 循環(huán)判斷移動過程是否結束,在 while 循環(huán)中根據(jù)旗子的不同顏色進行不同的處理。#include #include #include #define BLUE 'B'#define WHITE 'W'#define RED 'R'#define swap(x,y){char temp;\ temp=color[x];\ color[x]=color[y];\ color[y]=temp;}int main(){ char color[]={'R','W','B','W','W','B','R','B','W','R','\0'}; int w=0; int b=0; int r=strlen(color)-1; int i; for(i=0;i<strlen(color);i++) printf("%c ",color[i]); printf("\n"); while(w<=r) { if(color[w]==WHITE) w++; else { if(color[w]==BLUE) { swap(b,w); b++; w++; } else { while(w r--; swap(r,w); r--; } } } for(i=0;i<strlen(color);i++) printf("%c ",color[i]); printf("\n"); return 0;}調試運行結果交換前旗子顏色排列順序及按順序最少次數(shù)移動旗子后的排列順序如下所示:R W B W W B R B W RB B B W W W W R R R
C語言求定積分
利用梯形法計算定積分? ? ? ? ? ? ? ? ? ? ? ? ??其中, f(x)=x3+3x2-x+2。算法思想
根據(jù)定積分的定義分析可得:[x0,x1],[x1,x2],···,[xn-1,xn],將定積分的區(qū)間 [a,b] 分成 n 個子區(qū)間,其中:
若右邊的極限存在,其極限值即為定積分的值。理論上區(qū)間分得越細,越逼近定積分實際的值,一般采用梯形法近似計算定積分的值,把區(qū)間 [a,6] 劃分成 n 等份,則任意第 f 個小梯形的面積為 (上底+下底)×高/2,si=H×[f(xi)-1)+f(xi)]/2,其中 xi+1=a+(i+1)×H;xi=a+i×H;H=(b-a)/n。該實例問題實際上轉換為求 n 等份梯形的面積累計和。
#include #include float collect(float s,float t,int m,float (*p)(float x));float fun1(float x);float fun2(float x);float fun3(float x);float fun4(float x);int main(){ int n,flag; float a,b,v=0.0; printf("Input the count range(from A to B)and the number of sections.\n"); scanf("%f%f%d",&a,&b,&n); printf("Enter your choice:'1' for fun1,'2' for fun2,'3' for fun3,'4' for fun4==>"); scanf("%d",&flag); if(flag==1) v=collect(a,b,n,fun1); else if(flag==2) v=collect(a,b,n,fun2); else if(flag==3) v=collect(a,b,n,fun3); else v=collect(a,b,n,fun4); printf("v=%f\n",v); return 0;}float collect(float s,float t,int n,float (*p)(float x)){ int i; float f,h,x,y1,y2,area; f=0.0; h=(t-s)/n; x=s; y1=(*p)(x); for(i=1;i<=n;i++) { x=x+h; y2=(*p)(x); area=(y1+y2)*h/2; y1=y2; f=f+area; } return (f);}float fun1(float x){ float fx; fx=x*x-2.0*x+2.0; return(fx);}float fun2(float x){ float fx; fx=x*x*x+3.0*x*x-x+2.0; return(fx);}float fun3 (float x){ float fx; fx=x*sqrt(1+cos(2*x)); return(fx);}float fun4(float x){ float fx; fx=1/(1.0+x*x); return(fx);}調試運行結果程序運行結果如下所示:Input the count range(from A to B)and the number of sections.0 1 100Enter your choice:'1' for fun1,'2' for fun2,'3' for fun3,'4' for fun4==>2v=2.750073C語言求空間兩點之間的距離
定義一個表示三維空間點坐標的結構類型,通過函數(shù)求空間上任意兩點之間的距離。算法思想
空間內任意點的坐標有三個,分別為 x 軸方向、y 軸方向、z 軸方向,設定結構體 point,包括三個成員 x、y、z,都為雙精度類型。定義一個函數(shù) dist 用于計算空間上兩點的距離,函數(shù)返回值也為 double 類型,函數(shù)的參數(shù)為結構體 point 的兩個變量。#include #include struct point{ float x; float y; float z;};float dist(struct point p1,struct point p2){ float x,y,z; float d; x=fabs(p1.x-p2.x); y=fabs(p1.y-p2.y); z=fabs(p1.z-p2.z); d=sqrt(x*x+y*y+z*z); return d;}int main(){ struct point p1,p2; printf("Enter point1:"); scanf("%f,%f,%f",&p1.x,&p1.y,&p1.z); printf("Enter point2:"); scanf("%f,%f,%f",&p2.x,&p2.y,&p2.z); printf("distance: %f\n",dist(p1,p2)); return 0;}調試運行結果空間上兩點的坐標分別為 (1.26,3.54,4.6),(3.21,3.54,7.2),通過程序運行得到該兩點之間的距離為 3.25,運行結果如下所示:Enter point1:1.26,3.54,4.6Enter point2:3.21,3.54,7.2distance: 3.250000C語言日期函數(shù),日期處理函數(shù)
定義一個表示日期的結構體類型,再分別定義函數(shù)完成下列功能:計算某一天是對應年的第幾天,這一年一共多少天;計算兩個日期之間相隔的天數(shù)。兩個日期由鍵盤輸入。
算法思想
設定結構體類型表示日期類型名為 Date,利用 typedef 將其定義為日期型類型名,有三個整型類型的成員分別表示年、月、日。設定函數(shù)計算輸入的日期是這一年的第幾天。函數(shù)的形參為日期型變量,函數(shù)體中設定整型數(shù)組存放每個月的天數(shù),二月份的天數(shù)為 28 天;設定函數(shù)判斷年份是否為閏年以決定二月份的天數(shù)。根據(jù)輸入的日期月份,在數(shù)組中將相應的月份天數(shù)求和,假日曰期即為天數(shù)。設定函數(shù)完成兩個日期的比較,比較形參 d 和 s 兩個日期的大小。首先比較年,同年的比較月,同月的比較日。變量 start 保存輸入的小的日期年份,end 保存輸入日期大的年份,然后計算兩個日期之間的天數(shù)。程序由 6 個函數(shù)構成,yearday() 函數(shù)計算某年的天數(shù),monthday() 函數(shù)計算某年二月份的天數(shù),dayofyeaK() 函數(shù)計算某日期是某年的第幾天,cmpdate() 函數(shù)比較兩個日期的大小,interday() 函數(shù)計算兩個日期之間的天數(shù);dayofyear() 函數(shù)調用 monthday() 函數(shù),interday() 函數(shù)調用 cmpdate() 函數(shù)、yearday() 函數(shù)、dayofyear() 函數(shù);主函數(shù)調用 yearday() 函數(shù)、dayofyear() 函數(shù)、interday() 函數(shù)。#include #include typedef struct{ int year,month,day;}Date;int yearday(int year){ int yday; if(year%4==0&&year%100!=0||year%400==0) yday=366; else yday=365; return yday;}int monthday(int year){ int mday; if(year%4==0&&year%100!=0||year%400==0) mday=29; else mday=28; return mday;}int dayofyear(Date d){ int i,total=0; int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; months[2]=monthday(d.year); for(i=1;i total=total+months[i]; total=total+d.day; return total;}int cmpdate(Date d,Date s){ int result; if(d.year==s.year) { if(d.month==s.month) { if(d.day==s.day) result=0; else result=d.day-s.day; } else result=d.month-s.month; } else result=d.year-s.year; return result;}int interday(Date d,Date s){ int result,te,ts,total; int year,start,end,day; int i; result=cmpdate(d,s); if(result>0) { start=s.year; end=d.year; te=dayofyear(d); ts=dayofyear(s); } else if(result<0) { start=d.year; end=s.year; ts=dayofyear(d); te=dayofyear(s); } else return 0; if(start==end) return abs(te-ts); else { total=0; for(i=start;i<=end;i++) { day=yearday(i); if(i==start) total=total+day-ts; else if(i==end) total=total+te; else total=total+day; } } return total;}int main(){ Date d1,d2; int y,n; printf("input date:"); scanf("%d%d%d",&d1.year,&d1.month,&d1.day); scanf("%d%d%d",&d2.year,&d2.month,&d2.day); y=yearday(d1.year); n=dayofyear(d1); printf("%d days %d\n",d1.year,y); printf("%d-%d-%d is the %d day.\n",d1.year,d1.month,d1.day,n); n=interday(d1,d2); printf("%d-%d-%d and %d-%d-%d distance ",d1.year,d1.month,d1.day,d2.year,d2.month,d2.day); printf("%d days\n",n); return 0;}調試運行結果輸入 2009 年 2 月 1 日和 2015 年 2 月 1 日,程序運行結果如下所示:input date:2009 2 1 2015 2 12009 days 3652009-2-1 is the 32 day.2009-2-1 and 2015-2-1 distance 2191 daysC語言漢諾塔問題,用C語言實現(xiàn)漢諾塔
漢諾塔問題是指:一塊板上有三根針 A、B、C。A 針上套有 64 個大小不等的圓盤,按照大的在下、小的在上的順序排列,要把這 64 個圓盤從 A 針移動到 C 針上,每次只能移動一個圓盤,移動過程可以借助 B 針。但在任何時候,任何針上的圓盤都必須保持大盤在下,小盤在上。從鍵盤輸入需移動的圓盤個數(shù),給出移動的過程。算法思想
對于漢諾塔問題,當只移動一個圓盤時,直接將圓盤從 A 針移動到 C 針。若移動的圓盤為 n(n>1),則分成幾步走:把 (n-1) 個圓盤從 A 針移動到 B 針(借助 C 針);A 針上的最后一個圓盤移動到 C 針;B 針上的 (n-1) 個圓盤移動到 C 針(借助 A 針)。每做一遍,移動的圓盤少一個,逐次遞減,最后當 n 為 1 時,完成整個移動過程。因此,解決漢諾塔問題可設計一個遞歸函數(shù),利用遞歸實現(xiàn)圓盤的整個移動過程,問題的解決過程是對實際操作的模擬。#include int main(){ int hanoi(int,char,char,char); int n,counter; printf("Input the number of diskes:"); scanf("%d",&n); printf("\n"); counter=hanoi(n,'A','B','C'); return 0;}int hanoi(int n,char x,char y,char z){ int move(char,int,char); if(n==1) move(x,1,z); else { hanoi(n-1,x,z,y); move(x,n,z); hanoi(n-1,y,x,z); } return 0;}int move(char getone,int n,char putone){ static int k=1; printf("%2d:%3d # %c---%c\n",k,n,getone,putone); if(k++%3==0) printf("\n"); return 0;}調試運行結果當移動圓盤個數(shù)為 3 時,具體移動步驟如下所示:Input the number of diskes:31: 1 # A---C2: 2 # A---B3: 1 # C---B4: 3 # A---C5: 1 # B---A6: 2 # B---C7: 1 # A---CC語言九九乘法表(五種輸出形式)
九九乘法表共 9 行 9 列,重點考察?for 循環(huán)的掌握情況。
下面給出了輸出完整乘法表、右上、右下、左上、左下乘法表的代碼。
【代碼一】輸出完整:#include int main() { int i,j; // i, j控制行或列 for(i=1;i<=9;i++) { for(j=1;j<=9;j++)?????????//?%2d 控制寬度為兩個字符,且右對齊;如果改為?%-2d 則為左對齊?????????//?\t為tab縮進 printf("%d*%d=%2d\t", i, j, i*j); printf("\n"); } return 0;}運行結果:1*1= 1 1*2= 2 1*3= 3 1*4= 4 1*5= 5 1*6= 6 1*7= 7 1*8= 8 1*9= 92*1= 2 2*2= 4 2*3= 6 2*4= 8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=183*1= 3 3*2= 6 3*3= 9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=274*1= 4 4*2= 8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=365*1= 5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=456*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=547*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=638*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=729*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81【代碼二】輸出右上三角形和左上三角形:#include int main() { int i,j; for(i=1;i<=9;i++){ for(j=1;j<=9;j++){ if(j //打印八個空格,去掉空格就是左上三角形 printf(" "); else printf("%d*%d=%2d ",i,j,i*j); } printf("\n"); } return 0;}運行結果:1*1= 1 1*2= 2 1*3= 3 1*4= 4 1*5= 5 1*6= 6 1*7= 7 1*8= 8 1*9= 9 2*2= 4 2*3= 6 2*4= 8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 3*3= 9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 6*6=36 6*7=42 6*8=48 6*9=54 7*7=49 7*8=56 7*9=63 8*8=64 8*9=72 9*9=81去掉八個空格后的運行結果:1*1= 1 1*2= 2 1*3= 3 1*4= 4 1*5= 5 1*6= 6 1*7= 7 1*8= 8 1*9= 92*2= 4 2*3= 6 2*4= 8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=183*3= 9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=274*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=365*5=25 5*6=30 5*7=35 5*8=40 5*9=456*6=36 6*7=42 6*8=48 6*9=547*7=49 7*8=56 7*9=638*8=64 8*9=729*9=81【代碼三】輸出右下和左下三角形:#include int main(){ int i,j,n; for(i=1;i<=9;i++){ // 將下面的for循環(huán)注釋掉,就輸出左下三角形 for(n=1; n<=9-i; n++) printf(" "); for(j=1;j<=i;j++) printf("%d*%d=%2d ",i,j,i*j); printf("\n"); } return 0;}運行結果: 1*1= 1 2*1= 2 2*2= 4 3*1= 3 3*2= 6 3*3= 9 4*1= 4 4*2= 8 4*3=12 4*4=16 5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25 6*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=649*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81去掉循環(huán)后的運行結果:1*1= 12*1= 2 2*2= 43*1= 3 3*2= 6 3*3= 94*1= 4 4*2= 8 4*3=12 4*4=165*1= 5 5*2=10 5*3=15 5*4=20 5*5=256*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=367*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=498*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=649*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81C語言楊輝三角(兩種方法)
楊輝三角是我們從初中就知道的,現(xiàn)在,讓我們用C語言將它在計算機上顯示出來。在初中,我們就知道,楊輝三角的兩個腰邊的數(shù)都是 1,其它位置的數(shù)都是上頂上兩個數(shù)之和。這就是我們用C語言寫楊輝三角的關鍵之一。在高中的時候我們又知道,楊輝三角的任意一行都是的二項式系數(shù),n 為行數(shù)減 1。也就是說任何一個數(shù)等于這個是高中的組合數(shù)。n 代表行數(shù)減 1,不代表列數(shù)減 1。如:第五行的第三個數(shù)就為 =6。現(xiàn)在我們按第一種思路來寫:先定義一個二維數(shù)組:a[N][N],略大于要打印的行數(shù)。再令兩邊的數(shù)為 1,即當每行的第一個數(shù)和最后一個數(shù)為 1。a[i][0]=a[i][i-1]=1,n 為行數(shù)。除兩邊的數(shù)外,任何一個數(shù)為上兩頂數(shù)之和,即 a[i][j] = a[i-1][j-1] + a[i-1][j]。最后輸出楊輝三角。代碼如下:#include #define N 14void main(){ int i, j, k, n=0, a[N][N]; /*定義二維數(shù)組a[14][14]*/ while(n<=0||n>=13){ /*控制打印的行數(shù)不要太大,過大會造成顯示不規(guī)范*/ printf("請輸入要打印的行數(shù):"); scanf("%d",&n); } printf("%d行楊輝三角如下:\n",n); for(i=1;i<=n;i++) a[i][1] = a[i][i] = 1; /*兩邊的數(shù)令它為1,因為現(xiàn)在循環(huán)從1開始,就認為a[i][1]為第一個數(shù)*/ for(i=3;i<=n;i++) for(j=2;j<=i-1;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; /*除兩邊的數(shù)外都等于上兩頂數(shù)之和*/ for(i=1;i<=n;i++){ for(k=1;k<=n-i;k++) printf(" "); /*這一行主要是在輸出數(shù)之前打上空格占位,讓輸出的數(shù)更美觀*/ for(j=1;j<=i;j++) /*j<=i的原因是不輸出其它的數(shù),只輸出我們想要的數(shù)*/ printf("%6d",a[i][j]); printf("\n"); /*當一行輸出完以后換行繼續(xù)下一行的輸出*/ } printf("\n");}運行結果:請輸入要打印的行數(shù):1010行楊輝三角如下: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1上面的這一種方法我們用到了二維數(shù)組,下面的這一方法我們將用到自定義函數(shù)。在高中我們知道,楊輝三角中的任何一個數(shù)都等于一個組合數(shù),現(xiàn)在我們用這一公式來做。首先,此方法代碼如下:
#include?/* * 定義階乘,在這里可能會想。為什么要用float,當我試第一次的時候, * 如果用int的話,那么在打印行數(shù)多了以后就會出錯。 * 這是因為階乘的數(shù)比較大,如果用int就不夠用了。下同 */float J(int i){ int j; float k=1; for(j=1;j<=i;j++) k=k*j; return(k);}float C(int i,int j){ /*定義組合數(shù)*/ float k; k=J(j)/(J(i)*J(j-i)); return(k);}void main(){ int i=0,j,k,n; /*打印楊輝三角*/ while(i<=0||i>16){ printf("請輸入要打印的行數(shù):"); scanf("%d",&i); } printf("%d行楊輝三角如下:\n",i); for(j=0;j for(k=1;k<=(i-j);k++) printf(" "); for(n=0;n<=j;n++) printf("%4.0f",C(n,j)); printf("\n"); } printf("\n\n");}運行結果:請輸入要打印的行數(shù):1010行楊輝三角如下: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1C語言求圓周率π(三種方法)
題目1) 利用公式①計求π的近似值,要求累加到最后一項小于10^(-6)為止。題目2) 根據(jù)公式②,用前100項之積計算π的值。題目1)提供了一種解法,題目2)提供了兩種解法,請看解析。題目1)的代碼:#include #include #include int main(){ float s=1; float pi=0; float i=1.0; float n=1.0; while(fabs(i)>=1e-6){ pi+=i; n=n+2; // 這里設計的很巧妙,每次正負號都不一樣 s=-s; i=s/n; } pi=4*pi; printf("pi的值為:%.6f\n",pi); return 0;}運行結果:pi的值為:3.141594上面的代碼,先計算π/4的值,然后再乘以4,s=-s; 用的很巧妙,每次循環(huán),取反,結果就是,這次是正號,下次就是負號,以此類推。題目2)的代碼[代碼一]:
#include #include int main(){ float pi=1; float n=1; int j; for(j=1;j<=100;j++,n++){ if(j%2==0){ pi*=(n/(n+1)); }else{ pi*=((n+1)/n); } } pi=2*pi; printf("pi的值為:%.7f\n",pi); return 0;}運行結果:pi的值為:3.1260781此算法的主要思想:觀察分子數(shù)列:a1=2 ?a2=2a3=4 ?a4=4a5=6 ?a6=6......由此得知,當n為偶數(shù)時,an=n;當n為奇數(shù)時,an=a(n+1)=n+1;同理觀察分子數(shù)列:b1=1 b2=3b3=3 b4=5b5=5 b6=7b7=7 b8=9.......由此可知,當n為奇數(shù)時,bn=n,當n為偶數(shù)時,bn=b(n+1)。綜上可知,當n為奇數(shù)時,每次應乘以(n+1)/n。當n為偶數(shù)時,每次應乘以n/(n+1)。題目2)的代碼[代碼二]:
#include #include int main(){ float term,result=1; int n; for(n=2;n<=100;n+=2){ term=(float)(n*n)/((n-1)*(n+1)); result*=term; } printf("pi的值為:%f\n", 2*result); return 0;}運行結果:pi的值為:3.126079算法思想:采用累乘積算法,累乘項為term=n*n/((n-1)*(n+1));n=2,4,6,...100。步長為2。C語言判斷素數(shù)(求素數(shù))(兩種方法)
素數(shù)又稱質數(shù)。所謂素數(shù)是指除了 1 和它本身以外,不能被任何整數(shù)整除的數(shù),例如17就是素數(shù),因為它不能被 2~16 的任一整數(shù)整除。思路1):因此判斷一個整數(shù)m是否是素數(shù),只需把 m 被 2 ~ m-1 之間的每一個整數(shù)去除,如果都不能被整除,那么 m 就是一個素數(shù)。思路2):另外判斷方法還可以簡化。m 不必被 2 ~ m-1 之間的每一個整數(shù)去除,只需被 2 ~?之間的每一個整數(shù)去除就可以了。如果 m 不能被 2 ~?間任一整數(shù)整除,m 必定是素數(shù)。例如判別 17 是是否為素數(shù),只需使 17 被 2~4 之間的每一個整數(shù)去除,由于都不能整除,可以判定 17 是素數(shù)。原因:因為如果 m 能被 2 ~ m-1 之間任一整數(shù)整除,其二個因子必定有一個小于或等于?,另一個大于或等于?。例如 16 能被 2、4、8 整除,16=2*8,2 小于 4,8 大于 4,16=4*4,4=√16,因此只需判定在 2~4 之間有無因子即可。兩種思路的代碼請看解析。思路1) 的代碼:#include int main(){ int a=0; // 素數(shù)的個數(shù) int num=0; // 輸入的整數(shù) printf("輸入一個整數(shù):"); scanf("%d",&num); for(int i=2;i if(num%i==0){ a++; // 素數(shù)個數(shù)加1 } } if(a==0){ printf("%d是素數(shù)。\n", num); }else{ printf("%d不是素數(shù)。\n", num); } return 0;}思路2)的代碼:#include #include void main(){ int m; // 輸入的整數(shù) int i; // 循環(huán)次數(shù) int k; // m 的平方根 printf("輸入一個整數(shù):"); scanf("%d",&m); // 求平方根,注意sqrt()的參數(shù)為 double 類型,這里要強制轉換m的類型 k=(int)sqrt( (double)m ); for(i=2;i<=k;i++) if(m%i==0) break; // 如果完成所有循環(huán),那么m為素數(shù) // 注意最后一次循環(huán),會執(zhí)行i++,此時 i=k+1,所以有i>k if(i>k) printf("%d是素數(shù)。\n",m); else printf("%d不是素數(shù)。\n",m); return 0;}兩段代碼的輸出結果相同。第一次運行結果:輸入一個整數(shù):11是素數(shù)。第二次運行結果:輸入一個整數(shù):9797是素數(shù)。第三次運行結果:輸入一個整數(shù):1010不是素數(shù)。C語言輸出菱形(詳解版)
菱形,就是如下所示的圖形,總行數(shù)與總列數(shù)相等:寫一個程序,根據(jù)用戶輸入的總行數(shù),打印出菱形。這個題目主要是找出規(guī)律,考察讀者的邏輯思維。你可以從第一行開始,遍歷所有的列,也可以從第一列開始,遍歷所有的行。下面的程序從第一行開始,遍歷所有的列。設菱形的總行數(shù)為line,總列數(shù)為column,當前行為i,當前列為j。上半部分與下半部分的規(guī)律不一樣,應該分開討論。我們著眼于星號(*),思考什么條件下輸出星號,總結出如下的規(guī)律。1) 對于上半部分(包括中間一行),當前行與當前列滿足如下關系輸出星號:
- j>=(column+1)/2-(i-1) ? ? (column+1)/2-(i-1)為第i行最左邊的星號
- j<=(column+1)/2+(i-1) ? ?(column+1)/2+(i-1)為第i行最右邊的星號
- j>=(column+1)/2-(line-i) ? ? (column+1)/2-(line-i)為第i行最左邊的星號
- j<=(column+1)/2+(line-i) ? ?(column+1)/2+(line-i)為第i行最右邊的星號
C語言百錢買百雞問題(詳解版)
我國古代數(shù)學家張丘建在《算經(jīng)》一書中曾提出過著名的“百錢買百雞”問題,該問題敘述如下:雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一;百錢買百雞,則翁、母、雛各幾何?翻譯過來,意思是公雞一個五塊錢,母雞一個三塊錢,小雞三個一塊錢,現(xiàn)在要用一百塊錢買一百只雞,問公雞、母雞、小雞各多少只?
題目分析
如果用數(shù)學的方法解決百錢買百雞問題,可將該問題抽象成方程式組。設公雞 x 只,母雞 y 只,小雞 z 只,得到以下方程式組:A:5x+3y+1/3z = 100B:x+y+z = 100C:0 <= x <= 100D:0 <= y <= 100E:0 <= z <= 100如果用解方程的方式解這道題需要進行多次猜解,計算機的一個優(yōu)勢就是計算速度特別暴力并且無怨無悔,所以我們可以欺負她、蹂躪她!因此我們用窮舉法的方式來解題,需要 101^3 次猜解,但對于計算機來說,小 CASE!代碼清單:#include int main(){ int i, j, k; printf("百元買百雞的問題所有可能的解如下:\n"); for( i=0; i <= 100; i++ ) for( j=0; j <= 100; j++ ) for( k=0; k <= 100; k++ ) { if( 5*i+3*j+k/3==100 && k%3==0 && i+j+k==100 ) {?????????printf("公雞?%2d?只,母雞?%2d?只,小雞?%2d?只\n",?i,?j,?k); } } return 0;}運行結果:百元買百雞的問題所有可能的解如下:公雞 0 只,母雞 25 只,小雞 75 只公雞 4 只,母雞 18 只,小雞 78 只公雞 8 只,母雞 11 只,小雞 81 只公雞 12 只,母雞 4 只,小雞 84 只C語言求完數(shù)(完全數(shù))(詳解版)
問題描述
求某一范圍內完數(shù)的個數(shù)。如果一個數(shù)等于它的因子之和,則稱該數(shù)為“完數(shù)”(或“完全數(shù)”)。例如,6的因子為1、2、3,而 6=1+2+3,因此6是“完數(shù)”。問題分析
根據(jù)完數(shù)的定義,解決本題的關鍵是計算出所選取的整數(shù)i(i的取值范圍不固定)的因子(因子就是所有可以整除這個數(shù)的數(shù)),將各因子累加到變量s (記錄所有因子之和),若s等于i,則可確認i為完數(shù),反之則不是完數(shù)。算法設計
對于這類求某一范圍(由于本題范圍不固定,在編程過程中采用鍵盤輸入的方式)內滿足條件的數(shù)時,一般釆用遍歷的方式,對給定范圍內的數(shù)值一個一個地去判斷是否滿足條件,這一過程可利用循環(huán)來實現(xiàn)。本題的關鍵是求出選取數(shù)值i的因子,即從1到i-1范圍內能整除i的數(shù),看某一個數(shù)j是否為i的因子,可利用語句if(i%j==0)進行判斷,求某一個數(shù)的所有因子,需要在1到i-1范圍內進行遍歷,同樣釆用循環(huán)實現(xiàn)。因此,本題從整體上看可利用兩層循環(huán)來實現(xiàn)。外層循環(huán)控制該數(shù)的范圍2?n;內層循環(huán)j控制除數(shù)的范圍為1?i,通過i對j取余,是否等于0,找到該數(shù)的各個因子。另外應注意每次判斷下一個選定數(shù)之前,必須將變量s的值重新置為0,編程過程中一定要注意變量s重新置0的位置。程序流程圖:下面是完整的代碼:#includeint main(){ int i, j, s, n; /*變量i控制選定數(shù)范圍,j控制除數(shù)范圍,s記錄累加因子之和*/ printf("請輸入所選范圍上限:"); scanf("%d", &n); /* n的值由鍵盤輸入*/ for( i=2; i<=n; i++ ) { s=0; /*保證每次循環(huán)時s的初值為0*/ for( j=1; j { if(i%j == 0) /*判斷j是否為i的因子*/ s += j; } if(s == i) /*判斷因子這和是否和原數(shù)相等*/ printf("It's a perfect number:%d\n", i); } return 0;}運行結果:請輸入所選范圍上限:10000↙?It's a perfect number:6It's a perfect number:28It's a perfect number:496It's?a?perfect?number:8128知識點補充
上述程序中求某數(shù)的因子時,釆用從1到i-1范圍內進行遍歷的方法,一個數(shù)一個數(shù)地去試。這種方法可以做到?jīng)]有遺漏,但是效率不高。對于某一整數(shù)來說,其最大因子為n/2 (若n為偶數(shù)時,若為奇數(shù)最大因子小于n/2),在n/2?n-1范圍內沒有數(shù)據(jù)可以整除此數(shù)。據(jù)此,我們可以把遍歷范圍縮小至1?n-1,這樣程序效率可以提高一倍。相應程序如下:#include>int main(){ //... for( i=2; i<=1000; i++) { s=0; for( j=1; j<=n/2; j++ ) { if(i%j == 0) s += j; } //... }}C語言求親密數(shù)(詳解版)
如果整數(shù)A的全部因子(包括1,不包括A本身)之和等于B;且整數(shù)B的全部因子(包括1,不包括B本身)之和等于A,則將整數(shù)A和B稱為親密數(shù)。求3000以內的全部親密數(shù)。問題分析
根據(jù)問題描述,該問題可以轉化為:給定整數(shù)A,判斷A是否有親密數(shù)。為解決該問題,首先定義變量a,并為其賦初值為某個整數(shù)。則按照親密數(shù)定義,要判斷a中存放的整數(shù)是否有親密數(shù),只要計算出該整數(shù)的全部因子的累加和,并將該累加和存放到另一個變量b中,此時b中存放的也是一個整數(shù)。再計算b中存放整數(shù)的全部因子的累加和,將該累加和存放到變量n中。若n等于a則可判定變量a和b中所存放的整數(shù)是親密數(shù)。算法設計
計算數(shù)A的各因子的算法:用A依次對i(i的范圍可以是1?A-1、1?(A/2-1)中之一) 進行模(“%”,在編程過程中一定注意求模符號兩邊參加運算的數(shù)據(jù)必須為整數(shù))運算,若模運算結果等于0,則i為A的一個因子加;否則i就不是A的因子。將所求得的因子累到變量B。接下來求變量B的因子:算法同上,將B的因子之和累加到變量n。根據(jù)親密數(shù)的定義判斷變量n是否等于變量A(if(n==a)),若相等,則A和B是一對親密數(shù),反之則不是。#includeint main(){ int a, i, b, n; printf("There are following friendly--numbers pair smaller than 3000:\n"); for( a=1; a<3000; a++ ) /*窮舉3000以內的全部整數(shù)*/ { for( b=0, i=1; i<=a/2; i++) /*計算數(shù)a的各因子,各因子之和存放于b*/ if(!(a%i)) b+=i; for( n=0, i=1; i<=b/2; i++ ) /*計算b的各因子,各因子之和存于n*/ if(!(b%i)) n+=i; if(n==a && a/*使每對親密數(shù)只輸出一次*/ printf("%4d--%4d ", a, b); /*若n=a,則a和b是一對親密數(shù),輸出*/ } return 0;}運行結果:There are following friendly--numbers pair smaller than 3000:220-- 284 1184--1210 2620--2924知識點補充對于這類多次將某些值存儲到一個變量中時,一定要注意變量賦初值的位置。C語言求自守數(shù)(詳解版)
自守數(shù)是指一個數(shù)的平方的尾數(shù)等于該數(shù)自身的自然數(shù)。例如:52?= 25 ? ?252?= 625 ? ?762?= 5776 ? ?93762?= 87909376求100000以內的自守數(shù)。根據(jù)自守數(shù)的定義,求解本題的關鍵是知道當前所求自然數(shù)的位數(shù),以及該數(shù)平方的尾數(shù)與被乘數(shù)、乘數(shù)之間的關系。算法設計
若采用“求出一個數(shù)的平方后再截取最后相應位數(shù)”的方法顯然是不可取的,因為計算機無法表示過大的整數(shù)。分析手工方式下整數(shù)平方(乘法)的計算過程,以376為例:本問題所關心的是積的最后三位。分析產生積的后三位的過程可以看出,在每一次的部分積中,并不是它的每一位都會對積的后三位產生影響。總結規(guī)律可以得到:在三位數(shù)乘法中,對積的后三位產生影響的部分積分別為:- 第一個部分積中:被乘數(shù)最后三位×乘數(shù)的倒數(shù)第一位。
- 第二個部分積中:被乘數(shù)最后二位×乘數(shù)的倒數(shù)第二位。
- 第三個部分積中:被乘數(shù)最后一位×乘數(shù)的倒數(shù)第三位。
分離給定數(shù)中的最后幾位
從一個兩位數(shù)(存在變量n中)開始分析,分離最低位個位n%10;對于三位數(shù)n,分離最后兩位n%100;對于四位數(shù)n,分離最后三位n%1000;...,由此可見,若分離出最后x位,只需要用原數(shù)對 10x?求余。從第3部分所舉例子可以看出,對于第二個部分積“2632”來說其實應是“26320”, 因為對于乘數(shù)中的倒數(shù)第二位“7”來說,因其在十位,對應的權值為10,第二個部分積實質上為:376X70=26320。故求部分積的程序段為:int main (){ //... while(k>0) {????mul=(?mul?+?(?number%(k*10)?)*(?number%b?-?nxuober%(b/10)?)?)%a;????/*?(部分積+截取被乘數(shù)的后N位*截取乘數(shù)的第M位),%a再截取部分積*/ k /= 10; /*k為截取被乘數(shù)時的系數(shù)*/ b *= 10; } //... return 0;}對于整個循環(huán)來說,變量k是由number的位數(shù)確定截取數(shù)字進行乘法時的系數(shù)。第1次執(zhí)行循環(huán)體時,被乘數(shù)的所有位數(shù)都影響到平方的尾數(shù),因此第1個部分積=被乘數(shù)*乘數(shù)的最后一位,將部分積累加到變量mul上,再對a取余截取相應的尾數(shù)位數(shù);第2次執(zhí)行循環(huán)體,影響平方尾數(shù)的是被乘數(shù)中除了最高位之外的數(shù)(所以k先除以10再參加運算),第2個部分積=被乘數(shù)*乘數(shù)的倒數(shù)第二位,( number%b - number%(b/l0) )用來求乘數(shù)中影響平方尾數(shù)的對應位上的數(shù);第3次、第4次執(zhí)行循環(huán)體的過程同上。#includeint main(){ long mul, number, k, a, b; printf("It exists following automorphic nmbers small than 100000:\n");for( number=0; number<100000; number++ ) {for( mul=number, k=1; (mul/=10)>0; k*=10 );/*由number的位數(shù)確定截取數(shù)字進行乘法時的系數(shù)k*/ a = k * 10; /*a為截取部分積時的系數(shù)*/ mul = 0; /*積的最后n位*/ b = 10; /*b為截取乘數(shù)相應位時的系數(shù)*/while(k>0) { mul=( mul + ( number%(k*10) )*( number%b - number%(b/10) ) )%a;/*(部分積+截取被乘數(shù)的后N位*截取乘數(shù)的第M位),%a再截取部分積*/ k /= 10; /*k為截取被乘數(shù)時的系數(shù)*/ b *= 10; }if(number == mul) /*判定若為自守數(shù)則輸出*/ printf("%ld ", number); } printf("\n");return 0;}運行結果:It exists following automorphic nmbers small than 100000:0???1???5???6???25???76???376???625???9376???90625總結
以上是生活随笔為你收集整理的c语言数组如何把一串数字存入数组_C语言经典编程题(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】字典(Dictionar
- 下一篇: 【图像】imagededup照片去重(感