程序设计课程作业-2018212783-孙贵珠

一、具体题目分析
1.
题意:将百分制成绩转换成相应的等级。
思路:理解题意,先认清各分数段对应的等级,使用条件语句逐个判断输入的各个成绩所处的分数段,从而依次判断等级。
细节:首先需注意应考虑多组数据的输入,所以需用while语句输入t。其次考虑应全面,需要留意数据不在0~100范围内的情况。最后,是每组输出一行,所以需要进行换行。
代码:#include<iostream>
            using namespace std; 
            int main()
            {
                  int t;
                  while(cin>>t)
                  {
                        if(t>=0&&t<=59) cout<<"E"<<endl;
                        else if(t<=69&&t>59) cout<<"D"<<endl;
                        else if(t<=79&&t>69) cout<<"C"<<endl;
                        else if(t<=89&&t>79) cout<<"B"<<endl;
                        else if(t<=100&&t>89) cout<<"A"<<endl;
                        else cout<<"Score is error!"<<endl;
                   }
                   return 0;
             }
2.
题意:输出在给定范围的水仙花数。
思路:先仔细理解水仙花数的定义你,明确满足水仙花数的条件。给定范围m,n,明确其中数值i的个位、十位、百位的表示方式,即分别为i/100、i/10%10、i%10。然后就可用if语句判断该数是否满足水仙花数的条件。
细节:用while语句输入多组数据。注意输出的水仙花数需在给定范围内且应按从小到大的顺序。注意空格的处理,即if(j==1) printf("%d",i);  else printf(" %d",i);。考虑应全面:若在给定范围内不存在水仙花数,则输出no。最后注意输出的换行处理。
代码:#include<stdio.h>
            int main()
            {
                  int m,n,i,a,b,c,j;
                  while(scanf("%d %d",&m,&n)!=EOF)
                  {
                       j=0;
                       for(i=m;i<=n;i++)
                       { 
                            a=i/100;b=i/10%10;c=i%10;
                            if(i==a*a*a+b*b*b+c*c*c)
                            {
                                  j++;
                                  if(j==1) printf("%d",i);
                                  else  printf(" %d",i);
                            }
                       }
                       if(j==0)
                       printf("no");
                       printf("\n");
                  }
             }
3.
题意:求n个整数中奇数的乘积。
思路:输入n个整数,考虑用数组表示每一个数。由假设每组数据必定至少存在一个奇数,思考需用条件语句判断各个数的奇偶性,即是否能够整除2。在满足条件的情况下相乘。
细节:首先需用while语句输入多组,需先给定一整数m的初始值为1,用for语句输入数组,再从中使用if语句判断限定,满足奇数条件才可相乘。最后换行输出。
代码:#include<iostream>
            using namespace std;
            int main()
            {
                  int n,m,a[100],i;
                  while(cin>>n)
                 {
                       m=1;
                       for(i=1;i<=n;i++)
                       {
                             cin>>a[i];
                             if(a[i]%2!=0)
                             {
                                   m=m*a[i];
                              }
                         }
                         cout<<m<<endl;
                    }
             }
4.
题意:判定定义域在一定范围内的表达式的值是否都为素数
思路:首先明确素数的定义,即除了一和它本身外都不能整除的数为素数,使用for语句来表示某个范围内满足表达式的值,假设此范围内的数为a,则考虑用循环语句使a分别被2~a-1除,判断整除的情况,依据次数来判断该范围内的值是否都为素数。
细节:首先应考虑到x、y都为0的情况(不作处理)。其次在判断整除次数时,仅需判断该数是否能整除一和它本身以外的数,若可整除则依次累加整除次数。若用b表示次数,在使用for语句前需先将零赋值给b,累加结束后,若b的值没有变化,就说明该范围内的值全为素数。最后换行输出时也要注意字母的大小写。
代码:#include<stdio.h>
            int main()
            {
                 int x,y,i,j,a,b;
                 while(scanf("%d %d",&x,&y)!=EOF)
                 {
                      b=0;
                      for(i=x;i<=y;i++)
                      {
                           a=i*i+i+41;
                           for(j=2;j<a;j++)
                           {
                               if(a%j==0) b++;
                            }
                       }
                      if(b==0)
                      {
                           if(x==0&&y==0) continue;
                           else printf("OK\n");
                       }
                       else if(b!=0)
                       printf("Sorry\n");
                  }
            }
