『ACM C++』 PTA 天梯賽練習集L1 | 007-0011

来源:https://www.cnblogs.com/winniy/archive/2019/03/06/10486995.html
-Advertisement-
Play Games

真的是忙頭暈了,學業、ACM打題、班級活動、自學新東西,哇這充實的大學~ L1-007 念數字 輸入一個整數,輸出每個數字對應的拼音。當整數為負數時,先輸出fu字。十個數字對應的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ...


  真的是忙頭暈了,學業、ACM打題、班級活動、自學新東西,哇這充實的大學~

 

------------------------------------------------L1-007----------------------------------------------------------

念數字

輸入一個整數,輸出每個數字對應的拼音。當整數為負數時,先輸出fu字。十個數字對應的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu

輸入格式:

輸入在一行中給出一個整數,如:1234

提示:整數包括負數、零和正數。

輸出格式:

在一行中輸出這個整數對應的拼音,每個數字的拼音之間用空格分開,行末沒有最後的空格。如 yi er san si

輸入樣例:

-600

輸出樣例:

fu liu ling ling

------------------------------------------------L1-007----------------------------------------------------------

註:水題,熟練使用字元指針數組就沒有問題了。如這裡的:const char* proun[10] = { "ling", "yi", "er", "san","si","wu","liu","qi","ba","jiu" };

#include<stdio.h>
#include<string.h>
#include<string>
using namespace std;
const char* proun[10] = { "ling", "yi", "er", "san","si","wu","liu","qi","ba","jiu" };
char Input[999999];
int length;
int main()
{
    scanf("%s",&Input);
    length = strlen(Input);
    for(int i = 0;i<length;i++)
    {
        if(Input[i] == '-') printf("fu");
        else printf(proun[Input[i] - '0']);
        if(i!=length-1) printf(" ");
        else printf("\n");
    }
    return 0;
}

 

 

------------------------------------------------L1-008----------------------------------------------------------

求整數段和

給定兩個整數A和B,輸出從A到B的所有整數以及這些數的和。

輸入格式:

輸入在一行中給出2個整數A和B,其中100AB100,其間以空格分隔。

輸出格式:

首先順序輸出從A到B的所有整數,每5個數字占一行,每個數字占5個字元寬度,向右對齊。最後在一行中按Sum = X的格式輸出全部數字的和X

輸入樣例:

-3 8

輸出樣例:

   -3   -2   -1    0    1
    2    3    4    5    6
    7    8
Sum = 30

------------------------------------------------L1-008----------------------------------------------------------

註解:水題,一個迴圈帶過

#include<stdio.h>

int A,B,counter,sum;
int main()
{
    scanf("%d%d",&A,&B);
    counter = sum = 0;
    for(int i = A;i<=B;i++)
    {
        sum+=i;
        if(counter == 5)
        {
            counter = 0;
            printf("\n");
        }
        printf("%5d",i);
        counter++;
    }
    printf("\nSum = %d\n",sum);
    return 0;
}

 

 

 

------------------------------------------------L1-009----------------------------------------------------------

N個數求和

本題的要求很簡單,就是求N個數字的和。麻煩的是,這些數字是以有理數分子/分母的形式給出的,你輸出的和也必須是有理數的形式。

輸入格式:

輸入第一行給出一個正整數N≤100)。隨後一行按格式a1/b1 a2/b2 ...給出N個有理數。題目保證所有分子和分母都在長整型範圍內。另外,負數的符號一定出現在分子前面。

輸出格式:

輸出上述數字和的最簡形式 —— 即將結果寫成整數部分 分數部分,其中分數部分寫成分子/分母,要求分子小於分母,且它們沒有公因數。如果結果的整數部分為0,則只輸出分數部分。

輸入樣例1:

5
2/5 4/15 1/30 -2/60 8/3

輸出樣例1:

3 1/3

輸入樣例2:

2
4/3 2/3

輸出樣例2:

 2

輸入樣例3:

3
1/3 -1/6 1/8

輸出樣例3:

7/24

------------------------------------------------L1-009----------------------------------------------------------

註解:這題我居然WA了好一會,出現了兩個問題,一個是疊乘超出long long int的問題,一個就是出現了/0的情況。下麵進行分析:

· 代碼分塊:

  第一步:先套用獲取最小公倍數的模板:

long long gcd(long long m, long long n)
{
    return (m==0)?n:gcd(n%m, m);
}
long long lcm(long long a, long long b)
{
   return a / gcd(a, b) * b;
}

  第二步:得到化簡功能函數!!

