c++程序设计课程作业-2018212747-朱文静

一、课设一第4

题意:当n在指定范围内,判断表达式n^2+n+41的值是否为素数,即判断除了1和它本身之外是否不能被其他数整除。

解题思路:首先,每一个n的值都对应一个表达式的值,即要将这些值存进数组里,然后考虑特殊情况,即x和y都为0时,要用到break语句;如果不为0的话,用一个循环语句将表达式的值存进数组里,然后在开始判断这些数是否都为素数;接下来的第一重循环定义的t是表示有多少个数,循环输入进去,第二重循环定义的j是指从2开始到最后一个数,判断数组中的数能否被j整除,不能的话,则都为素数,输出OK;如果有一个或者若干个数的话,则输出Sorry,结束循环。

解题细节是如何处理的:首先要考虑到x和y是否都为0的情况,所以先写在开头;其次,就是用两重循环判断是否为素数的时候,j<a[i]而不是j<=a[i]。

源码

#include<iostream>

#include<iomanip>

using namespace std;

int main()

{

         int x, y, i, n, t, j;

         int a[100];

         while (cin >> x >> y)

         {

                   if (x == 0 && y == 0)

                            break;

                   i = 0;

                   for (n = x; n <= y; n++)

                   {

                            a[i] = n*n + n + 41;

                            i++;

                   }

                   int s = 0;

                   t = y - x;

                   for (i = 0; i <= t; i++)

                   {

                            for (j = 2; j < a[i]; j++)

                            {

                                     if (a[i] % j == 0)

                                     {

                                               s++;

                                               break;

                                     }

                            }

                   }

                   if (s == 0)

                            cout << "OK" << endl;

                   else

                            cout << "Sorry" << endl;

         }

         return 0;

}

二、课设一第11题

题意:给老师们发工资,人民币一共有100元、50元、10元、5元、2元和1元六种,如果每个老师的工资额都知道,求最少需要准备多少张人民币才能在给每位老师发工资的时候都不用老师找零。

解题思路:要求最少的人民币张数,即面值100元的张数应该最多,故应从100元的张数开始算,将n个老师的工资存入数组中然后输入,定义了6个变量分别表示6种人民币的张数,求出来之后再求和,最后输出即可。

解题细节是如何处理的:在表示不同种人民币张数的时候,100元的张数是a[i]/100,则50元的张数是(a[i]%100)/50,以此类推,下一种人民币的张数是上一种人民币求余之后再整除自身的面值。

源码

#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题

题意:输入一个字符串,判断读入的字符串是否是回文。

解题思路:回文串是指从左到右读一串字符的值是一样的,首先,size是指字符串的长度,先读入要判断的一串字符并放入数组letter中,并记住这串字符的长度,然后首尾字符比较,不断向中间靠拢,就可以判断出是否为回文。

解题细节是如何处理的:letter.size() / 2是将一串字符从中间分开,对称位置即letter[j] 和 letter[letter.size() - 1 - j]比较是否相等。

源码

#include<iostream>

#include<iomanip>

#include<string>

#include<cmath>

using namespace std;

int main()

{

         int n;

         int t;

         int sum;

         string letter;

         cin >> n;

         for (int i = 0; i < n; i++)

         {

                   cin >> letter;

                   bool t = 0;

                   for (int j = 0; j < letter.size() / 2; j++)

                   {

                            if (letter[j] != letter[letter.size() - 1 - j])

                            {

                                     t = 1;

                                     break;

                            }

                            if (t == 1)

                                     break;

                   }

                   if (t == 1)

                            cout << "no" << endl;

                   else

                            cout << "yes" << endl;

         }

}

四、课设一第5题

题意:求出多项式1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...的前n项的和。

解题思路:该多项式可以写成一个通项公式,即-1的i+1次方再乘以1/i,用编程语言表示出来就可以。

解题细节是如何处理的:要用到pow(a,b),即a的b次方,所以要在头文件里定义函数。

源码

#include<iostream>

#include<cstdio>

#include<iomanip>

#include<cmath>

using namespace std;

int main()

{

    int m,i,n;

    double sum;

    cin>>m;

    while(m--)

    {

        cin>>n;

        sum=0;

        for(i=1;i<=n;i++)

        {

            sum=sum+pow((-1),(i+1))*(1.00/i);

        }

        cout<<fixed<<setprecision(2)<<sum<<endl;

    }

    return 0;

}

五、课设一第14题

题意:A和B 都是由3个整数组成,分别表示时分秒,求A+B的值。

解题思路:首先,要知道A+B并不是简单的求和运算,而是有关时间的加减法运算,要逢60进1,从秒开始算起,逢60进1,然后秒再本身减1,分本身加1;再算分,也是逢60进1,然后本身再减1,时再加1,最后再按要求输出数据。

解题细节是如何处理的:如果两个数的秒或者分超过60,本身要先减去60,然后分或者时再加1。