5.
题意:求多项式1-1/2+1/3-1/4+1/5-1/6+…的前n项和。
思路:多项式可分为两部分(加法和减法),减法的部分相加后减号可提取出来与加法部分相加便可得其前n项和。
细节:输入数据由两行构成。若多项式的最后一项为1/n,需考虑n的奇偶性:若n为偶数,最后一项则为减法,若n为奇数,最后一项则为加法。使用if语句进行分类讨论。在for语句内相加时,要找出其中的规律,注意范围(j<=a[i]/2或j<=(a[i]-1)/2)。最后正数部分和负数部分相加时要注意,若此数为奇数需再加1。而且输出结果(换行)要保留两位小数(printf(”%.2lf\n”,n))。
代码:#include<stdio.h>
            int main()
           {
                int m,i,a[100];
                double n,b,c,j;
                while(scanf("%d",&m)!=EOF)
                { 
                     b=0;
                     c=0;
                     for(i=1;i<=m;i++)
                {
                     b=0;
                     c=0;
                     scanf("%d",&a[i]);
                     if(a[i]%2==0)
                     {
                            for(j=1;j<=a[i]/2;j++)
                            {
                                  b=b+1/(j*2-1);
                                  c=c+1/(j*2);
                           }
                           n=b-c;
                      }
                      else
                      {
                           for(j=1;j<=(a[i]-1)/2;j++)
                           {
                                b=b+1/(2*j+1);
                                c=c+1/(2*j);
                            }
                            n=b+1-c;
                       }
                       printf("%.2lf\n", n);
                   }
              }
              return 0;
         }
6.
题意:输出某个长度为n(从2开始递增的偶数)序列每m个数的平均值,若最后不足m个,按实际数量求出。
思路:需分成m可以整除n或不能整除的情况。注意到数列为公差为2的等差数列,用for语句进行处理。
细节:首先,规定输出格式,每个数之间用空格隔开。其次,不能忽略分成i组后剩余的数求平均值。最后,输出时要判断是否是第一个输出的数,若是不输出“空格”。判断是否有余数,若有才进行求平均值后输出。
代码:#include<stdio.h>
            int main()
            {
                int n,m,i,j,sum=0,k;
                while(scanf("%d %d",&n,&m)!=EOF)
                {
                     k=0;
                     for(i=1;i<=n/m;i++)
                     {
                           sum=0;
                           if(i>1) printf(" ");
                           for(j=1;j<=m;j++)
                           {
                                 k=k+2;
                                 sum+=k;
                           }
                           printf("%d",sum/m);
                      }
                      if(n%m)
                      {
                           sum=0;
                           for(j=1;j<=n-n/m*m;j++)
                           {
                                k=k+2;
                                sum+=k;
                            }
                            printf(" %d",sum/(j-1));
                        }
                        printf("\n");
                   }
            } 
7.
题意:去掉最高分和最低分后计算选手的平均值(n个评委)。
思路:输入n个数,先排序(从大到小或者从小到大),然后取中间n-2个数求平均值。
细节:在使用for语句前应对必要的数进行赋值。进行排序及输出时应正确认识初始化表达式及循环控制表达式。结果需保留两位小数。
代码:#include<stdio.h>
            int main()
            {
                 int n,a[110],b,i,j;
                 double c;
                 while(scanf("%d",&n)!=EOF)
                 {
                      for(i=0;i<n;i++)
                      {
                           scanf("%d",&a[i]);
                      }
                      b=0;
                      c=0;
                      for(i=0;i<=n-1;i++)
                      {    
                          for(j=i+1;j<n;j++)
                          {
                               if(a[i]>a[j])
                               {
                                   b=a[i];
                                   a[i]=a[j];
                                   a[j]=b;
                                }
                           }
                        }
                        for(i=1;i<n-1;i++)
                        {
                            c=c+a[i];
                         }
                         printf("%.2lf\n",c/(n-2));
                   }
            }
