菜鳥記錄:c語言實現PAT甲級1005--Spell It Right

来源:https://www.cnblogs.com/whf10000010/archive/2023/04/27/17360701.html
-Advertisement-
Play Games

非常簡單的一題了,但還是交了兩三次,原因:對數組的理解不足;對數字和字元之間的轉換不夠敏感。這將在下文中細說。 Given a non-negative integer N, your task is to compute the sum of all the digits of N, and ou ...


 非常簡單的一題了,但還是交了兩三次,原因:對數組的理解不足;對數字和字元之間的轉換不夠敏感。這將在下文中細說。

Given a non-negative integer N, your task is to compute the sum of all the digits of N, and output every digit of the sum in English.

Input Specification:

Each input file contains one test case. Each case occupies one line which contains an N (10100).

Output Specification:

For each test case, output in one line the digits of the sum in English words. There must be one space between two consecutive words, but no extra space at the end of a line.

Sample Input:

12345
 

Sample Output:

one five

題目分析

  輸入一串數字,然後用英文表達所有數字相加和的每一位數字。

    輸入:10100以內的數字

    輸出:和的每位數字英文表達(eg:sum=256,output=two five six)

首先很明顯代碼是不會翻譯你的結果的,所有用一個數組來存儲表示每位數字的英文,其次,10100的數字不需要精準表示,因為這裡也就100個數字,不是10100個數字,開始我在這卡了半天,想著數字太大要精準存儲,特地翻了之前寫的c語言-大數階乘 - 1001010 - 博客園 (cnblogs.com)一文,後面發現不大行的通,審視一遍後發現了問題,最後輸出,要怎麼拆開數字和也是個問題。

個人想法

  首先,還是從變數入手

1 #define  MAX  100
2 int N,m;//輸入N,用於統計N的位數m
3 char lan[10][10] = { "zero","one","two","three","four","five","six","seven","eight","nine" };
4 int sum,a[MAX];//計算和sum,數組a用來記錄拆開的sum
5 char n[MAX];

  這裡開始是想N用來輸入數據,後面發現迴圈過程中因為不知道它的位數,所以往往遍歷要很多【補:而且N作為int變數放不了100位,double型的時候可以,但sum作為int不能讓N強轉,都作為double時就會很麻煩】,所以在錯了一次後採取了  char n[MAX];  的寫法,這樣有很多的妙處:

  1. 可以利用字元串來進行自動分割,即在輸入時不賦值在地址上(n的每位地址),scanf("%s", &n[i]); ❌  scanf("%s", &n);❌  scanf("%s", n);✔  c語言因為只接受字元,不支持string,寫成這樣就會自動把一串數字字元串分成單獨的數字字元並賦值在每個空間單位上。
  2. 迴圈遍歷時,不需要知道有幾位,因為每個字元是被附在每個單位空間上的,所以這個數組遍歷到空,即'\0'就可以停止。
  3. 由於得到的是字元的地址(數字自生的ACII值),所以在計算sum時,不用強轉,而是減去0的ACII值,這個差不僅是地址差也非常融洽的是數字之間的差。

  到這裡其實已經沒有什麼疑惑的點了,下麵直接上完整代碼。

 1 #include<stdio.h>
 2 
 3 #define  MAX  150
 4 int N,m;
 5 char n[MAX];
 6 char lan[10][10] = { "zero","one","two","three","four","five","six","seven","eight","nine" };
 7 int sum,a[MAX];
 8 int main() {
 9     scanf("%s", n);
10     for (int i = 0; n[i] != '\0'; i++) {
11         sum += n[i] - '0';
12     }
13     if (sum == 0){printf("zero");return 0;}//如果和等於0 ,那麼直接輸出“zero”就行。註意,這裡必須return終止,因為數組a[-1]也是0
14     for (int i = 0; sum; i++) {
15         a[i] = sum % 10;
16         sum /= 10;
17         m += 1;//m記錄sum的位數,但註意數組在使用時要減1,因為超範圍了
18     }//sum最後等於0時即完成所有位數的記錄,終止迴圈(非常巧妙) 
19     
20         printf("%s", lan[a[m - 1]]);
21         for(int i=m-2;i>=0;i--)
22             printf(" %s", lan[a[i]]);//老一套輸出格式,每一位的數字對於英語組記錄的每一位上的英文
23     
24     return 0;
25 }

 

