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!

浙公网安备 33010602011771号