void hj(long long int &a,long long int &b)
{ 
    long long int m,n,p;
    m=a;n=b;p=m%n;
    while(p!=0)
    {
        m=n;n=p;
        p=m%n;
    }
    if(n!=0) //化為最簡分式
    {
        a/=n;
        b/=n;
    }
    if(b<0) //處理分母為複數
    {
        a=-a;
        b=-b;
    }
}

  第三步:輸入的同時進行通分、加和,最重要的是一定要記得時刻化簡!!原本有一個test3測試點瘋狂的出錯,我看到了不超過長整形,所以用了long long int,但是突然想到,如何是加和乘積,是極有可能爆long long int的,所以要時刻進行化簡,就過了。

    for(int i = 1;i<times;i++)
    {
        scanf("%lld/%lld",&temp_up,&temp_down);
        long long int temp = lcm(temp_sumdown,temp_down);
        if(temp_sumdown<temp) temp_sumup*=(temp/temp_sumdown);
        if(temp_down<temp) temp_up*=(temp/temp_down);
        temp_sumdown = temp;
        temp_sumup+=temp_up;
        hj(temp_sumup,temp_sumdown);
    }

  第四步:分子包含了符號,也就說,對於分子為正的數,進行整數化處理:

    for(int i = 1;i<times;i++)
    {
        scanf("%lld/%lld",&temp_up,&temp_down);
        long long int temp = lcm(temp_sumdown,temp_down);
        if(temp_sumdown<temp) temp_sumup*=(temp/temp_sumdown);
        if(temp_down<temp) temp_up*=(temp/temp_down);
        temp_sumdown = temp;
        temp_sumup+=temp_up;
        hj(temp_sumup,temp_sumdown);
    }

  第五步:對輸入0進行單獨處理,這裡是我之前沒想到的事情,一直test5出錯,加了下麵這句話之後就過了。

else if(temp_sumup == 0) printf("0\n");

  第六步:對分子為負數的情況進行符號處理:

    else
    {
        temp_sumup*=-1;
        long long int intt = temp_sumup/temp_sumdown;
        long long int up = temp_sumup - intt*temp_sumdown;
        long long int down = temp_sumdown; 
        hj(up,down);
        if(intt>0)
        {
            printf("-%lld",intt);
            if(up>0) printf(" -%lld/%lld\n",up,down);
            else printf("\n");
        }
        else printf("-%lld/%lld\n",temp_sumup,temp_sumdown);
    }

 

· AC代碼:

#include<stdio.h>
#include<math.h>
using namespace std;
long long int times,temp_up,temp_down;
long long int temp_sumup,temp_sumdown;
void hj(long long int &a,long long int &b)
{ 
    long long int m,n,p;
    m=a;n=b;p=m%n;
    while(p!=0)
    {
        m=n;n=p;
        p=m%n;
    }
    if(n!=0) //化為最簡分式
    {
        a/=n;
        b/=n;
    }
    if(b<0) //處理分母為複數
    {
        a=-a;
        b=-b;
    }
}
long long gcd(long long m, long long n)
{
    return (m==0)?n:gcd(n%m, m);
}
long long lcm(long long a, long long b)
{
   return a / gcd(a, b) * b;
}
int main()
{
    scanf("%lld",&times);
    scanf("%lld/%lld",&temp_sumup,&temp_sumdown);
    for(int i = 1;i<times;i++)
    {
        scanf("%lld/%lld",&temp_up,&temp_down);
        long long int temp = lcm(temp_sumdown,temp_down);
        if(temp_sumdown<temp) temp_sumup*=(temp/temp_sumdown);
        if(temp_down<temp) temp_up*=(temp/temp_down);
        temp_sumdown = temp;
        temp_sumup+=temp_up;
        hj(temp_sumup,temp_sumdown);
    }
    if(temp_sumup >0)
    {
        long long int intt = temp_sumup/temp_sumdown;
        long long int up = temp_sumup - intt*temp_sumdown;
        long long int down = temp_sumdown; 
        hj(up,down);
        if(intt>0)
        {
            printf("%lld",intt);
            if(up>0) printf(" %lld/%lld\n",up,down);
            else printf("\n");
        }
        else printf("%lld/%lld\n",temp_sumup,temp_sumdown);
    }
    else if(temp_sumup == 0) printf("0\n");
    else
    {
        temp_sumup*=-1;
        long long int intt = temp_sumup/temp_sumdown;
        long long int up = temp_sumup - intt*temp_sumdown;
        long long int down = temp_sumdown; 
        hj(up,down);
        if(intt>0)
        {
            printf("-%lld",intt);
            if(up>0) printf(" -%lld/%lld\n",up,down);
            else printf("\n");
        }
        else printf("-%lld/%lld\n",temp_sumup,temp_sumdown);
    }

    return 0;
}

 

 

·AC截圖:

 

· 解後反思:

  這裡提到了三個模板需要熟記於心,一個是化簡模板、一個是gcd、還有一個lcm模板,可能之後要經常用到~然後就是要時刻註意加減乘除四種運算是否會爆long long int的情況,以及對特殊情況的處理

 

------------------------------------------------L1-010----------------------------------------------------------

比較大小

本題要求將輸入的任意3個整數從小到大輸出。

輸入格式:

輸入在一行中給出3個整數,其間以空格分隔。

輸出格式:

在一行中將3個整數從小到大輸出,其間以“->”相連。

輸入樣例:

4 2 8

輸出樣例:

2->4->8

------------------------------------------------L1-010----------------------------------------------------------

註解:水題,一個sort即可解。