8.
题意:一头母牛每年年初生一头小母牛,小母牛从第四个年头也开始生,求第n年共有多少头。
思路:找规律。 如果假定第1年只有一头刚生小母牛,那么f(1)=1,第2年有f(2)=1,3年有f(3)=1,从第4年开始这母牛生小牛了,有f(4)=2(恰好就是f(3)+f(1)) 
因此得到递推公式:f(1)=f(2)=f(3)=1,f(n)=f(n-1)+f(n-3)(n>=4) 
如果第1年的母牛是能生小母牛的牛,那么: f(1)=2,f(2)=3,f(3)=4,f(n)=f(n-1)+f(n-3)(n>=4) 
得递推公式f(n)=f(n-1)+f(n-3)(n>=4)
细节:考虑数量,应用long long来定义。注意考虑n等于零的情况。For语句中初始表达值应为5。最后的输出要换行。                                         

代码:#include<iostream>
            #include<iomanip>
            using namespace std;
            int main()
            {
                 int n,i;
                 long long a[100];
                 while(cin>>n)
                 {
                     if(n==0) break;
                     a[1]=1;
                     a[2]=2;
                     a[3]=3;
                     a[4]=4;
                     for(i=5;i<60;i++)
                     {
                          a[i]=a[i-1]+a[i-3];
                     }
                     cout<<a[n]<<endl;
                  }
                  return 0;
            }
9.
题意:将n个整数按照绝对值从小到大输出。
思路:绝对值排序与一般排序并没有太大差异,只需要在进行比较时使用绝对值比较即可(运用绝对值函数进行排序)
细节:注意n等于零的情况。最后输出时,应注意空格的输出,即当且仅当输出最后一个数值时不输出空格(使用if语句分类输出)。
代码:#include<iostream>
            #include<cmath>
            using namespace std;
            int main()
            {
                 int n,i,j,a[101],c;
                 while(cin>>n,!n==0)
                 {
                      for(i=1;i<=n;i++)
                      {
                          cin>>a[i];
                       }
                       for(i=1;i<=n;i++)
                       {
                            for(j=i+1;j<=n;j++)
                            {
                                if(abs(a[j])>abs(a[i]))
                                {
                                     c=a[j];
                                     a[j]=a[i];
                                     a[i]=c;
                                }
                            }
                       }
                      for(i=1;i<=n;i++)
                      {
                           if(i==n) cout<<a[i]<<endl;
                           else cout<<a[i]<<" ";
                       }
                  }
                  return 0;
            }
10.
题意:将一整数m插入一从小到大排列好的序列中,使新的序列依然有序。
思路:若要插入m可以将序列大致分成三部分。新序列中,由题意可知在m前面的数值与原序列的相对位置没有发生变化,所以可依原序列依次输出。第二步便可输出m。最后输出原序列的剩余数。
细节:首先应考虑n,m同时为零的情况。若输入的m比序列的第一个数还小,则无法插入。应注意空格的输出格式。
代码:#include<iostream>
            using namespace std;
            int main()
            {
                 int n,m,i,a[101],j;
                 while(cin>>n>>m)
                 {
                      if(n==0&&m==0) break;
                      for(i=1;i<=n;i++)
                      {
                           cin>>a[i];
                      }
                      for(i=1;i<=n;i++)
                  {
                       if(m<a[i]) break;
                   }
                   for(j=1;j<i;j++)
                   {
                        cout<<a[j]<<" ";
                   }
                   cout<<m;
                   for(j=i;j<=n;j++)
                   {
                        cout<<" "<<a[j];
                    }
                    cout<<endl;
                }
                return 0;
            }
11.
题意:求给老师发工资至少要准备多少张人民币。
思路:求最少的张数应先考虑最大面额的钱,再考虑小一号面额的钱,这样就能做到最终钱的数量最少,以除法或求余方式来计算。
细节:在实际计算不同面值的张数时注意运算顺序,最后换行输出。
代码:#include<stdio.h>
            int main()
            {
                 int n;
                 while(scanf("%d",&n),n!=0)
            {
                 int a[110],i,sum=0;
                 int b,c,d,e,f,g;
                 for(i=0;i<n;i++)
                 scanf("%d",&a[i]);
                 for(i=0;i<n;i++)
                 {
                      b=a[i]/100;
                      c=(a[i]%100)/50;
                      d=(a[i]%100)%50/10;
                      e=(a[i]%100)%50%10/5;
                      f=(a[i]%100)%50%10%5/2;
                      g=(a[i]%100)%50%10%5%2;
                      sum=b+c+d+e+f+g+sum;
                 }
                 printf("%d\n",sum);
             }
             return 0;
          } 