源码

#include <iostream>

using namespace std;

int main(){

    int n;

    cin >> n;

    while (n--)

    {

        int h1, m1, s1;

        int h2, m2, s2;

        int h3, m3, s3;

        cin >> h1 >> m1 >> s1;

        cin >> h2 >> m2 >> s2;

        s3 = s1 + s2;

        m3 = m1 + m2;

        h3 = h1 + h2;

        if (s3 >= 60){

            s3 -= 60;

            m3++;

        }

        if (m3 >= 60){

            m3 -= 60;

            h3++;

        }

        cout << h3 << " " << m3 << " " << s3 << endl;

    }

    return 0;

}

六、课设一第16题

题意:求A^B的最后三位数表示的整数,A^B的含义是“A的B次方”。

解题思路:要求A的B次方的最后三位整数,先求出A的B次方,用一个变量x将它表示出来,然后x再除以1000求余,即小数点向前移了三位,也就是最后的三位整数,然后再表示出来即可。

解题细节是如何处理的:用A的B次方求得的数除以1000求余,即得最后三位整数。

源码

#include <iostream>

using namespace std;

int main()

{

    int a,b,x,i;

    while(cin>>a>>b,a!=0||b!=0)

    {

        x=1;

        for(i=1;i<=b;i++)

        x=(a*x)%1000;

        cout<<x<<endl;

    }

    return 0;

}

七、课设一第17题

题意:判断给定的两个数是否是亲和数。

解题思路:亲和数是指某两个数的各自的所有真约数之和等于另一个数,我们可以这样求解:首先,把这两个数的所有真约数都找出来,然后再进行求和,再与另一个数进行比较,如果相等,则输出YES,否则输出NO。

解题细节是如何处理的:找真约数用到的编程语言是b%i==0和a%i==0。

源码

#include<iostream>

using namespace std;

int main()

{

         int m,a,b,sum1,sum2,i;

         cin>>m;

         while(m--)

         {

                   sum1=0;sum2=0;

                   cin>>a>>b;

                   for(i=1;i<a;i++)

                   {

                            if(a%i==0)

                            {

                                     sum1=sum1+i;

                            }

                   }

                   for(i=1;i<b;i++)

                   {

                            if(b%i==0)

                            {

                                     sum2=sum2+i;

                            }

                   }

                   if((a==sum2)&&(b==sum1))

                   {

                            cout<<"YES"<<endl;

                   }

                   else

                   {

                            cout<<"NO"<<endl;

                   }

         }

         return 0;

}

八、课设一第21题

题意:短号是 6+手机号的后5位,一个11位长的手机号码,找出对应的短号。

解题思路:首先,定义一个字符串的一维数组,用来存入字符串的长度,即11位;输入这个字符串,在输出的时候先输出一个6,再进行一个循环,循环是从字符串的第6位开始到最后一位,即这些字符串是最后5位,输出就可以了。

解题细节是如何处理的:首先定义的是字符串的长度,因为输入的字符串都已经确定了是11位,然后把后5位表示出来,再加上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;

}

九、课设一第6题

题意:有一个长度为n(n<=100) 从2开始的递增有序偶数的数列,要求按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。

解题思路:首先,求这n个数的和,i表示2开始的递增的某个有序偶数,定义num表示实际的多少个i想加,在每加一个i的同时num加1,如果num与m相等的话,就没有多余的元素单独再求平均,输出sum/num即可;如果num>m,求出num-m的值,如果sum和num都等于0的话再行下一步,否则一直循环上一条语句。

解题细节是如何处理的:最后不足m个时,要求出实际的数量,通过先判断sum=0和后面的continue语句就可以实现。

源码

#include<stdio.h>

int main()

{

    int n,m,i,sum,num;

    while(scanf("%d %d",&n,&m)!=EOF)

    {

        num=0;sum=0;

        for(i=2;i<=n*2;i+=2)

        {

           sum+=i;

           num++;

           if(num==m&&(i!=n*2))

           {

               printf("%d ",sum/num);

               num-=m;

               sum=0;

           }

        }

        if(sum==0&&num==0) continue;

        printf("%d\n",sum/num);

    }

}

十、课设一第8题

题意:母牛每年年初生一头小母牛,每头小母牛从第四个年头开始,每年年初也生一头小母牛。求第n年的时候共有多少头母牛。

解题思路:这是一个找规律的问题,考察的是斐波那契数列,这是一个线性递推数列规律是F(N)=F(N-1)+F(N-3),即每年的牛分为两种,一种是上一年的牛,另一种是新生的牛,上一年的牛直接写下来,就是F(N-1);再考虑新生的牛的数量,大前年(第n-3年)有多少头母牛,那么到了今年这些牛都能生小牛了,因此出生数为f(n-3),从而今年的母牛数为f(n)=f(n-1)+f(n-3)。

