课程设计总结

第十九周课程设计总结

*1.第二题:

题意:输出所有在给定范围内(从m到n)的水仙花数,即满足如153=1^3+5^3+3^3关系的数,并输出。

解题思路:

先将该三位数的百位,十位,个位分别提取出来,然后判断百位十位个位各自三次方的加和是否与原来的三位数相等,若相等,则输出。

处理细节:

1.多组输入

2.输出之后应该换行,空格。

3.注意++s与s++并不相同,该部分不是在for循环内,应该特别注意。

#include<iostream>

#include<cstdio>

using namespace std;

int p[1000];//将数组定义在主函数的外面,就不用再初始化

int main()

{

    int b=0,c=0,d=0,m,n,s=0;

    while(cin>>m>>n)//多组输入

    {

        s=0;

        for(int a=m;a<=n;a++)

        {

            b=a/100;//百位

            c=a/10%10;//十位

            d=a%10;//个位

            if(a==b*b*b+c*c*c+d*d*d)//关系式

            p[++s]=a;//++s与s++不同,不可以混淆

        }

        if(s==0)//若不含有水仙花数

        cout<<"no"<<endl;

        else

        for(int i=1;i<=s;i++)

        {

            if (i==s)//数字与各个位数的三次方的乘积之和相等时输出

            cout<<p[i]<<endl;

            else 

            cout<<p[i]<<" ";

        }

    }

    return 0;

}

*2.二十一题:

题意:

假设所有的短号都是是 6+手机号的后5位

(即,输入一串手机号,输出6+后五位数字。)

解题思路:

已知手机号固定有十一位,所以只要将第七位到第十一位数字输出即可。

细节处理:

1.定义多组输入,关键在于将十一位数字的后五位提取出来,然后输出。

#include<iostream>

using namespace std;

int main ()

{

    int n,i;

    char a[12];//定义数组

    cin>>n;

    while(n--)//倒序

    {

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

        cin>>a[i];

        cout<<6;

        for(i=7;i<=11;i++)

        cout<<a[i];//将第七位至第十一位数字输出

        cout<<endl;

    }

    return 0;

}

 

*3.二十四题:

题意:求买菜所用的总钱数。等于求出每种菜的价钱后加和。

解题思路:数量乘单价相加求出买的菜的总价钱。因为价钱最小精确到角,所以保留一位小数。

细节处理:

1.注意所需头文件;

2.应用到了字符串来表示菜名;

3.本题要求精确到角,所以程序最后要将小数精确,用到了单位的换算。

#include<iostream>

#include<cstring>

#include<cmath>

#include<cstdio>

using namespace std;

int main ()

{

    double x,y,sum=0;

    string s;//字符串表示菜名

    while (cin>>s>>x>>y)

    {

        sum+=x*y;求单个的价钱,再相加

    }

    printf("%.1lf\n",(sum*10+0.5)/10);//四舍五入,单位换算,使精确度为角

    return 0;

}

 

*4.十九题:

题目:有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。

           

题意:找出蚂蚁所能通过的路线条数。

解题思路:只能向右行走,而不能向左行走,所以后面路线的条数与前面路线的条数是有关系的,即满足:a[i]=a[i-1]+a[i-2].

细节处理:

1.本题定义了long long,使用int并不能通过,是出现错误的主要地方;

2.首先要将第一步和第二部的路线数表示出来,因为后边需要用其来表示;

#include<iostream>

using namespace std;

int main()

{

    long long c[100],a,b;//定义数组,定义变量

    long long n,i,j=0;

    cin>>n;

    c[1]=1;//第一步所包含的路线条数

    c[2]=2;//第二部所包含的路线条数

    for(i=3;i<=50;i++)//从第三部开始,满足以下关系

    c[i]=c[i-1]+c[i-2];

    while(n--)

    {

        cin>>a>>b;

        j=b-a;

        cout<<c[j]<<endl;

    }

    return 0;

}

 

*5.第五题:

题意:设计程序求出多项式:1 - 1/2 + 1/3- 1/4 + 1/5 - 1/6 + ...的值。

解题思路:该多项式可以划分为两部分,第一部分是正值(1+ 1/3+ 1/5+……),即奇数项;第二部分是负值[-(1/2+ 1/4+……)],即偶数项。计算出各部分的加和之后再相减即可。

细节处理:

1.直接进行计算比较麻烦,将其拆成两部分比较容易计算。

2.保留两位小数。

程序算法如下:

#include<iostream>

#include<cstdio>

using namespace std;

int main()

{

    double m,n,i,s,sum,t,p,j;

    cin>>m;

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

    {

        cin>>n;

        s=0;t=0;

        for(p=1;p<=n;p+=2)//奇数项的加和

        {

            s+=1/p;

        }

        for(j=2;j<=n;j+=2)//偶数项的加和

        {

            t+=1/j;

        }

        sum=s-t;//输出各自的加和之后相减的结果

        printf("%.2lf\n",sum);//保留两位小数

    }

    return 0;

}

