1. 程式人生 > 其它 >期末複習pta題解2

期末複習pta題解2

技術標籤:筆記c語言

後一部分來啦

目錄

時間換算

7-6 時間換算 (20分)
本題要求編寫程式,以hh:mm:ss的格式輸出某給定時間再過n秒後的時間值(超過23:59:59就從0點開始計時)。
輸入格式:
輸入在第一行中以hh:mm:ss的格式給出起始時間,第二行給出整秒數n(<60)。
輸出格式:
輸出在一行中給出hh:mm:ss格式的結果時間。
輸入樣例:
11:59:40
30
輸出樣例:

12:00:10

注意一下是24小時制 所以如果h>24時對24取餘

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int main()
{
   int h,m,s;
   int n,sum;
   scanf("%02d:%02d:%02d",&h,&m,&s);
   cin>>n;
   sum=h*3600+m*60+s+n;
   int nh=sum/3600;
   int nm=sum/60%60;
   int ns=sum%60;
   if
(nh>=24) nh%=24; printf("%02d:%02d:%02d",nh,nm,ns); }

字串逆序

7-7 字串逆序 (20分)
輸入一個字串,對該字串進行逆序,輸出逆序後的字串。
輸入格式:
輸入在一行中給出一個不超過80個字元長度的、以回車結束的非空字串。
輸出格式:
在一行中輸出逆序後的字串。
輸入樣例:
Hello World!
輸出樣例:
!dlroW olleH

#include<stdio.h>
#include<string.h>
int main()
{
    char s[100];
    gets(s)
; int len=strlen(s); for(int i=len-1;i>=0;i--) { printf("%c",s[i]); } }

求一元二次方程的根

7-19 求一元二次方程的根 (20分)
求一元二次方程ax2+bx+c=0的根。
輸入格式:
輸入三個用空格隔開的實數a、b、c,分別表示一元二次方程的係數,並保證a不為0。
輸出格式:
在一行中輸出方程的實根,每個根佔寬度15,保留5位小數,右對齊,如果有兩個相同的實根,只需要輸出一個數,如果有兩個不同的實根,按從小到大的順序輸出;如果沒有實根,請輸出字串“No Answer”。
輸入樣例:
2 3 -6
輸出樣例:
-2.63746 1.13746

題目沒什麼難度 記住求根公式 注意輸出格式

#include <iostream>
#include<cmath>
#include<bits/stdc++.h>
using namespace std;
int main()
{
   double a,b,c;
   double n,x1,x2;
   cin>>a>>b>>c;
   n=b*b-4*a*c;
   double x=sqrt(n);
   if(n<0)printf("No Answer");
   else if(n==0)
   {
       x1=(-b+x)/(2*a);
       printf("%15.5f",x1);
   }
   else if(n>0)
   {
       x1=(-b-x)/(2*a);
       x2=(-b+x)/(2*a);
       printf("%15.5f%15.5f",x1,x2);
   }
}

倒立的楊輝三角形

7-22 倒立的楊輝三角形 (20分)
楊輝三角描述如下圖所示:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
請你輸出一個倒立的楊輝三角形
輸入格式:
輸入只包含一個正整數n(0< n < 40),表示將要輸出的倒立楊輝三角層數。
輸出格式:
輸出相應層數的倒立楊輝三角,每一層的整數之間用一個空格隔開。
輸入樣例:
5
輸出樣例:
1 4 6 4 1
1 3 3 1
1 2 1
1 1
1

可以參考一下正立的楊輝三角的寫法 重點是這個規律和輸出格式

#include <iostream>
#include<cmath>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
   int n,i,j;
   cin>>n;
   ll a[50][50]={0};
   for(i=0;i<n;i++)
   {
       a[i][0]=1;
   }
   for(i=0;i<n;i++)
   {
       a[i][n-i-1]=1;
   }
   for(i=n-1;i>=0;i--)
   {
       for(j=1;j<=n-i;j++)
       {
           a[i][j]=a[i+1][j-1]+a[i+1][j];//由關係可推出每個數由其正下方和左下方的數相加得出
       }
   }
   for(i=0;i<n;i++)
   {
     for(j=0;j<n-i;j++)
     {
       cout<<a[i][j];
       if(j!=n-1-i)cout<<" ";//注意空格輸出的條件
      }
   if(i!=n-1)
   printf("\n");
   }
}

