程序设计

1. 题意:输入一个百分制的成绩t,当t在90~100分之间输出A;在80~89分之间输出B;在70~79分之间输出C;在60~69分之间输出D;在0~59分之间输出E;若不在0~100分之间则输出:“Score is error!”。

细节:题目要求输入多组数据,需要用到while(scanf(“%d”,&n)!=EOF){}语句,输出时注意”Score”开头字母大写,最后换行输出。

源代码:

#include<cstdio>

#include<iostream>

#include<iomanip>

#include<cmath>

using namespace std;

int main()

{

  int t;

  while(cin>>t)

  {

  if(t>=0&&t<60)

  cout<<"E"<<endl;

  if(t>=60&&t<70)

  cout<<"D"<<endl;

  if(t>=70&&t<80)

  cout<<"C"<<endl;

  if(t>=80&&t<90)

  cout<<"B"<<endl;

  if(t>=90&&t<=100)

  cout<<"A"<<endl;

  if(t>100||t<0)

  cout<<"Score is error!"<<endl;

  }

  return 0;

}

2.水仙花数:是指一个三位数,他的各个数字的立方和等于他本身,例153=1^3+5^3+3^3.

题意:输出所有在给定范围(m,n)内的水仙花数且从小到大排序,若在此范围内不存在水仙花数,则输出“no”

解题思路:在给定的范围内分别用a,b,c代表该三位数的百位,十位和个位,然后看该三位数是否符合水仙花数,若符合则给所有水仙花数排序,若不符合则输出no。

细节:排序时记得若有x个水仙花数则输出x-1个空格,即:if(j<x-1) cout<<" "。

源代码:

#include<cstdio>

#include<iostream>

#include<iomanip>

#include<cmath>

using namespace std;

int main()

{

   int m,n;

   while(cin>>m>>n)

   {

   int x=0;

   int s[1000];

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

{

int a,b,c;

a=i/100;

b=i/10%10;

c=i%10;

if(i==a*a*a+b*b*b+c*c*c)

{

s[x]=i;

x++;

}

}

if(x==0) cout<<"no"<<endl;

else

{

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

{

cout<<s[j];

if(j<x-1) cout<<" ";

}

cout<<endl;

}

  }

return 0;

}

3. 题意:表达式为n^2+n+41,其中 n在(x,y)范围内取整数值,判断该表达式的值是否都为素数,若是,则输出"OK",否则,输出“Sorry”。

解题思路:运用flag作为判断的变量,当做标志,当表达式的值为素数时,flag=0,若不是素数,flag=1。判断是否为素数时,用表达式的值对比他小的且大于二的所有数求余,若余数为零,则说明不是素数,这是运用break使其跳到下一个循环中,若是素数,flag=0.

细节:当x=0,y=0时,表示输出结束,即if(x==0&&y==0)  break;

源代码:

#include<iostream>

#include<cstdio>

#include<iomanip>

#include<cmath>

using namespace std;

int main()

{

  int x,y,i,n,a[100],j;

  while(cin>>x>>y)

  {

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

  break;

  int flag=0;

  for(i=0,n=x;n<=y;i++,n++)

  {

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

  }

  for(i=0;i<y-x;i++)

  {

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

  {

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

  break;

  }

  if(a[i]>j||a[i]==1)

  {

  flag=1;

  break;

  }

  }

  if(flag==0)

  cout<<"OK"<<endl;

  else

  cout<<"Sorry"<<endl;

  }

  return 0; 

}             

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

解题思路:分组求和,把分母分为奇数和偶数,奇数时为正,偶数时为负,且分数不是整数,要定义为double型。

细节:最后输出时保留两位小数: printf("%.21f\n",s);

源代码:

#include<cstdio>

#include<iostream>

#include<iomanip>

#include<cmath>

using namespace std;

int main()

int m,a[1000],j,i;

cin>>m;

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

{

cin>>a[i];

}

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

{

double s=0;

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

{

if(j%2==1) s=s+(double)1/j;

if(j%2==0) s=s-(double)1/j;

}

printf("%.21f\n",s);

}

return 0;

5.题意:输入n个整数,其中有正有负,按照绝对值从大到小排序后输出。