總結

  • 數組的利用,例如本文對英語的存儲採用了二維數組,由於是char型,每單位只存放一個字元,所以lan[10][10]有10行10列,每列存放一個字元,一行存放10個字元。如果列數不足或是剛好,就會因為沒有讀到 '\0' 而出現連續輸出,如下。每列只有5個單位,故原本“seven”就該停止卻因為沒有 '\0' 而讀取到下一行“eight”一直到“nine”才停下。同樣還有上文提到的數組地址。 
  •  字元與數字的轉換。
  • 停止條件的巧妙使用,如這裡for迴圈採用sum=0停止的條件,是我個人之前沒看過的。

  

                                                                                                         

 


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

-Advertisement-
Play Games
更多相關文章
  • 當我們在編寫 TypeScript 代碼時,經常會遇到需要通用(Generic)的情況,這時候,泛型就是我們的好幫手了。在本篇文章中,我們將深入介紹 TypeScript 泛型的概念以及如何使用。 什麼是泛型? 在編程語言中,泛型指的是參數化類型的概念。也就是說,我們可以定義一個函數、介面或類等,能 ...
  • 大家好,我是DOM哥。我用 ChatGPT 開發了一個 Vue 的資源導航網站。不管你是資深 Vue 用戶,還是剛入門想學習 Vue 的小白,這個網站都能幫助到你。網站地址:https://dombro.site/vue#/vue ...
  • 在業務中,有這麼一種場景,表格下的某一列 ID 值,文本超長了,正常而言會是這樣: 通常,這種情況都需要超長省略溢出打點,那麼,就會變成這樣: 但是,這種展示有個缺點,3 個 ID 看上去就完全一致了,因此,PM 希望能夠實現頭部省略打點,尾部完全展示,那麼,最終希望的效果就會是這樣的: OK,很有 ...
  • CORS(跨來源資源共用)是一種用於解決跨域問題的方案。 CORS(跨來源資源共用)是一種安全機制,用於在瀏覽器和伺服器之間傳遞數據時,限制來自不同功能變數名稱的請求。在前端開發中,當通過 XMLHttpRequest(XHR)或 Fetch API 發送跨域請求時,如果伺服器沒有正確配置 CORS,瀏覽器 ...
  • 唯一不變的就是變化本身。 我們經常講的系統、子系統、模塊、組件、類、函數就是從邏輯上將軟體一步步分解為更細微的部分,即邏輯單元, 分而治之, 複雜問題拆解為若幹簡單問題, 逐個解決。 邏輯單元內部、外部的交互會產生依賴,從而產生了內聚、耦合概念。內聚主要描述邏輯單元內部,耦合主要描述邏輯單元之間的關 ...
  • 微服務架構是將單個服務拆分成一系列小服務,且這些小服務都擁有獨立的進程,彼此獨立,很好地解決了傳統單體應用的上述問題,但是在微服務架構下如何保證事務的一致性呢? ...
  • 通過小demo的方式跟大家分享一下我對DDD中戰術層級的理解,算是拋磚引玉,該理解僅代表我個人在現階段的一個理解,也可能未來隨著業務經驗深入,還會有不同的理解。 ...
  • 簡介 單例模式(Singleton Pattern)屬於創建型設計模式,這種模式只創建一個單一的類,保證一個類只有一個實例,並提供一個訪問該實例的全局節點。 當您想控制實例數目,節省系統資源,並不想混用的時候,可以使用單例模式。單例有很多種實現方式,主要分為懶漢和餓漢模式,同時要通過加鎖來避免線程安 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...