*6.第七题:

题意:每位选手的得分去掉一个最高分和一个最低分,然后计算平均得分;并保留两位小数。

解题思路:先定义出min和max,然后在循环过程中,找出比min小的值令min=该值,找出比max大的值,令max=该值。

细节处理:关键在于找出min和max的值

#include<stdio.h>

int main()

{

    int n,i;

    double sum,min,max;

    double a[110]={0};

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

    {

         sum=0;

         if(n<3||n>100)

         break;

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

          {

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

          sum+=a[i];

          }

            min=a[0];//定义出min,max

            max=a[0];

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

          {

              if(min>a[i])//找出比min小的数

            min=a[i];//将该数赋值给min

            if(max<a[i])//同上

            max=a[i];

         }

           sum-=min;//去掉最小值

           sum-=max;//去掉最大值,然后保留两位小数后输出结果

        printf("%.2lf\n",sum/(n-2));

    }

    return 0;

}

*7.第八题:

题目:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛? 

解题思路:第一头母牛从第二年开始每年生一头小母牛,找出其规律

细节处理:

#include<iostream>

using namespace std ;

int main()

{

    int n;

    while(cin>>n)

    {

        if(n==0)//没有小牛时的情况

        break;

        int a,b,c,d;//分别表示一岁二岁三岁四岁的母牛

        if(n<=4)//四年之内

        cout<<n<<endl;

        else//从第四年开始,第一头小牛开始生产

        {

            n=n-4;

            a=b=c=d=1;

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

            {

            d=c+d;//当年大母牛的数目为前一年c+d

            c=b;//母牛长一岁到了c

            b=a;//母牛长一岁到了b

            a=d;//长成的母牛和以前的母牛生出的小牛总数

            }

            cout<<a+b+c+d<<endl;

            }

            }

            return 0;

            }

*8.第十二题:

题意:判断一个字符串是不是回文串。

解题思路:判断字符串是不是对称的形式,所以从头从尾进行判断

细节处理:

1.需要定义字符串 头文件;

2.如下陌生语句:reverse(S.begin(),S.end());正序倒序一块开始判断是否相同

#include <iostream>

#include <string>//字符串

#include <algorithm>//排序

using namespace std;

int main ()

{

    int n;

    cin>>n;

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

    {

        string s;//输入该字符串

        cin>>s;

        string S=s;

        reverse(S.begin(),S.end());//进行判断

        if(S==s) cout<<"yes"<<endl;

        else cout<<"no"<<endl;

    }

    return 0;

}

*9.第十五题:

题意:A-B求两个集合的差,就是做集合的减法运算。即在A中减去两者相同元素,然后将剩余元素输出。

解题思路:先定义数组,然后分情况讨论,包括元素为零和不为零的情况

细节处理:

1.头文件的定义要注意

2.多组输入

3.a[i],b[i]的取值范围

4.需要进行排序处理

#include <iostream>

#include <algorithm>

#include <stdio.h>

using namespace std;

int main()

{

    int n,m,a[150],b[150],k=1,count;

    while(cin>>n>>m)

    {

        if(n==0&&m==0)//分情况讨论之n或m为零时

        break;

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

        cin>>a[i];

        for(int j=0;j<m;j++)

        cin>>b[j];

        sort(a,a+n);

        sort(b,b+m);

        count=0;//在输入之前进行初始化会更加精确

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

        {

            k=1;

            for(int j=0;j<m;j++)

            {

                if(a[i]==b[j])//找到A,B中相同的元素

                {

                k=0;

                count++;

                break;

            }

            }

            if(k==1)

            cout<<a[i]<<" ";

        }

        if(count==n)//结果为空集合时

        printf("NULL");

        cout<<endl;

    }

    return 0;

}

*10.第十七题:

题意:判断给定的两个数是否是亲和数,即判断这两个数其中一个数的真约数之和是否等于另一个数,反之亦然。

解题思路:分别求出两个数的真约数并加和,然后进行比较,比较是否相等,然后得出结果。

#include<iostream>

using namespace std;

int main()

{

    int n,a,b,i,j,s=0,t=0,k;

    while(cin>>n)

    {

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

    {   

        s=0;t=0;//将两个真约数的加和值初始化为零

        cin>>a>>b;

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

       {

        if(a%i==0)//找出第一个数的所有的真约数

        s+=i;//真约数加和

       }

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

       {

        if(b%j==0)//找出第二个数的所有的真约数

        t+=j;//真约数加和

       }

        if((s==b)&&(t==a))//当两数的所有真约数之和与另一个数都相等

        cout<<"YES"<<endl;

        else cout<<"NO"<<endl;

    }

   }

    return 0;

}

*11.第二十三题:

题意:找出不含有4和62的数,计算出个数并输出

解题思路:

#include<iostream>

bool hs(int x)//函数指针??

{

    while(x)

    {

        if(x%10==4||x%100==62)//求余处理

        {

            return true;

        }

        x/=10;

    }

    return false;

}

using namespace std;

int main()