解题思路:运用冒泡排序法:

int t,a[n+1];         //定义数组

for (int i=1; i<=n; ++i) cin>>a[i];       //输入n个数

for (int j=0; j<=n; j++) //冒泡法排序

for (int i=0; i<=n-1-j; i++)  //两两相比较           

if (a[i]<a[i+1])            //比较与交换

{

t=a[i]; 

a[i]=a[i+1];

a[i+1]=t;

}

细节:当n=0的时候,输出结束。绝对值的处理:fabs().

输出时要换行输出。

源代码:

#include<cstdio>

#include<iomanip>

#include<iostream>

#include<cmath>

using namespace std;

int main()

{

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

    while(cin>>n)

    {

        if(n==0)

        break;

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

            cin>>a[i];

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

        {

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

                {

                    if(fabs(a[i])<fabs(a[i+1]))

                    {

                        t=a[i];

                        a[i]=a[i+1];

                        a[i+1]=t;

                    }

                }

        }

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

                {

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

                }

                   cout<<a[n-1]<<endl;

 

 

 

    }

    return 0;

}

6.题意:把一个数x插入到从小到大排列好的n个整数中,使新的数列仍然有序。

解题思路:把m插入到数列中,若m小于他前面的数,则把m和他前面的数交换,即

if(a[i]>m)

{

    l=a[i];     //把a[i]赋值给l;

    a[i]=m;    //把m赋值给a[i];

    m=l;      //把l赋值给m;

}

这样m和他前面的数a[i]就换过来了。

细节:最后要换行输出;输入时输入多组数据。

源代码:

#include<cstdio>

#include<iostream>

#include<iomanip>

#include<cmath>

using namespace std;

int a[100];

int main()

{

   int n,m,i,l;

   while(cin>>n>>m)

   {

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

       break;

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

       {

           cin>>a[i];

       }

       a[n+1]=m;

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

       {

           if(a[i]>a[n+1])

           {

               l=a[i];

               a[i]=a[n+1];

               a[n+1]=l;

           }

       }

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

       {

           printf("%d",a[i]);

           if(i<n+1)

           printf(" ");

       }

       cout<<endl;

   }

   return 0;

}

7.题意:人民币共有100元,50元,10元,5元,2元,1元六种,,若知道每位老师的工资额(正整数),求最少需要多少张人民币才能在给每位老师发工资的时候不用找零。

解题思路:设每位老师的工资为a[i],用a[i]分别除以100、50、10、5、2、1得到x,即所用的人民币的数目,再用a[i]对100、50、10、5、2、1求余,得出来的值赋值给a[i],若a[i]小于100或50、10、5、2、1,求出的余数是他本身,直到a[i]等于或小于100或50、10、5、2、1。一次循环中所有的x的值累加后所得数为最少需要的人民币数。

细节:当n等于0时,输入结束,不作处理,最后换行输出。

源代码:

#include<cstdio>

#include<iostream>

#include<iomanip>

#include<cmath>

using namespace std;

int main()

{

    int n,i;

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

    {

        if(n==0)

        break;

        int a[100],x=0;

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

        {

            cin>>a[i];

            x+=a[i]/100;

            a[i]%=100;

            x+=a[i]/50;

            a[i]%=50;

            x+=a[i]/10;

            a[i]%=10;

            x+=a[i]/5;

            a[i]%=5;

            x+=a[i]/2;

            a[i]%=2;

            x+=a[i];

        }

        cout<<x<<endl;

    }

    return 0;

}

8.回文串:正读反读都一样的字符串,例如level等

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

解题思路:首先每次循环必须初始化,令c=0,strlen(a)表示字符串的长度,然后把字符数组a的内容倒序赋值给b,然后计算a,b中相等的个数,如果所有元素都相等则说明a中元素倒序排列后仍相等。

细节:定义字符串的头文件为#include<cstring>,最后要换行输出。

源代码:

#include<cstdio>

#include<iostream>

#include<iomanip>

#include<cmath>

#include<cstring>

using namespace std;

int main()

