程序设计实验报告

 

《c++程序设计》课程设计报告

 

 

 

班级:数学三班                学号:2018212794

 

报告人姓名:高樱洁 

 

实验地点: 东校区413机房

 

完成起止日期:2019.1.2—2019.1.4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Problem D

题目简介:判断区间内变量对应表达式的值是否全为素数。

思路:数据有多组,所以是多组输入;对于每个值都要进行相同的操作,即判断函数值是否为素数,所以自定义函数,以简化程序。

细节:判断全为素数时,可定义一个变量,比较变量与区间个数的大小;

      要输出的“OK”全为大写,为防止出错,可直接复制粘贴;

      注意换行;

      用while(cin>>x>>y,!(x==0&&y==0))控制数据输入及结束。

 

源代码:#include

#include

using namespace std;

int prime(int);

int main()

{

         int x,y,m;

         while(cin>>x>>y, !(x==0&&y==0))

         {

              int k=0;

              for(int i=x;i<=y;i++)

              {

                   m=i*i+i+41;

                   if(prime(m))

                       k++;

                  else

                  {

                       cout<<"Sorry"<

                       break;

                  }

              }

              if(k==y-x+1)

              cout<<"OK"<

          }

}  

int prime(int n)

{

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

       {

            if(n%i==0)

            return 0;

       }

       return 1;

}

 

Problem F

题目简介:求长为n的递增偶数序列,每m个数的平均值,最后的以实际个数求平均值。

思路:分别设置变量控制m个数及m个数的和

细节:记和变量及时清零;

      数据之间空格间隔,行末无空格。

源代码:

#include

using namespace std;

int a[100];

int main()

{

    int n,m,j;

    while(cin>>n>>m)

    {

        int k=0;

        for(int i=1;i<=n/m;i++)

        {

            int sum=0;

            if(k>0)

              cout<<" ";

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

            {

                k+=2;

                sum+=k;

            }

            cout<

        }

        if(n%m)

        {

            int sum=0;

            for(j=1;j<=n-n/m*m;j++)

            {

                k+=2;

                sum+=k;

            }

            cout<<" "<

        }

        cout<

    }

    return 0;

}

 

 

 

Problem H

题目简介:有一母牛每年生一头小母牛,小母牛第四年成为母牛,求n年时有多少牛。

思路: 先算一下前几年的母牛数,发现数排列起来为:1,2,3,5,8……,满足递推关系f(n)=f(n-1)+f(n-2),即斐波那契数列。

细节:不要忘记边界情况,把前几项单独列出。

 

源代码:

#include

using namespace std;

int main()

{

    int n;

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

    {

         int f1=1,f2=2,f3=3,f4;

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

         {

              f4=f3+f1;

              f1=f2;

              f2=f3;

              f3=f4;

         }

         if(n>1)

             cout<

         else

             cout<<"1"<

   }

   return 0;

}

 

 

 

 

 

Problem  K

题目简介:有100、50、10、5、2、1元六种纸币,问最少准备多少张可以都不用找零。

思路:工资一定,纸币面值越大,张数越少,所以对工资进行除运算与模运算

细节:注意求一元纸币时不能直接2取余,可以工资减去其它纸币总和;

      对所有老师工资进行处理,别忘记加和;

      每组数据都要对变量重新赋初值。

 

 

源代码:#include

using namespace std;

int a[110]={0};

int s[110];

int main()

{

    int n,x;

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

    {

        int k=0;

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

        {

            cin>>a[i];

            int b[7];

            b[1]=a[i]/100;

            b[2]=(a[i]%100)/50;

            b[3]=(a[i]%50)/10;

            b[4]=(a[i]%10)/5;

            b[5]=(a[i]%5)/2;

            b[6]=a[i]-b[1]*100-b[2]*50-b[3]*10-b[4]*5-b[5]*2;

            s[i]=b[1]+b[2]+b[3]+b[4]+b[5]+b[6];

            k+=s[i];

        }

        cout<

    }

    return 0;

}

 

 

 

Problem L

题目简介:判断回文串

思路:对字符串两头一块操作,判断对应位置字符是否相同

细节:循环条件i

      注意对字符串的读取与部分调用

 

源代码:

#include

#include

#include

using namespace std;

char s[100];

int main()

