十五题解题细节

1···简要题意:输入一个百分制的成绩T,并将其转化成对应的等级。
思路:根据题目要求分为六个区间,依次输入和输出
细节:注意到是多组数据需要用while(scanf("%d",&n)!=EOF)语句,(n>=90&&n<=100)而不是(90<=n<=100)还有就是”A”
源码 :   #include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        if(n>=90&&n<=100)
        cout<<"A"<<endl;
        if(n>=80&&n<90)
        cout<<"B"<<endl;
        if(n>=70&&n<80)
        cout<<"C"<<endl;
        if(n>=60&&n<70)
        cout<<"D"<<endl;
        if(n>=0&&n<60)
        cout<<"E"<<endl;
        if(n>=101||n<0)
        cout<<"Score is error!"<<endl;
    }
    return 0;
}
}2~~~简要题意:“水仙花数”是一个三位数,输入两个整数。还有就是水仙花的个数,如果在给定的区间内存在水仙花数,那么就需要从小到大排序;如果不存在水仙花数就输出no.
思路:据题目要求输入两个整数,水仙花数计数清零。计算水仙花数,判断他是水仙花数。在这个环境下,分析水仙花数的个数。
细节:s[1000]通常里面的数字要稍微取得大一点,注意到水仙花数是从m开始取得。并且别忘了输出空格以及乘号。
源码:#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个数据求所有奇数的乘积。输入多组数据,并且假定每组数据至少含有一个奇数。
   思路:输入n,输入多组数据,确定初值奇数。
   细节:初值为1,for循环中输入奇数。
   源码:#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
    int n,i;
    int a;
    while(cin>>n)
    {
        int b=1;
       for(i=1;i<=n;i++)
     {
         cin>>a;
         if(a%2!=0)
         b=b*a;
     }
         cout<<b<<endl;
    }
    return 0;   
}
4···简要题意:求多项式的和。
   思路:输入m组数据,前n项所以n分为奇数和偶数,输入i个数据j个数。
   细节:注意到for(int i=1;i<=m;i++)运用了两次。等号==而不是=。
   源码:#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
    int m,a[1000];
    cin>>m;
    for(int i=1;i<=m;i++)
      {
           cin>>a[i];
       }
       for(int i=1;i<=m;i++)
       {  
             double s=0;
       for(int 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("%.2lf\n",s);
    }
    return 0;
}
5····简要题意:输入两个正整数,且每隔一个整数输出其平均值,最后不足这个固定整数的数按其实际数求其平均值并且输出。
思路:输入两个整数,定义求和,赋初始值,间隔是在增加的,判断间隔与m之间的关系。输出各个平均值。
细节:注意到num==m以及num=0,i<n*2,
源码:#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<=2*n;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);
 }
}
6```简要题意:输入一个十进制的数,并把它转化为R进制输出。
   思路:分n大于零,n等于零,以及n小于零三种情况,并且弄清楚十进制转化成R进制一般是除以R.
   细节:别忘了对零以及负数的单独判断,负数先转化成正数。对于0则直接输出0。
   源码#include<stdio.h>
int main()
{
    long n;
    int a[1000],b,i,j,r;
    while (scanf("%ld%d",&n,&r)!=EOF)
    {
        i=0;
        if(n<0){n=-n;printf("-");}
        if(n==0) 
        printf("0");
        while(n>0)
        {
            b=n%r;
            a[i++]=b;
            n=n/r;
        }    
        i=i-1;
        for(j=i;j>=0;j--)
        {
          switch(a[j])
         {                
      case 10:printf("A");break;            
      case 11:printf("B");break;
      case 12:printf("C");break;
      case 13:printf("D");break;
      case 14:printf("E");break;
      case 15:printf("F");break;
      default :printf("%d",a[j]);
         }
       }    
    printf("\n");
    }
    return 0;
}:
7–简要题意:输入多组数据判断该组数据是否是回文串。
   思路:注意每次循环必须初始化,令c=0,strlen(a)表示字符串的长度,然后把字符数组a的内容倒序赋值给b,最后计算a,b中相等的个数,如果所有元素都相等则说明a中元素倒序排列后任相等。
   细节:定义字符串的头文件为#include<cstring>,最后要换行输出。
   源码:#include<stdio.h>
#include<string.h>
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
       int i,length,count;
       char a[1000],b[1000];
       while(n--)
       {
        count=0;
        scanf("%s",a);
        length=strlen(a);
        for(i=0;i<length;i++)
            b[i]=a[length-1-i];
        for(i=0;i<length;i++)
          if (b[i]==a[i])
           count++;
          if(count==length)
           printf("yes\n");
           else printf("no\n");
       }
    }
      return 0;
}
8-简要题意:猴子在接下来的每一天都吃该天内总桃子数的一半加一个,并且在第n天时还剩一个桃子。
  思路:用逆推的思维既下一天的桃子数加一乘以二是前一天所剩的桃子数。:
  细节:注意考虑到当n小于1并且n大于30时的情况。
  源码:#include <stdio.h>  
int main()
{
    int n,sum=1,i;
    while( scanf("%d",&n)!=EOF)
    {
        if( n<=1 || n>=30 )
            break;
        else
        {
            sum=1;
            for( i=n; i>1; i-- )
            {
                sum = (sum+1)*2;
            }
        }
        printf("%d\n",sum);
    }
}
9-简要题意:输入若干组数据,每组数据包含两个整数,其中一个整数的末尾两位是未知的,但是该整数可以被另一个整数除尽。输出末尾的两数。
 思路:先输入输出特殊的情况,
 细节:if((c+i)%b==0)
 源码:#include<stdio.h>
main()
{
      int a,b,j,i,k,c,s[100];
     while(scanf("%d%d",&a,&b)!=EOF)
     { 
       if(a==0&&b==0)
        break;                            
      j=0;
      c=a*100;
      for(i=0;i<100;i++)
         if((c+i)%b==0)
         {
           s[j]=i;
           j++;
          }
         for(k=0;k<j-1;k++)
         printf("%.2d ",s[k]);
         printf("%.2d\n",s[k]);
     } 
      return 0;
      }
10-简要题意:输入一些数值不超过10000,个数不超过50的正数,把一个偶数拆成两个不同的素数之和。输出拆法的个数。
   思路:输入n,定义i,j
   细节:if(a[i]+a[n–i]=n)
   源码:#include<stdio.h>
int main()
{
    int a[10000],n,i,j,m;
    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(scanf("%d",&n)!=EOF&&n)
        {
            m=0;
            for(i=3;2*i<n;i++)
            if(a[i]+a[n-i]==n)
                    ++m;
            printf("%d\n",m);
        }
}
11-简要题意:输入m行数据,每行数据包含两个整数。判断输入的数是否为亲和数。
   思路:输入m以及两个整数,根据题意描述判断两个数是否为亲和数。
   细节:定义sum(a)
           if(sum(a)==b)
   源码:#include<stdio.h>
int sum(int number)
{
    int i;
    int sum=0;
    for(i=1;i<number;i++)
    {
        if(number%i==0)
            sum=sum+i;
    }
    return sum;
}
 
int main()
{
    int i,a,b,n;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d%d",&a,&b);
        sum(a);
        if(sum(a)==b)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
12-简要题意:输入多组包括菜种、单价和数量这三方面的数据,输出精度为1的所需支付花费的金额。
   思路:根据题意定义数据,运用多组输入和数学计算求出值并输出。
   细节:定义菜种但不计算,定义初始支付金额为0。
   源码:#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
    string c;
    double a,b,sum;
    sum=0;
    while(cin>>c>>a>>b)
    {
        sum+=(a*b);
    }
    printf("%.1lf\n",sum);
    return 0;
}
13-简要题意:输入一个长为11位的手机号码,把他转化成一个以6开头的短号码输出。
   思路:按要求输入多组数据,定义字符,数据。
   细节:scanf("%s",m)
        printf("6%s\n",m+6)
   源码:#include<stdio.h>
int main()
{
    int n;
    int i;
    char m[12];
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",m);
        printf("6%s\n",m+6);
 
    }
    return 0;
}
14-简要题意:把一个数x插入到从小到大排列好的n个整数中,使新的数列仍然有序。
   思路:把m插入到数列中,若m小于它前面的数,则把m和它前面的数交换。既if(a[i]>m)   {l=a[i];  a[i]=m;  m=l}
   细节:最后要换行输出,输入时输入多组数据。
   源码:#include <stdio.h>
int main()
{
    int n, x, a[100], i, j;
    while(scanf("%d%d",&n,&x)&&(n||x))
    {
        for(i=0;i<n;i++)
        scanf("%d",&a[i]);
        for(i=0;i<n;i++)
        {
            if(x<a[i])
            break;
        }
        for(j=0;j<i;j++)
        printf("%d ",a[j]);
        printf("%d",x);
        for(j=i;j<n;j++)
        printf(" %d",a[j]);
        printf("\n");
    }
    return 0;
 
}

15-简要题意:有一个m阶的楼梯,刚开始在第一级,若每次只能跨一级或两级,要走上第m级,求共有多少种方法。
   思路:由于一开始就站在第一级上,故上第一级需要0步,上第二级需要一种走法,上第三级需要两种方法,当级数大于等于四级的时候可找到规律:a[i]=a[i–1]+a[i–2].
   细节:输出换行,级数要小于M.
   源码:#include<stdio.h> 
int main() 

    int N=0,M=0,i=0,sum=0,a[41]={0}; 
    scanf("%d",&N);
    a[1]=1; 
    a[2]=1;
    for(i=3;i<=40;i++) 
    a[i]=a[i-1]+a[i-2];
    while(N--) 
    { 
        scanf("%d",&M);
        printf("%d\n",a[M]);
    } 
    return 1; 
}

收获总结:
1、输入多组数据while(cin>>n)
2、断层求解找准范围,一般输入较大一点的数据范围。求解百位、十位以及个位的数是最后用求余的方法可能会更好。
3、数的几次方可以转化为几个数的相乘,而且不要忘了乘号不能省略。
4、要注意赋初值的情况,还有要讨论奇偶性的问题。
5、一般有特殊的情况的可以先考虑输入输出。
6、scanf()函数中,可用%md指定读取位数。

猜你喜欢

转载自blog.csdn.net/qq_43240327/article/details/85854942