1. 程式人生 > 實用技巧 >JYU計算機學院團體賽20級題解

JYU計算機學院團體賽20級題解

6-1

先求數字的位數,再求出各位數的i次冪和,最後判斷

 1 #include<math.h>
 2 int narcissistic(int number){
 3     int x=number,i=0,sum=0;
 4     //獲得數字的位數 
 5     while(x){
 6         x/=10;  i++;
 7     }
 8     x=number;
 9     //獲得數字各位數的i次冪 
10     while(x){
11         sum+=pow(x%10,i);
12         x/=10;
13     }
14     if(sum==number) return
1; 15 else return 0; 16 } 17 void PrintN( int m, int n ){ 18 for(int i=m+1;i<n;i++) 19 if(narcissistic(i)) printf("%d\n",i); 20 }
多看多學

6-2

講過

1 int f(int n){
2     if(n==0) return 0;
3     if(n==1) return 1;
4     return f(n-1)+f(n-2);
5 } 
課上講過

6-3

emmmmm

1 void findmax( int *px, int
*py, int *pmax ){ 2 *pmax=*px>*py?*px:*py; 3 }
常規

7-1

判斷就完事了沒啥好講的,沒過的建議自己去原題補題,提交後會有測試點描述。

 1 #include <stdio.h>
 2 #include <math.h>
 3  
 4 int main()
 5 {
 6     double a,b,c; 
 7     scanf("%lf %lf %lf",&a,&b,&c);
 8 
 9     if(a!=0){//a!=0
10         double delta=b*b-4
*a*c; 11 if(delta>0){ 12 //兩個不相等的實根 13 double x1,x2; 14 x1=(-b+sqrt(delta))/(2*a); 15 x2=(-b-sqrt(delta))/(2*a); 16 printf("%.2lf\n",x1); 17 printf("%.2lf\n",x2); 18 } 19 else if(delta<0){ 20 //有兩個不相等的復根 21 if(b!=0){ 22 //非純虛根 23 double real=-b*1.0/(2*a); 24 double imag=sqrt(-delta)*1.0/(2*a); 25 printf("%.2lf%+.2lfi\n",real,imag); 26 printf("%.2lf%+.2lfi\n",real,-imag); 27 } 28 else{ 29 //純虛根 30 double imag=sqrt(-delta)*1.0/(2*a); 31 printf("%.2lf%+.2lfi\n",0.0,imag); 32 printf("%.2lf%+.2lfi\n",0.0,-imag); 33 } 34 } 35 else{ 36 //有一個根 此時a!=0 37 printf("%.2lf\n",-b*1.0/(2*a)); 38 } 39 } 40 else{ 41 if(b!=0){ 42 //有一個根 此時a!=0 43 printf("%.2lf\n",-c*1.0/b); 44 } 45 else{ 46 //特殊情況 47 if(0==c) printf("Zero Equation\n"); 48 else printf("Not An Equation\n"); 49 } 50 } 51 return 0; 52 }
程式碼點我

7-2

列印楊輝三角形

楊輝三角形就是除第一行是1外,第i行的第j個元素都是第i-1行第j列+第i-1行第j-1列的和,即f[i][j]=f[i-1][j]+f[i-1][j-1]

其餘的就是格式問題了。

 1 #include<stdio.h>
 2 //陣列開大一點防止越界,把陣列設定為全域性變數會初始化為0 
 3 int f[12][12];
 4 int main()
 5 {
 6     int n;
 7     f[0][0]=1;
 8     scanf("%d",&n);
 9     //i控制行數  l控制每一行前面的空格  j控制列數 
10     for(int i=1,l=n-1;i<=n;i++,l--){
11         for(int k=1;k<=l;k++) printf(" ");
12         for(int j=1;j<=i;j++){
13             f[i][j]=f[i-1][j-1]+f[i-1][j];
14             printf("%4d",f[i][j]);
15         }
16         printf("\n");
17     }
18     return 0;
19 }
程式碼康我

7-3

就是一個簡單的結構體比較。

 1 #include<stdio.h>
 2 struct node{
 3     int num;
 4     char name[12];
 5     int sc1,sc2,sc3,sum;
 6 }stu,maxx;
 7 
 8 int main()
 9 {
10     int n;
11     maxx.sum=-1;
12     scanf("%d",&n);
13     for(int i=0;i<n;i++){
14         scanf("%d%s%d%d%d",&stu.num,stu.name,&stu.sc1,&stu.sc2,&stu.sc3);
15         stu.sum=stu.sc1+stu.sc2+stu.sc3;
16         if(stu.sum>maxx.sum) maxx=stu; 
17     }
18     printf("%s %05d %d",maxx.name,maxx.num,maxx.sum);
19     return 0;
20  } 
看看程式碼

7-4

注意格式就好輸出數字的時候別多輸出換行

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int start,end,sum=0;
 5     scanf("%d%d",&start,&end);
 6     int i=end-start+1;
 7 
 8     for(int a=0;a<i;a++){
 9         printf("%5d",start+a);
10         if((a+1)%5==0 && a+1<i)
11             printf("\n");
12         sum=sum+start+a;
13     }
14     printf("\nSum = %d",sum);
15     
16     return 0;
17 }
程式碼沒意思

7-5

這道題居然全軍覆沒,就是個模擬,開個陣列點到哪個猴子就把對應下標設定為1,迴圈的時候遇到1就跳過,最後陣列剩下一個值為0的下標就是猴子的KING。

 1 #include<stdio.h>
 2 int s[1000];
 3 int main(void)
 4 {
 5     int i=0,cnt=0,n,len;
 6     scanf("%d",&n);
 7     len=n;
 8     while(1) {
 9         if(n==1)  break;
10         if(!s[i]){ //如果s[i] != 0,說明這個位置的猴子沒有退出
11             cnt ++; //則計數器+1 
12         }
13         if(cnt==3) { //如果計數器加到3,即報數報到3 
14             s[i]=1; //將此位置賦1,即 
15             cnt=0; //重新報數 
16             n--; //猴子數量-1 
17         }
18         i=(i+1)%len; //如果超過最長長度,則重頭開始 
19     }
20     for(int i=0;i<len;i++) {
21         if(!s[i]){
22             printf("%d",i+1);
23             break;
24         }
25     }
26     return 0;
27 }
模擬模擬

你說模擬太麻煩了?

當然這道題還有程式碼更短的做法,三行程式碼搞定。

自行學習約瑟夫環問題。

1     #include<stdio.h>
2     int main()
3     {
4         int n,i,sum=0;
5         scanf("%d",&n);
6         for(i=2;i<=n;i++) sum=(sum+3)%i;
7         printf("%d",sum+1);
8         return 0;
9     }
約瑟夫環

7-6

判斷一下開頭有沒有負號,行末沒有空格,沒了,簡單。

 1 #include<stdio.h>
 2 #include<string.h>
 3 int main()
 4 {
 5     char py[][5] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
 6     char num[100];
 7     scanf("%s",num);
 8     for(int i=0;i<strlen(num);i++){
 9         if(!i&&num[i]=='-') printf("fu");
10         else{
11             if(!i)  printf("%s",py[num[i]-'0']);
12             else  printf(" %s",py[num[i]-'0']);
13         }
14     }
15     return 0;
16 }
康康康康

7-7

Hello World!