{

    int n;

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

    {

        int l,c,i;

        char a[1000],b[1000];

      while(n--)

      {

        c=0;

        scanf("%s",&a);

        l=strlen(a);

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

           {

             b[i]=a[l-1-i];

           }

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

           {

               if(b[i]==a[i])

               c++;

           }

          if(c==l)

          cout<<"yes"<<endl;

          else

          cout<<"no"<<endl;

 

      }

    }

return 0;

}

 

9.题意:A和B是两个时间, 都由3个整数组成,分别表示时分秒,例A为34 45 56,就表示A为34小时 45分钟 56秒,输入6个整数分别表示时间A和B所对应的时分秒,输出A+B(分和秒的取值范围在0~59)。

解题思路:首先输入六个整数,把A和B分别代表的时 分 秒对应想加,用a,b,c表示,若a,b,c大于60,例,c大于60,用c对60求余,余数就是A+B所对应的秒,再用c/60再加上b,若b也大于60,处理方式同上。

细节:最后换行输出,且注意最后输出的两个数之间用空格分开。

源代码:

#include<cstdio>

#include<iostream>

#include<iomanip>

#include<cmath>

using namespace std;

int main()

{

    int N,s,m,h,a,b,c,AH,AM,AS,BH,BM,BS;

    cin>>N;

    while(N--)

    {

       cin>>AH>>AM>>AS>>BH>>BM>>BS;

       a=AH+BH;

       b=AM+BM;

       c=AS+BS;

       s=c%60;

       m=(b+c/60)%60;

       h=(((c/60)+b)/60+a);

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

    }

    return 0;

}

10.A^B的含义是“A的B次方”

题意:输出A^B的最后三位表示的整数。

解题思路:首先循环初始化,令c=1,若想表示a^b,则让循环中的数在(1,b)范围内,再令c*=a,即可表示b个a相乘。如果最后c大于1000,令c对1000求余,即可得a^b的最后三位整数。

细节:注意当a=0,b=0时,输入结束,不做处理。,输入多组数据需要用到while(scanf(“%d”,&n)!=EOF){}语句

源代码:

#include<cstdio>

#include<iostream>

#include<iomanip>

#include<cmath>

using namespace std;

int main()

{

    int a,b,i;

    while(cin>>a>>b)

    {

        if(a==0&&b==0)

        break;

        int c=1;

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

        {

            c=c*a;

            if(c>1000)

            c=c%1000;

        }

    cout<<c<<endl;

    }

    return 0;

}

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

解题思路:由于一开始就站在第一级上,故上第一级需要0步,上第二级需要一种走法,上第三级需要两种走法,当级数大于等于四级的时候可找到规律:a[i]=a[i-1]+a[i-2]。

细节:输出换行,级数要小于M。

源代码:

#include<cstdio>

#include<iostream>

#include<iomanip>

#include<cmath>

using namespace std;

int main()

{

   int M,N,i,a[41];

   cin>>N;

   while(N--)

   {

       cin>>M;

       a[1]=0;

       a[2]=1;

       a[3]=2;

       for(i=4;i<=M;i++)

       {

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

       }

       printf("%d\n",a[M]);

   }

   return 0;

}

 

12.题意:220的所有真约数(即不是自身的约数)之和为:1+2+4+5+10+11+20+22+44+55+110=284。 而284的所有真约数为1、2、4、71、 142,加起来恰好为220。则称220和284为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。判断给定的两个数A和B是否是亲和数,如果A和B是亲和数的话输出YES,否则输出NO。

解题思路:用A对大于2小于A的所有整数求余,若余数为零,则该数是A的真约数,同理,求出B的所有真约数,若A的所有真约数之和等于B且B的所有真约数之和等于A,则A和B是亲和数。

细节:换行输出

源代码:

#include<stdio.h>

int main()

{

int n,a,b,i,j,w,s;

scanf("%d",&n);

while(n--)

{

scanf("%d%d",&a,&b);

w=0,s=0;

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

if(a%i==0)

w=w+a/i;

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

if(b%j==0)

s=s+b/j;

if(s==a&&w==b)

printf("YES\n");

else printf("NO\n");

}

return 0;

}

