吉林大学超星学习通06 07 08
? ? ? ?狠狠在八皇后的實質不同解和鏈表中溺水了.......低落了好一段時間沒有碰代碼。鏈表又難又長了,我這耐心沒它長。。。總之還需要繼續精進,鞏固鏈表然后統一復習后準備進軍數據結構。
? ? 希望能越走越向前吧。
06
1.?(程序題)
題目編號 :Exp07-Basic01
題目名稱:復數運算
題目描述:復數可以寫成A+Bi的常規形式,其中A是實部,B是虛部,i是虛數單位,滿足i^2=-1。
編寫程序,分別計算兩個復數的和、差、積。
?
輸入:在一行中依次給出兩個復數的實部和虛部,數字間以一個西文空格分隔。
輸出:一行中按照A+Bi的格式輸出兩虛數的和、差、積,實部和虛部均保留2位小數;
如果B是負數,則應該寫成A-|B|i的形式;如果B是零則不輸出虛部;結果間以4個西文空格間隔。
?
樣例1:
輸入: 2.3?3.5?5.2?0.4 輸出: 7.50+3.90i????-2.90+3.10i????10.56+19.12i樣例2:
輸入: 3.3?4.5?3.3?-4.5 輸出: 6.60????0.00+9.00i????31.14 #include<stdio.h>int main() {double m, n;//m實ni struct fushu {double a, b;}A, B;scanf_s("%lf%lf", &m, &n);A.a = m;A.b = n;scanf_s("%lf%lf", &m, &n);B.a = m;B.b = n;if (A.b + B.b > 0)printf("%.2lf+%.2lfi ", A.a + B.a, B.b + A.b);else if (A.b + B.b == 0)printf("%.2lf ", A.a + B.a);else printf("%.2lf%.2lfi ", A.a + B.a, B.b + A.b);if (A.b - B.b > 0)printf("%.2lf+%.2lfi ", A.a - B.a, A.b - B.b);else if (A.b - B.b == 0)printf("%.2lf ", A.a - B.a, A.b - B.b);else printf("%.2lf%.2lfi ", A.a - B.a, A.b - B.b);if (A.a * B.b + A.b * B.a > 0)printf("%.2lf+%.2lfi", A.a * B.a - A.b * B.b, A.a * B.b + A.b * B.a);elseif (A.a * B.b + A.b * B.a == 0)printf("%.2lf", A.a * B.a - A.b * B.b, A.a * B.b + A.b * B.a);else printf("%.2lf%.2lfi", A.a * B.a - A.b * B.b, A.a * B.b + A.b * B.a);}2.?(程序題)
【計2016級期末試題】構造一個表示教師的結構體(包含3個字段:姓名、性別、年齡),編寫函數,讀入n個教師的信息,存入一個結構體數組中(如下圖所示)。最后輸出第n/2個教師的信息。
例如:一個教師的信息為zhangsan、false、50,另一個教師的信息為lisi、false、37。
輸入:依次輸入一個正整數n及n個教師的姓名、性別、年齡。(說明:n不大于10;姓名長度不超過20個英文字符;性別輸入0/1表示女/男)。
輸出:數組下標為n/2的教師信息。(說明:n/2直接截取整數,不進行四舍五入;性別輸出Female/Male表示女/男;每個數據后均有1個空格)。
樣例1:
輸入:1 zhangsan 0 50
輸出:zhangsan Female 50
樣例2:
輸入:4 zhangsan 0 50 lisi 1 28 wangwu 0 30 zhaoliu 1 34
輸出:wangwu Female 30
樣例3:
輸入:5 zhangsan 0 50 lisi 1 28 wumei 0 30 zhaoliu 1 34 wangermazi 1 18
輸出:wumei Female 30
#include<stdio.h>struct teacher{char name[20];int gender;int age;}tea[10];int main(){int n,i;scanf("%d",&n);for(i=0;i<n;i++){scanf("%s%d%d",&tea[i].name,&tea[i].gender,&tea[i].age);}i=n/2;printf("%s ",tea[i].name);if(tea[i].gender==0) printf("Female ");else printf("Male ");printf("%d",tea[i].age);}?07
1.?(程序題)
題目編號:Exp06-Basic01,GJBook3-10-02
題目名稱:排列組合
問題描述:編寫程序求函數C(m,n)的值。
輸入:從鍵盤隨機輸入一個自然數和一個非負整數,分別作為m和n的值(m≥n)。
輸出:函數C(m,n)的值。
樣例1:
輸入:
4? 1??
輸出:
4
樣例2:
輸入: 6?2? 輸出: 15 //學習通遞歸1 #include<stdio.h>long long haha(int x){//數據大得要long long if (x==0) return 1;else return x*haha(x-1);//上遞歸 有點冗雜(?)但是簡單}int main(){int m,n; long long res=0;//用result代表最后結果 scanf("%d%d",&m,&n);if(n<0) res=0;//討論 else if(n==0) res=1;else if(n==1) res=m;else if(m<2*n) {res=haha(m)/(haha(n)*haha(m-n));}else if(res=haha(m-1)/(haha(m-n)*haha(n-1))+haha(m-1)/(haha(n)*haha(m-n-1)));printf("%lld",res);//輸出 return 0;}2.?(程序題)
題目編號:Exp06-Basic02,GJBook3-10-03
題目名稱:Hermite多項式
題目描述:編寫程序,用遞歸方法求解Hermite 多項式值。Hermite 多項式定義如下。
輸入:從鍵盤隨機輸入一個非負整數和一個實數,作為n和x的值。
輸出:H~n~(x)的值,精確到小數點后2位。
樣例1:
樣例2:
輸入: 2??2.4 輸出: 21.04 //學習通遞歸1 #include<stdio.h>double haha(int n,double x){//上遞歸 if (n == 0) return 1;elseif (n == 1) return 2 * x;else return 2*x*haha(n-1,x)-2*(n-1)*haha(n-2,x);}int main(){int n;//習慣把題目要求量單打 double x;//為了精度幾乎統統用doublescanf("%d%lf",&n,&x);printf("%.2f",haha(n,x));return 0;}3.?(程序題)
題目編號:Exp06-Basic03,GJBook3-10-04
題目名稱:Ackerman函數
問題描述:編寫程序,計算?Ackerman?函數值。Ackerman?函數定義如下
??????????
?
輸入:從鍵盤隨機輸入兩個非負整數,分別作為m和n的值。
輸出:Ack(m,?n)的值。
樣例1:輸入?2 3??輸出?9
樣例2:輸入?3 2??輸出?29
樣例3:輸入?0 3??輸出?4
//學習通遞歸1 #include<stdio.h>int haha(int m,int n){//上遞歸 if(m==0) return n+1;else if(n==0) return haha(m-1,1);else return haha(m-1,haha(m,n-1));//遞歸就像是使用數學的函數 }int main(){int m,n;scanf("%d%d",&m,&n);printf("%d",haha(m,n));return 0;}4.?(程序題)
題目編號 :Exp06-Basic04
題目名稱:最大公因數
題目描述:編寫程序,用遞歸方法求解m、n最大公約數。對正整數u和v 可以采用歐幾里德輾轉相除算法求它們的最大公因數,具體過程如下:
u% v → r~1~
v % r~1~ → r~2~
r~1~% r~2~ → r~3~
r~2~ % r~3~ → r~4~
? ?… … ?
r~n-1~% r~n~ → r~n+1~=0
當余數r~n+1~=0時,計算過程結束,r~n~ 為正整數u 、v的最大公因數。
輸入:從鍵盤隨機輸入兩個正整數m和n。輸出:最大公因數。
?
樣例1:
輸入: 12?15 輸出: 3樣例2:
輸入: 28?49 輸出: 7 //學習通遞歸1 #include<stdio.h>#include<stdlib.h>//沒學會跳出 沒用遞歸(orz) int main(){int m,n;int l; scanf("%d%d",&m,&n);if(m<n) {//保證m大 傻瓜(指我)方法 l=m;m=n;n=l;}while(n!=0){l=m%n;m=n;n=l;}printf("%d",m);return 0;}5.?(程序題)
題目編號:Exp06-Basic05,GJBook3-10-06
題目名稱:順序檢索
題目描述:編寫程序,用遞歸方法在整數組中進行順序檢索。
?
輸入:
第一行輸入一個正整數n(0<n≤100),表示數組的元素個數;
第二行依次輸入n個整數,作為數組的元素;
第三行輸入待檢索的關鍵字。
輸出:
如果數組中含有關鍵字,則輸出其首次出現的位置(下標值較小的位置)否則輸出NULL。
?
樣例1:
輸入: 8 0?2?3?4?5?9?10?8 3 輸出: 2樣例2:
輸入: 8 0?2?3?4?5?9?10?8 6 輸出: NULL //學習通遞歸5#include<stdio.h>#include<stdlib.h>int a[101],n;//全局變量 數組內元素均為0 int sea(int i,int n1){if(a[i]==n1){return i;}else if(i==n) return -1;//判斷 else return sea(i+1,n1);}int main(){int n1;int i,res;scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&a[i]);}scanf("%d",&n1);i=0;res=sea(i,n1);if(res==-1)printf("NULL");//表示 elseprintf("%d",res);return 0;}6.?(程序題)
題目編號:Exp06-Enhance01,GJBook3-10-05
題目名稱:最大元素
題目描述:編寫程序,用遞歸方法求解長度為n的整型數組中最大元素值。
?
輸入:第一行輸入一個正整數n(0<n≤100),表示數組的元素個數;第二行依次輸入n個整數,作為數組的元素。
輸出:最大元素的值。
樣例1:
樣例2:
輸入: 10 0?1?2?3?4?5?6?7?8?9 輸出: 9 //學習通遞歸5#include<stdio.h>#include<stdlib.h>int a[101];//全局變量 數組內元素均為0 int sea(int n,int max,int i){if(i==n) return max;else if(a[i]>max) return sea(n,a[i],i+1);else return sea(n,max,i+1); }int main(){int i;int max=0,n;scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&a[i]);} i=0;max=sea(n,max,i);printf("%d",max);return 0;}7.?(程序題)
題目編號:Exp06-Enhance02
題目名稱:數組反序
題目描述:編寫程序,用遞歸方法反序數組。
輸入:第一行輸入一個正整數n(0<n≤100),表示數組的元素個數;第二行依次輸入n個整數,作為數組的元素。
輸出:順次輸出逆序后數組中元素,元素間以一個西文空格間隔,最后一個元素后無字符。
樣例1:
樣例2:
輸入: 5 0?2?3?3?5 輸出: 5?3?3?2?0 //學習通遞歸5#include<stdio.h>#include<stdlib.h>int a[101],b[101];//全局變量 數組內元素均為0 //全局變量不必傳遞參數 void sea(int n,int i){if(i==n) return ;//遞歸出口 else {b[i]=a[n-1-i];sea(n,i+1);//遞歸 }}int main(){int i;int n;scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&a[i]);} i=0;//目前本人沒想到更好遞增數的方法 sea(n,i); for(i=0;i<n;i++) {printf("%d",b[i]);if(i!=n-1) printf(" "); }return 0;}8.?(程序題)
題目編號 :Exp06-Enhance03
題目名稱:截木條
題目描述:
給定一個長度為n的木條,將其在大致2/5的位置截斷,得到2個長度仍為整數的木條;如果新得到的木條的長度仍舊超過規定長度k,將繼續按照上述方法處理得到的木條,直到所有木條的長度都不大于k。
編寫程序,用遞歸方法計算一個長度為n的木條,當規定長度為k時,其經過上述截斷過程會得到多少根木條。其中:n、k均為正整數,且假設木條截斷所得短木條長度四舍五入為正整數,長木條長度為總長減去短木條長度。
輸入:順次從鍵盤輸入兩個正整數n和k。
輸出:木條根數。
樣例1:
輸入: 20??4 輸出: 7樣例2:
輸入: 3?20 輸出: 1 //學習通遞歸5#include<stdio.h>#include<stdlib.h>int i=0;//不需要數組。。。。void sea(double n,int k){int m=0,m1=0;if(n>k){//先看短的 m=n*2/5+0.5;m1=n-m;i++;} if(m>k){sea(m,k);}if(m1>k){sea(m1,k);}return ;}int main(){int k;double n;scanf("%lf%d",&n,&k);sea(n,k); if(n*5/3<k) printf("1");else printf("%d",i+1);return 0;}9.?(程序題)
題目編號 :Exp06-Enhance05,freshman-1022
題目名稱:十進制轉換任意進制
題目描述:編寫程序,用遞歸方法將十進制的非負整數 N 轉換為 b 進制數(2≤b≤36),其中字符、ASCII碼值和數值之間的對應關系如下:
輸入:一行輸入兩個非負整數,分別是十進制的 N 和 b ?,其中 0 <=N <=2^31 ,2 <=b <= 36 。
輸出:N 的 b 進制數。
?
樣例1:
輸入: 579?8 輸出: 1103樣例2:
輸入: 579?20 輸出: 18J #include<stdio.h>char a[35];int i=0;void jz(long long N, long long b){if(N%b>=10) a[i]=(char)(N%b+48+7);else a[i]=(char)(N%b+48);N=N/b;i++;if(N>0){jz(N,b);}else return ;}int main(){long long N,b;scanf("%lld%lld",&N,&b);jz(N,b);for(i--;i>=0;i--){printf("%c",a[i]);}return 0;}?08
1.?(程序題, 40分)
題目編號:Exp08-Basic01,GJBook3-12-05
題目名稱:正整數分解
題目描述:正整數n,按第一項遞減的順序依次輸出其和等于n的所有不增的正整數和式。
輸入:一個正整數n(0<n≤15)。
輸出:每行輸出如樣例所示,和等于n的不增正整數和式,數字和運算符間無符號,最后一行結尾有一個回車換行符。
?
樣例:
輸入: 4 輸出: 4=3+1 4=2+2 4=2+1+1 4=1+1+1+1 #include<stdio.h>#include<string.h>int a[16],k;void fj(int n,int n1,int i1){int i;if(n==0){printf("%d=",i1);for(i=0;i<k-1;i++){printf("%d+",a[i]);}printf("%d\n",a[k-1]);return ;}for(i=n1;i>0;i--){a[k++]=i;if(n-i>=0) fj(n-i,i,i1);k--;}return ;}int main(){int n;scanf("%d",&n);fj(n,n-1,n);return 0; }2.?(程序題, 40分)
題目編號:Exp08-Basic02,GJBook3例-12-02
題目名稱:N皇后問題
題目描述:
八皇后問題由高斯(C. F. Gauss)最早在1850年提出并研究,但并未完全解決。N皇后問題指在一個N×N的棋盤上放置N個皇后,使任意兩個皇后都不能互相攻擊。按國際象棋規則,兩個皇后,若在同一行上,或在同一列上, 或在同一條斜線上, 則她們可以互相攻擊。下圖即滿足八皇后條件的一種棋局。
編寫程序給出滿足條件的棋局數目。
輸入:一個正整數N(0<N≤13)輸出:棋局數目
樣例1:
樣例2:
輸入: 8 輸出: 92 #include<stdio.h>#include<math.h>//考慮用對稱 但是此外還要考慮本身對稱的情況 遂作罷 int a[14]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//每行所在列 -1后面方便標記 int way=0,n;int ok(int i,int j){//判斷該位置是否ok int i1;//行 for(i1=1;i1<i;i1++){if(j==a[i1]) return 0;//列一樣 撤 if((i-i1)==-(j-a[i1])) return 0;//副對角線上 撤if((i-i1)==(j-a[i1])) return 0;//主對角線 撤 }return 1;}void begin(int queen){int i;for(i=1;i<n+1;i++){//遍歷放n個空位 if(ok(queen,i)==1){//給進行和列 a[queen]=i;//記錄 if(queen==n){//一種方法結束 way++;return ;}int next;//沒完繼續 next=queen+1;begin(next);}} a[--queen]=-1;//這行沒有位置放 上一行重置 }int main(){scanf("%d",&n);begin(1); printf("%d",way); return 0;}?八皇后有好幾種方法,我看完了打了兩個覺得這個兩個之中比較簡潔比較orz。可以多看看。
總結
以上是生活随笔為你收集整理的吉林大学超星学习通06 07 08的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黑书上的DP例题
- 下一篇: 技巧:在 C/C++中如何构造通用的对象