#include<stdio.h>
#include<algorithm>
using namespace std;
int temp[3];
int main()
{
    scanf("%d %d %d",&temp[0],&temp[1],&temp[2]);
    sort(temp,temp+3);
    printf("%d->%d->%d\n",temp[0],temp[1],temp[2]);
    return 0;
}

 

 

 

------------------------------------------------L1-011----------------------------------------------------------

A-B 

本題要求你計算AB。不過麻煩的是,A和B都是字元串 —— 即從字元串A中把字元串B所包含的字元全刪掉,剩下的字元組成的就是字元串AB。

輸入格式:

輸入在2行中先後給出字元串A和B。兩字元串的長度都不超過104​​,並且保證每個字元串都是由可見的ASCII碼和空白字元組成,最後以換行符結束。

輸出格式:

在一行中列印出AB的結果字元串。

輸入樣例:

I love GPLT!  It's a fun game!
aeiou

輸出樣例:

I lv GPLT!  It's  fn gm!

------------------------------------------------L1-011----------------------------------------------------------

註解:這道題我WA了好一會,總感覺思路很正確沒毛病,結果出錯在輸入的函數選擇上:

#include<iostream>
#include<cstring>
using namespace std;
string a,b;
bool vis[10005];
int main()
{
    getline(cin,a);
    getline(cin,b);
    for(int i=0;i<b.length();i++) vis[b[i]+5000]=1;
    for(int i=0;i<a.length();i++) if(vis[a[i]+5000] == 0) cout<<a[i];
    cout<<endl;
    return 0;
}

疑問:使用cin.getline對char數組輸入是會WA的,至今不知道為什麼,而使用getline(cin,string)對string類輸入卻能直接AC,希望有大神能夠留言幫我解決這個問題~ 萬分感謝。同時耶告訴我以後再這方面需要註意,對於空格和換行符的輸入的時候,多使用幾種輸入方法,可能就能通過AC了~

 

 

註:如果有更好的解法,真心希望您能夠評論留言貼上您的代碼呢~互相幫助互相鼓勵才能成長鴨~~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 開心一刻 本人幼教老師,冬天戴帽子進教室,被小朋友看到,這時候,有個小家伙對我說:老師你的帽子太醜,趕緊摘了吧。我逗他:那你好好學習,以後給老師買個漂亮的?這孩子想都沒想立刻回答:等我賺錢了,帶你去南韓整形 簡單示例 我們先來看一個純粹的mybatis示例(不集成spring等其他框架),代碼 ...
  • 經 @沈默 在上文 "Antlr4添加中文變數賦求值,括弧,各種問題" 評論中指出, 語法規則描述依賴於Antlr4生成的語法分析器的預設分析方法, 比如運算符的左聯繫, 以及優先順序處理等等. 於是將語法修改為下麵(源碼版本號: "program in chinese/quan5" ): 這樣做的結 ...
  • 中文編程 "知乎專欄" 原文 "地址" (前文 "通用型的中文編程語言探討之一: 高考" , 即使是這"第一步", 即使一切順利達到列出的功能恐怕也需要個人數年的業餘時間. 看到不少乎友都遠更有資本和實力更快速地完成這一工程. 希望隨時告知類似項目, 省得在下作無用功) 初步打算用Antlr4生成J ...
  • 中文編程 "知乎專欄" 原文 "地址" 基本參考https://pragprog.com/book/tpantlr2/the definitive antlr 4 reference 一書"Building a Calculator Using a Visitor"一節, 僅添加了數學乘除法符號的支 ...
  • 在可預見的未來, 高考仍是最重要的也最有社會影響力的人才選拔機制. 很久沒有關註, 最近得知高考自選科目中開始增加了編程一項(見 "如何評價2017浙江高考七選三科目中包含技術?" ). 雖然個人對編程是否應該進入高考仍有保留看法, 但至少全民(都應該可以)編程這一趨勢已經很明顯了. 這應該是中文編 ...
  • 筆者環境 centos7 python3 pytesseract只是tesseract-ocr的一種實現介面。所以要先安裝tesseract-ocr(大名鼎鼎的開源的OCR識別引擎)。 依賴安裝 安裝依賴的leptonica庫 安裝tesseract-ocr 安裝語言包: 安裝pytesseract ...
  • Maven 有一個生命周期,當你運行 mvn install 的時候被調用。這條命令告訴 Maven 執行一系列的有序的步驟,直到到達你指定的生命周期。遍歷生命周期旅途中的一個影響就是,Maven 運行了許多預設的插件目標,這些目標完成了像編譯和創建一個 JAR 文件這樣的工作。 一個jar包,會有 ...
  • 為什麼要談這個topic? 實踐中,質量保障體系的建設,主要針對兩個目標: 一是不斷提高目標業務測試覆蓋率,保障面向客戶的產品質量;二就是儘可能的提高人效,增強迭代效率。而構建全鏈路質量卡點就是整個體系建設的核心手段。筆者用下圖來描述這整個鏈路: 可以看到,雖然保障業務迭代的方向性正確排在最前面,但 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...