4.14-迴圈顯示指定位數的數字

7-36 4.14-迴圈顯示指定位數的數字 (20分)
編寫一段程式, 像下面這樣根據輸入的整數, 迴圈顯示1234567890,顯示的位數和輸入的整數值相同。
-----出自【明解C語言】練習4-14.
請輸入一個整數:25
1234567890123456789012345
請輸入一個整數:-25
注:輸入負數或0,則什麼也不輸出。
輸入樣例:
25
輸出樣例:
請輸入一個整數:1234567890123456789012345

運用迴圈進行輸出 注意輸出的格式

#include <stdio.h>
int main()
{
        int i,j,n;
        j=1;
        printf("請輸入一個整數:");
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            printf("%d",j);
            j++;
            if(j>9)
            j-=10;
        }
        printf("\n");
        return 0;
}

【迴圈】【–圖形列印A–】

7-37 【迴圈】【–圖形列印A–】 (20分)
輸入一個數字 d 以及一個正整數n , 然後使用給定數字d作為基本有元素列印2n-1行的圖形,圖形第一行1個d,第二行2個,第三行3個。。。以此類推;然後從第n+1行開始,每一行比上一行少一個,直到第2n-1行只有一個d。相見樣例。
輸入格式:
輸入一個數字 d 以及一個正整數 n 。d只會是0~9中的某個數 , 1<=n<=100
輸出格式:
按照要求輸出圖形。
輸入樣例1:
在這裡給出一組輸入。例如:
0 5
輸出樣例1:
在這裡給出相應的輸出。例如:
0
00
000
0000
00000
0000
000
00
0
輸入樣例2:
在這裡給出一組輸入。例如:
7 7
輸出樣例2:
在這裡給出相應的輸出。例如:
7
77
777
7777
77777
777777
7777777
777777
77777
7777
777
77
7

圖形列印題 外層迴圈控制行數 內層迴圈進行每行的輸出

#include<stdio.h>
int main()
{
	int i,j,d,n;
	scanf("%d %d",&d,&n);
	for(i=1;i<=n;i++)//列印上層
    {
        for(j=1;j<=i;j++)
        {
            printf("%d",d);
        }
        printf("\n");
    }
    for(i=n-1;i>0;i--)//列印下層
    {
        for(j=1;j<=i;j++)
        {
            printf("%d",d);
        }
        printf("\n");
    }
   return 0;
}

逢7擊掌

7-44 逢7擊掌 (20分)
一群人圍坐成一圈玩報數的遊戲。遊戲規則是:
從1開始報數,若遇到7的倍數或者個位為7的數則擊掌代替,若犯錯則要受罰。
可是這些人都太聰明瞭,竟然沒人犯錯!請問同樣聰明的你,當報數到 n 時,總擊掌次數 c 是多少?
輸入格式
n
輸出格式
c
輸入樣例
21
輸出樣例
4

其實就是1~n之間遇到7的倍數和位數為7的數c要加1
但是由於時間限制會被卡 我們通過自己記錄可知 每70個數會有16個數滿足題目要求

#include <stdio.h>
int main()
{
   int i,n,c=0,count;
   scanf("%d",&n);
   count=n/70;
   n%=70;
   for(i=1;i<=n;i++)
   {
       if (i%7==0||i%10==7)
           c++;
   }
   c=c+count*16;
   printf("%d\n",c);
   return 0;
}

判斷題

7-45 判斷題 (20分)
判斷題的評判很簡單,本題就要求你寫個簡單的程式幫助老師判題並統計學生們判斷題的得分。
輸入格式:
輸入在第一行給出兩個不超過 100 的正整數 N 和 M,分別是學生人數和判斷題數量。第二行給出 M 個不超過 5 的正整數,是每道題的滿分值。第三行給出每道題對應的正確答案,0 代表“非”,1 代表“是”。隨後 N 行,每行給出一個學生的解答。數字間均以空格分隔。
輸出格式:
按照輸入的順序輸出每個學生的得分,每個分數佔一行。
輸入樣例:
3 6
2 1 3 3 4 5
0 0 1 0 1 1
0 1 1 0 0 1
1 0 1 0 1 0
1 1 0 0 1 1
輸出樣例:
13
11
12