13.题意:手机号是一个11位长的数字串,而短号都是是 6+手机号的后5位,比如号码为13512345678的手机,对应的短号就是645678。输入11位手机号,求其短号。

解题思路:把11为手机号看做为一个整数,故可用该数对100000求余,得出余数,即后五位数,再加上600000,可得短号。

细节:输入11位手机号时,用longlongint定义,最后换行输出。

源代码:

#include<cstdio>

#include<iostream>

#include<iomanip>

#include<cmath>

using namespace std;

int main()

{

    int N;

    long long a;

    cin>>N;

    while(N--)

    {

       scanf("%lld",&a);

       printf("%lld\n",a%100000+600000);

    }

     return 0;

}

 

14.题意:有如下方程:Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, .... n).

若给出A0, An+1, 和 C1, C2, .....Cn.求A1 = ?

解题思路:由题意可知:

因为:Ai=(Ai-1+Ai+1)/2 - Ci, 

      A1=(A0  +A2  )/2 - C1;

      A2=(A1  +  A3)/2 - C2 , ...

=>    A1+A2 = (A0+A2+A1+A3)/2 - (C1+C2)

=>    A1+A2 =  A0+A3 - 2(C1+C2) 

同理可得:

      A1+A1 =  A0+A2 - 2(C1) 

      A1+A2 =  A0+A3 - 2(C1+C2)

      A1+A3 =  A0+A4 - 2(C1+C2+C3)

      A1+A4 =  A0+A5 - 2(C1+C2+C3+C4)

      ...

      A1+An = A0+An+1 - 2(C1+C2+...+Cn)

 左右求和得:

     (n+1)A1+(A2+A3+...+An) = nA0 +(A2+A3+...+An) + An+1 - 2(nC1+(n-1)C2+...+2Cn-1+Cn)

 

=>   (n+1)A1 = nA0 + An+1 - 2(nC1+(n-1)C2+...+2Cn-1+Cn)

 

=>   A1 = [nA0 + An+1 - 2(nC1+(n-1)C2+...+2Cn-1+Cn)]/(n+1)

 

 

细节:a0,an1,ci,sum都是双精度浮点数,注意用double定义,最后输出时保留两位小数。

源代码:

#include<cstdio>

#include<iostream>

#include<iomanip>

#include<cmath>

using namespace std;

int main()

{

    int n,i;

    double a0,an1,ci,sum;

    while(cin>>n)

    {

        scanf("%lf%lf",&a0,&an1);

        sum=0;

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

        {

            scanf("%lf",&ci);

            sum+=(n-i)*ci;

        }

        printf("%.2lf\n",(n*a0+an1-2*sum)/(n+1));

    }

    return 0;

}

15.题意:输入菜种(字串),数量(计量单位不论,一律为double型数)和单价(double型数,表示人民币元数),输出菜价。

解题思路:输入字符串,即菜种,输出菜价等于数量乘以单价。

细节:输出保留一位小数,换行输出。

源代码:

#include<cstdio>

#include<iostream>

#include<iomanip>

#include<cmath>

#include<string>

using namespace std;

int main()

{

    char c[100];

    double y,x,m=0;

    while(scanf("%s %lf %lf",&c[100],&y,&x)!=EOF)

    {

        m+=y*x;

    }

     printf("%.1lf\n",m);

     return 0;

 

 

}

 

总结:通过做这道题,我学到了很多东西,例如输入多组数据时,要用到while(scanf(“%d”,&n)!=EOF){}语句,还用到了许多排序方法,例如冒泡排序:

int t,a[n+1];         //定义数组

for (int i=1; i<=n; ++i) cin>>a[i];       //输入n个数

for (int j=0; j<=n; j++) //冒泡法排序

for (int i=0; i<=n-1-j; i++)  //两两相比较           

if (a[i]<a[i+1])            //比较与交换

{

t=a[i]; 

a[i]=a[i+1];

a[i+1]=t;

}

刚开始上课的时候听得懵懵懂懂,然后回去的时候看了好长时间的解析才弄懂一些最简单的问题,好在在费了好多时间后终于弄懂了技巧。最开始不管从做题的速度还是熟练程度上都是非常缺乏的,不过后来经过不断的做题,觉得有很大的提升。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值