{

    int n,m,i,s,num;

    while(cin>>m>>n,m!=0||n!=0)

    {

        num=0;

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

        {

            if(hs(i)==true)//如果含有不吉利数字

            num++;//累计个数

        }

        s=n-m+1-num;//不含不吉利数字的个数

        cout<<s<<endl;

    }

    return 0;

}

*12.第一题:

题意:第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。

解题思路:从第n天开始算起比较容易,因为n天的剩余个数是已知的,且满足后一天等于前一天的一半加一。

#include<iostream>

using namespace std;

int main()

{

    int i,n;

    int sum;

    while(cin>>n)

    {

        sum=1;//第n天的桃子个数

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

        sum=(sum+1)*2;//满足关系式,用于求出第一天时的桃子总个数

        cout<<sum<<endl;

    }

    return 0;

}

*13.第三题:

题意:在一个平面内有两个点,求两个点分别和原点的连线的夹角的大小。两个点不会在圆心出现。

解题思路:

#include<iostream>

#include<cstdio>

#include<cmath>

using namespace std;

int main()

{

    int n;

    double PI=3.1415926;//定义pai的值

    double x1,x2,y1,y2,a,b,c,s,g;

    cin>>n;

    while (n--)

    {

        cin>>x1>>y1>>x2>>y2;//输入顺序唯一,否则错

        a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));/*求出所求角所对应的边长*/

        b=sqrt(x1*x1+y1*y1);//一个临边长

        c=sqrt(x2*x2+y2*y2);//另一个临边长

        double g=(b*b+c*c-a*a)/(2*c*b);//运用余弦定理求出cos(g)

        s=acos(g);//arccos(g)求出角度值

        printf("%.2lf\n",s*180.00/PI);//角度换算保留两位小数

    }

}

*14.第五题:what???

题意:把一个偶数拆成两个不同素数的和,找出所有的拆法。输出其拆成不同素数的个数,每个结果占一行。

解题思路:

细节处理:

1.从2开始查找可以整除的数;

#include<iostream>

using namespace std;

int main()

{

    int n,i,j,s,a[10000];

    for(i=3;i<=10000;i++)

       a[i]=i;

    for(i=2;i<=10000;i++)

       for(j=2*i;j<=10000;j+=i)//???

         a[j]=0;

    while (cin>>n&&n)//必须加上“&&n”(?)

    {

        s=0;

        for(i=3;2*i<n;i++)//???

           if(a[i]+a[n-i]==n)

              s++;

           cout<<s<<endl;

    }

    return 0;

}

*15.第六题:

题意:一个数满足十进制数,十六进制数,十二进制数都是相等的数,称为sky数,要判断一个数是不是sky数。

解题思路:需要进行进制的换算,并判断三种进制下的值是不是相等。

细节处理:

1.运用进制的转换函数(?)

2.需要判断函数的不同进制下的值是否相同

#include<iostream>

using namespace std;

int f(int n,int r)//完整的进制转换调用函数,进行进制的换算

{

    int sum=0,i,s;

    for(i=1;n!=0;i++)

    {

        s=n%r;

        n=n/r;

        sum+=s;

    }

    return sum;

}

int main()//主函数

{

    int n;

    while(cin>>n&&n!=0)//当n不等于0时

    {

        if(f(n,10)==f(n,12)&&f(n,10)==f(n,16))//判断不同进制时的值是否相等

        cout<<n<<" "<<"is a Sky Number."<<endl;//相等或不相等时输出如下

        else

        cout<<n<<" "<<"is not a Sky Number."<<endl;

    }

    return 0;

}

总结:

1.在课程设计中遇到了很多没有用过的头文件以及算法,比如,进制转化,进制之间的比较;素数的应用也有很多。

2.在课程设计二中题目更多的运用到了数学知识,比如角度的计算和换算;递推算法用到了很多次,可以简化计算的步骤。在这些题目中,更多的用到了多组输入,使用while语句进行输入,同时while后面括号里的内容也很有讲究。

3.有很多的题目要注意的地方很多,有一点错误就会wrong;同时,通过这些题目,我还发现了很多没见过的算法,头文件,以及很多中输入方式,比如while(cin>>n&&n);while(cin>>&&n!=0||m!=0)等等。

4.素数的题目,约数的题目是出现最多的,应该重点掌握;递推的题目也有很多。

5.输入之前应该着重注意初始化,有一些是要在主函数之外进行定义,就会省去初始化的步骤减少错误的出现。另外,换行也是应该注意的地方。

6.有一些题目正向思维下很难计算出结果,比如猴子偷吃蟠桃的题目,但是采用逆向思维就会比较容易。所以,我们还应该注重思维的转化。例如:多项式求和的题目中,将式子分成两部分分别进行计算在求和会更加的容易。水仙花数的题目,看起来很简单,但是实际上却有很多的思维在里面,以至于出现很多的错误,一直wrong……

所以,理解很重要,应该先把题目弄清楚,理清思路再写程序,才不至于错误百出。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值