解题细节是如何处理的:首先,在定义数组的时候要用long long整型;如果n为0的话,则母牛这一年没有生小牛,不做处理,要用到break语句。

源码

#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;

}

十一、课设一第18题

题意:有一楼梯共M级,刚开始时在第一级,若每次只能跨上一级或二级,要走上第M级,求共有多少种走法。

解题思路:该题与上题类似,都是找规律的题,因为每次只能跨上一级或二级,最后要走上M级,得出递推数列f[i]=f[i-1]+f[i-2],然后再写出程序就可以了。

解题细节是如何处理的:需要注意的是,刚开始在第一级台阶,所以一开始f[1]=0,接着f[2]=1,f[3]=2,循环从4开始。

源码

#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;

}

十二、课设一第19题

题意:蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行,编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。

解题思路:该题和上题和上上题类似,同样也是找规律的题,但又有所不同。注意到,蜜蜂的路线所在的蜂房是两两挨着的,举个例子:蜜蜂要从蜂房3到蜂房6,一共是4个蜂房,即(6-3)+1个,有三条路线,即3-4-6,3-5-6,3-4-5-6。所以该题的递推公式和上题一样,都是a[i] = a[i - 1] + a[i - 2]。

解题细节是如何处理的:最后输出的是a[f+1],其中f=y-x,而不是a[f],因为要算上起点的蜂房和终点的蜂房。

源码

#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;

    }

}

十三、课设一第9题

题意:输入n(n<=100)个整数,按照绝对值从大到小排序后输出。

解题思路:首先,要按照数的绝对值的大小进行判断,所以要用到关于绝对值的编程语言和头文件,运用冒泡排序将每个数的绝对值两两比较,再交换位置,从大到小排好序,最后在输出就可以了。

解题细节是如何处理的:绝对值的表示和头文件不能忘记写,该题用到了冒泡排序,要知道思路和方法。

源码

#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题

题意:有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,将该数插入到序列中,并使新的序列仍然有序。

解题思路:首先,这n个整数已经由小到大顺序排好,首先考虑特殊的情况,如果要插入的这个数比这n个数都小的话是无法插入的,所以要先写明这一种情况;然后,假设插入的数比这n个数中的第i个位置小,比前一个位置的数大,所以先输出前i-1个数,再输出x,最后再输出后面的数。

解题细节是如何处理的:需要注意的是格式,什么时候换行,什么时候不换行,还有空格什么时候输入,在最后才换行。

源码

#include<iostream>

#include<cstdio>

include<iomanip>

using namespace std;

int main()

{

int x,n,i,j,a[110];

while(cin>>n>>x&&(n||x)

for(i=0;i<n;i+)

{

cin>a[i];

    }

for(i=0;i<n;i++)

{

if(x<a[i])

break;

        for(j=0;j<i;j++)

        {

            cout<<a[j]<<" ";

        }

        cout<< x;

        for(j-I;j<n;j++)

        {

cout<" "<a[j];

        }

        cout<<endl;

    }

    return 0;

}

十五、课设一第7题

题意:在一个数组中,去掉一个最大的数和一个最小的数,剩下的数再求平均。

解题思路:用到了冒泡排序,找出这个数组中的最大值和最小值,然后剩下的数再求和,最后求平均值。

解题细节是如何处理的:找最大值和最小值的时候的编程语言要知道,两两进行比较并交换。

源码

#include<stdio.h>

int main (void)

{

    int n,i,j,t;

         int a[110];

         double m;

    while(scanf("%d",&n)!=EOF)

    {

        m=0;

        for(i=0;i<n;i++)

                   scanf("%d",&a[i]);

        for(i=0;i<=n-1;i++)

        {

                            for(j=i+1;j<n;j++)

                if(a[i]>a[j])

                                     {

                    t=a[i];a[i]=a[j];a[j]=t;

                }

        }

        for(i=1;i<n-1;i++)

            m+=a[i];

        printf("%.21f\n",m/(n-2));

    }

    return 0;

}

感想:

首先,要对做题的系统有所了解,比如这个系统是测试多组数据的,而不是一组数据,所以要用到while语句循环;然后,有题型一样的题目,比如第8、18、19题,都是找规律的题,但有些细节还是不一样的,要全面考虑;还有就是要能透过现象看本质,有的题题目说的比较复杂,但实质就是考的那些知识点,我们要能够看出来;还有的题格式要求比较严,这就要求我们格式要写对,什么时候换行什么时候不换行要知道;还有几个题涉及到了冒泡排序,所以基本的编程语言要清楚并能熟练应用;有的题目用到了绝对值,所以要在头文件有定义;考察字符串的题目,大都是判断是否是回文串,所以在脑子里要有大体的程序的样子,这样方便写,也节省时间。

总之,只有在你多做题的前提下才会记住更多的题型和解题方法,所以,努力的道路还很远呢,加油吧,只要你不停下前进的脚步。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值