1. 程式人生 > >十五題解題細節

十五題解題細節

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指定讀取位數。