{

    int n,l;

    cin>>n;

    getchar();

    while(n--)

    {

        gets(s);

        l=strlen(s);

        int i=0,j=l-1;

        while(i

        {

            if(s[i]!=s[j])

              break;

            i++;

            j--;

        }

        if(i>=j)

          cout<<"yes"<

        else

          cout<<"no"<

    }

    return 0;

}

 

 

 

 

Problem N

题目简介:计算时间之和。

思路:时、分、秒对应相加,逢六十进一

细节:对于分和秒,最大为59,当大于等于六十时,对应前面一个单位要加一,本身要减六十;

      输出数据之间空格间隔,注意最后一个数据之后不能有空格。

 

源代码:

#include

using namespace std;

int ah[60];

int am[60];

int as[60];

int bh[60];

int bm[60];

int bs[60];

int ch[60];

int cm[60];

int cs[60];

int main()

{

    int n;

    cin>>n;

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

    {

        cin>>ah[i]>>am[i]>>as[i]>>bh[i]>>bm[i]>>bs[i];

        ch[i]=ah[i]+bh[i];

        cm[i]=am[i]+bm[i];

        cs[i]=as[i]+bs[i];

        if(cm[i]>59)

        {

            cm[i]=cm[i]-60;

            ch[i]++;

        }

        if(cs[i]>59)

        {

            cs[i]=cs[i]-60;

            cm[i]++;

        }

    }

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

       cout<

    return 0;

}

 

 

 

 

 

Problem P

题目简介:求A^B的后三位所表示的数

思路:A^B增长的快,当到达一定数时,数据溢出,可以拆分计算,后三位只与后三位有关,因此只需关注每次计算的后三位数即可,最后1000求余

细节:注意b==0时的情况,恒为一;

      拆分时,注意b为偶数、奇数的情况讨论。

 

源代码:#include

#include

int main()

{

       int a,b;

       while(scanf("%d%d",&a,&b)!=EOF,!(a==0&&b==0))

       {

             int c=1,m=0;

             while(b>1)

             {

                  if(a>1000)

                    a=a%1000;

                 if(b%2==1)

                 {

                      c*= a;

                      a=pow(a,2);

                      b=(b-1)/2;

                 }

                else

                {

                     c*=1;

                     a=pow(a,2);

                     b=b/2;

               }

               if(c>1000)

                   c=c%1000;

           }

           m=c*a%1000;

           if(b==0)

              m=1;

           printf("%d\n",m);

    }

    return 0;

}

 

 

 

Problem T

题目简介:龟兔赛跑,龟有电动车,分电动和脚蹬两种情况,兔匀速,判断龟能不能赢

思路:龟用最佳方案进军,所以每两个站点之间都采用最佳方案,将每个站点都作为终点考虑,求乌龟到每个站点时的最快速度。

细节:刚开始的时候车满电,不需要充电

 

源代码:

#include

using namespace std;

int main()

{

int l, n, c, t, vr, v1, v2,s;

double t1,time;

double a[1010];

while (cin>>l)

{

int p[110]={0};

cin>>n>>c>>t>>vr>>v1>>v2;

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

cin>>p[i];

p[n+1]=l;

a[0]=0;

t1=l*1.0/vr;

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

{

double min=1000000;

for(int j=0;j

{

s=p[i]-p[j];

if(c>=s)

time=s*1.0/v1;

else

time=c*1.0/v1+(s-c)*1.0 /v2;

if(j)

    time+=t;

if(min>a[j]+time)

min=a[j]+time;

}

a[i]=min;

}

if (a[n+1]>t1)

cout<<"Good job,rabbit!"<

else

cout<<"What a pity rabbit!"<

}

return 0;

}

 

 

 

 

Problem U

题目简介:手机短号为6加手机号后五位,输出手机短号

思路:直接对号码进行求余运算。

细节:注意若后五位的前几位有0存在时,若直接输出结果漏零。

源代码:

#include

using namespace std;

int main()

{

int n,a;

long long m;

cin>>n;

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

{

cin>>m;

a=m%100000;

if(a/10000!=0)

  cout<<"6"<

else if(a/1000!=0)

  cout<<"60"<

else if(a/100!=0)

  cout<<"600"<

else if(a/10!=0)

  cout<<"6000"<

else

  cout<<"60000"<

}

return 0;

}

 

 

 

 

Problrn W

题目简介:含62或4的数字是不吉利的,求区间中吉利的号码有多少。

思路:对车牌号不断进行除运算与模运算,判断是否含有4或62,由于进行该操作数次,所以自定义函数。 

细节:将一个大区间内所有号码提前判断,存入数组中,最后直接调用数组。

 

源代码:

#include

#include

using namespace std;

int num[1000000];

int judge(int x)

{

while(x)

{

if(x%10==4||x%100==62)

return 1;

x/=10;

}

return 0;

}

int main()

{

int n,m;

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

num[i]=judge(i);

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

{

        if(n==0&&m==0)

break;

int s=0;

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

if(num[i]==0)

s++;

cout<

}

return 0;

}

 

 

 

 

Problem A(2)

题目简介:每天吃掉的桃子是前一天剩下的一半多一个,到第n天准备吃时,只剩下一个,求第一天开始吃的时候一共有几个。

思路:每天吃的桃与前一天有关,知最后一天数目,可利用递推,从后往前倒推进行。

细节:递推函数中,循环条件是day!=1,而不是day!=0。

 

源代码:

#include

using namespace std;

int t(int);

int main()

{

    int n,s;

    while(cin>>n)

    {

        cout<

    }

    return 0;

}

int t(int day)

{

    int s=1;

    while(day!=1)

    {

        s=(s+1)*2;

        day--;

    }

    return s;

}

 

 

Problem B(2)

题目简介:一排两个座位,男女同坐,只有找到同伴的人可以去坐。

思路:从一部分开始,挨个查找匹配对象,已经找到的,不再考虑。

细节:计数变量在相应的区域定义,以免出错。

 

源代码:

#include

#include

#include

using namespace std;

int l[550][550];

int v[550];

int g[550];

int m;

int f(int);

int main()

{

int k,a,b,n;

while(cin>>k,k!=0)

{

cin>>n>>m;

int sum=0;

memset(l,0,sizeof(l));

memset(g,0,sizeof(g));

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

{

cin>>a>>b;

l[a][b]=1;

}

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

{

memset(v,0,sizeof(v));

if(f(i))

  sum++;

}

cout<

}

return 0;

}

int f(int x)

{

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

{

if(l[x][i]==1&&v[i]==0)

{

v[i]=1;

if(g[i]==0||f(g[i]))

{

g[i]=x;

return 1;

}

}

}

return 0;

}

 

 

 

 

Problem C(2)

题目简介:求两个点分别和原点的连线的夹角的大小。

思路:利用数学余弦公式cosα=(a^2+b^2-c^2)/2ab,再利用数学函数acos求出夹角。

细节:数据为实数,可能为负;

      定义常量pi。

 

源代码:

#include

#include

#include

#define pi 3.1415926

using namespace std;

int main()

{

    int t;

    double x1,y1,x2,y2;

    double a,b,c,coso,jiao;

    cin>>t;

    while(t--)

    {

        cin>>x1>>y1>>x2>>y2;

        a=sqrt(x1*x1+y1*y1);

        b=sqrt(x2*x2+y2*y2);

        c=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));

        coso=(a*a+b*b-c*c)/(2*a*b);

        jiao=acos(coso)*180/pi;

        printf("%.2lf\n",jiao);

    }

    return 0;

}

 

 

 

 

 