12.
题意:计算A+B,A,B由三个整数组成表示时分秒
思路:时分秒分别相加,需考虑相加的数值是否大于等于60,用条件语句进行判断。
细节:注意若秒相加大于等于60,分钟应相应的增加,同时秒数也应减小。最后的输出应注意空格和换行。
代码:#include<stdio.h>
            int main()
            {
               int n,i;
               int a1,a2,a3,b1,b2,b3,q,w,e;
               while(scanf("%d",&n)!=EOF)
               {
                   for(i=0;i<n;i++)
                   {
                         scanf("%d %d %d %d %d %d",&a1,&a2,&a3,&b1,&b2,&b3);
                         q=a1+b1;
                         w=a2+b2;
                         e=a3+b3;
                         if(e>=60)
                         {
                              e=e-60;
                              w++;
                          }
                          if(w>=60)
                          {
                               w=w-60;
                               q++;
                           }
                           printf("%d %d %d",q,w,e);
                           printf("\n");
                     }
                 }
            }
13.
题意:走m,级楼梯有多少走法(开始在第一级,且每次只能跨一级或两级)
思路:可分为两种可能,走一步或走两步。找规律可得出f[i]=f[i-1]+f[i-2]
细节:应注意循环的位置,即初始化表达式,f[1],f[2],f[3]的值是一定的。最后换行输出。
代码:#include<stdio.h>
            int f[41];
            int main()
            {
                 int n,m,i;
                 f[1]=0;
                 f[2]=1;
                 f[3]=2;
                 for(i=4;i<41;i++)
                 {
                      f[i]=f[i-1]+f[i-2];
                 }
                 scanf("%d",&n);
                 while(n--)
                 {
                     scanf("%d",&m);
                     printf("%d\n",f[m]);
                  }
                  return 0;
            }
14.
题意:计算蜜蜂从蜂房a爬到蜂房b的路线数。
思路:由题意知第n格的蜜蜂可以爬到第n+1,n+2格子里。如果a-b的绝对值相同的话,线路数是相同的。如果绝对值是1路线数是1,如果是2 路线数是2,如果是3 路线数是3.....两个位置可以走到最后一个位置,那么走到最后一个位置的路线数就是走到这两个位置的路线数的和。递推公式:F(i) = F(i-1) + F(i-2)。
细节:使用long long来定义,使用递推公式时注意for语句中i从3开始递增。最后输出需换行。
代码:#include<iostream>
            using namespace std;
            int main()
            {
                long long a[60];
                a[1] = 1;
                a[2] = 1;
                for (int i=3;i<=55;i++)
                {
                     a[i] = a[i - 1] + a[i - 2];
                }
                int n;
                cin>>n;
                while(n--)
                { 
                      int x;
                      int y;
                      cin >> x >> y;
                      int f = y - x;
                      cout << a[f+1] << endl;
                 }
            }
15.
题意:给定一个十一位的手机号码,找出相应的短号码。
思路:分成两段考虑输出,第一个数一定输出6,将手机号的每个数存到数组中,第二段输出数组的后五个数。
细节:注意输出为一行,不同数据换行。
代码:#include<iostream>
            using namespace std;
            int main()
            {
                int n,i;
                char a[11];
                cin>>n;
                while(n--)
                {
                    cin>>a;
                    cout<<"6";
                    for(i=6;i<11;i++)
                    {
                         cout<<a[i];
                    }
                    cout<<endl;
                }
                return 0;
            }
二.总结/感受
    这种做题的训练很有效的锻炼了我们综合运用知识的能力,在分析和解决实际问题的过程中培养我们的思维,提高能力。在这几天内,我收获了之前没有接触的新知识点,也巩固了旧知识。还深切感受到知识重在应用,掌握知识是一个方面,能够灵活的运用知识才是最重要的。我还体会到了细节的重要性,重视结构,一个小错误都会导致编译的失败。给我造成最大困扰的是for语句,我不能正确的应用,尤其是需要使用多个时,有时不能正确判断其初始化语句,条件语句及控制语句。但通过查阅资料以及询问同学,我也通过新的方式获得了解决的办法,共同进步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值