讀懂題目要求 即每個同學判斷題如果跟答案相同的話就加上這個題的權重即可

#include <stdio.h>
int main()
{

    int n, m;
    scanf("%d %d",&n,&m);
    int w[m];
    for (int i = 0; i < m; i++)
    scanf("%d",&w[i]);
    int t[m];
    for (int i = 0; i < m; i++)
    scanf("%d",&t[i]);
    int s[m];
    for (int i = 0; i < n; i++)
    {
        int ans= 0;
        for (int j = 0; j < m; j++)
        {
            scanf("%d",&s[j]);
            if(s[j]==t[j])
            {
                ans+=w[j];
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

前天是哪天

7-46 前天是哪天 (20分)
本題目要求讀入年、月、日,然後判斷前天日期。
輸入格式:
在一行中輸入年、月、日。(日期為有效日期)
輸出格式:
輸出前天日期,格式形如2020-10-16
輸入樣例:
2020 10 16
輸出樣例:
2020-10-14
輸入樣例:
2020 1 2
輸出樣例:
2019-12-31
輸入樣例:
2020 3 2
輸出樣例:
2020-2-29
輸入樣例:
2019 3 2
輸出樣例:
2019-2-28

注意一下閏年的情況 以及不同月份的情況

#include<bits/stdc++.h>
using namespace std;
int rn(int y)
{
    if((y%4==0&&y%100!=0)||y%400==0)
    return 1;
    else
    return 0;
}
int main()
{
    int y,m,d,day;
    int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int b[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
    scanf("%d %d %d",&y,&m,&d);
    if(d-2>0)
        printf("%d-%d-%d\n",y,m,d-2);
    if(d-2<=0)
    {
        if(m!=1)
        {
            if(rn(y)==1)
            day=b[m-1]+d-2;
            else
            day=a[m-1]+d-2;
            printf("%d-%d-%d\n",y,m-1,day);
        }
        else
        {
            m=12;
            printf("%d-%d-%d\n",y-1,m,a[12]+d-2);
        }
    }
}

發獎金

7-47 發獎金 (20分)
某企業年終按員工業績發獎金,已知獎金金額只有數百元。
請你編寫程式,幫助出納員用最少的紙幣發放足額的獎金。
已知紙幣面額為100元、50元、20元、10元、5元、2元和1元。
輸入格式
金額(以元為單位的整數)
輸出格式
按鈔票面額由大到小的順序輸出各種鈔票的張數(參見輸出樣例)
輸入樣例
582
輸出樣例
在這裡插入圖片描述

根據題意 要用最少的紙幣 所以先找大錢 可以用一個數組存方紙幣的面額

#include <stdio.h>
int main()
{
   int a[7] = {100,50,20,10,5,2,1},m,i,x,n;
   scanf("%d",&m);
	for(i=0;i<7;i++)
	{
		x=m/a[i];
		m=m%a[i];
		n=log10(a[i]*10);
		for (;n<3;n++)//控制空格的輸出
		 printf(" ");
      printf("%d元: %d張\n",a[i],x);
	}
}

集合減法

7-50 集合減法 (20分)
給定兩個非空集合A和B,集合的元素為30000以內的正整數,編寫程式求A-B。
輸入格式:
輸入為三行。第1行為兩個整數n和m,分別為集合A和B包含的元素個數,1≤n, m ≤10000。第2行表示集合A,為n個空格間隔的正整數,每個正整數不超過30000。第3行表示集合B,為m個空格間隔的正整數,每個正整數不超過30000。
輸出格式:
輸出為一行整數,表示A-B,每個整數後一個空格,各元素按遞增順序輸出。若A-B為空集,則輸出0,0後無空格。
輸入樣例:
5 5
1 2 3 4 5
3 4 5 6 7
輸出樣例:
1 2

不清楚A-B什麼意思的可以自行百度一下 知道意思就好寫了

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m,i,j,a[30001],b[30001],flag=1,p[300005]={0};
    scanf("%d %d",&n,&m);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        p[a[i]]++;
     }
    for(j=0;j<m;j++)
      {
         scanf("%d",&b[j]);
        if(p[b[j]]==1)//如果這個數在a b 中同時存在 接下來就不能輸出
           p[b[j]]--;
      }
    sort(a,a+n);//排序 從小到大
    for(i=0;i<n;i++)
     {
        if(p[a[i]]==1)
        {
            printf("%d ",a[i]);
            flag=0;
        }
     }
        if(flag==1)
        printf("0\n");
    return 0;
}

數列分段

7-56 數列分段 (20分)
給定一個整數數列,數列中連續相同的最長整數序列算成一段,問數列中共有多少段?
輸入格式:
輸入的第一行包含一個整數n,表示數列中整數的個數。 第二行包含n個整數 表示給定的數列,相鄰的整數之間用一個空格分隔。
輸出格式:
輸出一個整數,表示給定的數列有多個段。
輸入樣例:
8
8 8 8 0 12 12 8 0
輸出樣例:
5
樣例說明:
8 8 8是第一段,0是第二段,12 12是第三段,倒數第二個整數8是第四段,最後一個0是第五段。

根據題意可以清楚的知道一段數列是怎麼定義的

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int main()
{
    int n;
    int a[1005];
    cin>>n;
    for(int i=0;i<n;i++)
    cin>>a[i];
    int t=a[0];
    int cnt=1;
    for(int i=1;i<n;i++)
    {
        if(a[i]!=t)//如果不相同就證明是下一段數列
        {
            t=a[i];//更新
            cnt++;
        }
    }
    cout<<cnt;
}

顯示數字出現次數

7-57 顯示數字出現次數 (20分)
輸入一個十進位制正整數,轉換成16進位制數。再輸入一個數(0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f),統計這個數出現的次數。
輸入格式:
一行輸入十進位制正整數。 另一行輸入要統計的數。
輸出格式:
要統計的數出現的次數。
輸入樣例1:
在這裡給出一組輸入。例如:
84117512
8
輸出樣例1:
在這裡給出相應的輸出。例如:
3
輸入樣例2:
在這裡給出一組輸入。例如:
46883310
e
輸出樣例2:
在這裡給出相應的輸出。例如:
2

轉化為16進位制 儲存在陣列中 找到並記錄

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
char h[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
int main()
{
    char a[1005];
    int n;
    cin>>n;
    int i;
    char x;
    cin>>x;
    int j;
    for(j=0;n>0;j++)
    {
       i=n%16;
       a[j]=h[i];//轉化並存儲 變成16進位制
       n/=16;
    }
    int c=0;
    while(j>=0)
    {
      if(a[j]==x)
      {
          c++;
      }
      //cout<<a[j];
      j--;
    }
    cout<<c;
}

約分最簡分式

7-9 約分最簡分式 (25分)
分數可以表示為分子/分母的形式。編寫一個程式,要求使用者輸入一個分數,然後將其約分為最簡分式。最簡分式是指分子和分母不具有可以約分的成分了。如6/12可以被約分為1/2。當分子大於分母時,不需要表達為整數又分數的形式,即11/8還是11/8;而當分子分母相等時,仍然表達為1/1的分數形式。
輸入格式:
輸入在一行中給出一個分數,分子和分母中間以斜槓/分隔,如:12/34表示34分之12。分子和分母都是正整數(不包含0,如果不清楚正整數的定義的話)。
提示:在scanf的格式字串中加入/,讓scanf來處理這個斜槓。
輸出格式:
在一行中輸出這個分數對應的最簡分式,格式與輸入的相同,即採用分子/分母的形式表示分數。如 5/6表示6分之5。
輸入樣例:
66/120
輸出樣例:
11/20

跟分數相加差不多 由於要約分 所以要求最大公約數

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int gcd(int a,int b)
{
    if(a%b==0)return b;
    else return gcd(b,a%b);
}
int main()
{
	int a,b;
    scanf("%d/%d",&a,&b);
    int tf;
    tf=gcd(a,b);
    a=a/tf;
    b=b/tf;
    printf("%d/%d",a,b);
}