Problem D(2)

题目简介:一个整数能被另一个整数整除,求该数可能的后两位。

思路:后两位从00—99,利用循环将相应的数求出来,判断能否整除。

细节:注意后两位数为00——09时如何输出;

      行末没有空格。

 

源代码:

#include

using namespace std;

int main()

{

int a,b;

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

{

int k=0;

for(int i=00;i<100;i++)

{

if((a*100+i)%b==0)

{

if(k!=0)

       cout<<" ";

if((i==0)||(i/10)==0)

  cout<<"0"<

else

  cout<

k++;

}

}

cout<

}

return 0;

}

 

 

 

 

Problem F(2)

题目简介:sky数的十进制、十六进制、十二进制数表示的四位数字之和均为22,判断一个四位数是不是sky数。

思路:十进制转化为十六、十二进制的方法相同,自定义一个函数转化进制,并求各位数。

细节:输出字符串时,注意大小写。

 

源代码:

#include

using namespace std;

int f(int,int);

int main()

{

int n;

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

{

if(f(n,10)==f(n,12)&&f(n,10)==f(n,16))

cout<

else

    cout<

}

return 0 ;

}

int f(int n,int r)

{

int sum=0,s;

while(n!=0)

{

s=n%r;

n=n/r;

sum+=s;

}

return sum;

}

 

 

 

 

Problem H(2)

题目简介:知等腰三角形的高,用所给符号打印出空心三角形。

思路:利用数学,找出前n-1行字符所在位置特点,利用循环与条件语句打印,单独打印最后一行。

细节:行末无多余空格;

      每两个三角形之间相隔一行;

      最后一个三角形后无空行。

 

源代码:

#include

#include

#include

using namespace std;

int main()

{

char a;

int b,i,j,k=0;

while(cin>>a,a!='@')

{

++k;

getchar(); 

cin>>b;

getchar(); 

if(k>1)

  cout<

for(i=1;i

{

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

{

if(j==b-(i-1)||j==b+(i-1))

   cout<

else 

   cout<<" ";

    cout<

}

for(i=1;i<=2*b-1;i++)

  cout<

cout<

}

return 0;

}

 

 

 


学习程序设计总结
  学习程序设计有半年之久了,学习的过程中并不是那么的一帆风顺。我会因为AC一道题而手舞足蹈,也会因为做不出一道题而备受打击。做题的过程中经常粗心大意,因为一个小小的不注意就AC不了,让人咬牙切齿。比如今天考试,有一个地方应该为j--,因为手顺,写成j++,数据总是过不了,检查了半个小时左右,才看出来,费时又费力,考完试自己真的很懊恼。但在学习中,我也体验了很多快乐,AC带来的快乐,???。程序设计的学习,一定是要靠代码来铺就的。写代码,可以提升思维能力,提高解决问题的能力。希望我可以在这条路上坚持下去。

你可能感兴趣的:(阶段性学习总)