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!

 

posted @ 2020-12-06 11:38  面向题目编程  阅读(430)  评论(0)    收藏  举报