【演算法】 藍橋杯 高精度加法

来源:https://www.cnblogs.com/jessie99/archive/2020/02/27/12374563.html
-Advertisement-
Play Games

問題描述 輸入兩個整數a和b,輸出這兩個整數的和。a和b都不超過100位。 演算法描述 由於a和b都比較大,所以不能直接使用語言中的標準數據類型來存儲。對於這種問題,一般使用數組來處理。定義一個數組A,A[0]用於存儲a的個位,A[1]用於存儲a的十位,依此類推。同樣可以用一個數組B來存儲b。計算c  ...


問題描述 
  輸入兩個整數a和b,輸出這兩個整數的和。a和b都不超過100位。 

演算法描述

  由於a和b都比較大,所以不能直接使用語言中的標準數據類型來存儲。對於這種問題,一般使用數組來處理。定義一個數組A,A[0]用於存儲a的個位,A[1]用於存儲a的十位,依此類推。同樣可以用一個數組B來存儲b。計算c = a + b的時候,首先將A[0]與B[0]相加,如果有進位產生,則把進位(即和的十位數)存入r,把和的個位數存入C[0],即C[0]等於(A[0]+B[0])%10。然後計算A[1]與B[1]相加,這時還應將低位進上來的值r也加起來,即C[1]應該是A[1]、B[1]和r三個數的和.如果又有進位產生,則仍可將新的進位存入到r中,和的個位存到C[1]中。依此類推,即可求出C的所有位。

最後將C輸出即可。 

輸入格式 
  輸入包括兩行,第一行為一個非負整數a,第二行為一個非負整數b。兩個整數都不超過100位,兩數的最高位都不是0。

輸出格式 
  輸出一行,表示a + b的值。 

樣例輸入 
20100122201001221234567890 2010012220100122

樣例輸出 
20100122203011233454668012

 

本題目遇到的問題:

(1).對於輸入的格式沒有空格,是直接以字元串的形式輸入的,要怎麼樣記錄該字元串的長度呢

  最開始是用的scanf,但是沒有空格的話會被當做一個數字,而不是數組的形式

  改成%s之後不知道該如何記錄兩個數組的長度,因為strlen函數不適用與整數型的字元串,並且也不能用\n作為計數條件進行計算

  然後想到既然用strlen可以的話,為什麼不直接改成字元串數組呢,嗯。。就改成字元串數組:改了之後需要註意的是數組中的每個元素都要-'0'來獲取到真正的數值,不然就是ASCII碼

(2)對於計算的時候是兩個數組是從後面對齊相加的,那麼就需要從兩個數組的最後開始加

  我開始想的是把輸入的數組先翻轉一下從0開始加然後再翻轉

  但是在知道兩個數組長度的情況下就可以用for()從最後開始迴圈到最前面

(3)對於輸出的時候,因為把每個位數該是多少賦值給了C數組,並且也是從個位開始賦值給C中的下標為0的元素的,然後最開始給C數組用memset函數將數組初始化為0

  我們從C的最後面往前面找,找 到第一個不為0的數的時候就記錄下來下標,這樣就可以從n開始向前面輸出(並且在這裡不會導致3200000,這種沒辦法輸出,因為低位數是在前面,

  後面的是高位數,應 該從第一個不為0的高位數開始輸出)

具體的代碼:

#include<stdio.h>
#include<string.h>
#define MAX 110 
int main()
{
    char A[MAX];//因為整形計算不了字元串的長度,不滿足要求的輸入格式,所以改成字元型 
    char B[MAX];
    char C[MAX];
    int i;
    int j;
    int k=0;
    int r=0;
    int s;
    int n;
    int maxA,maxB; 
    //因為A和B已經輸入了所以不用全部賦值為0了 
    memset(C,0,sizeof(C));
    //先按照正常的順序存進去,再調換位置 
    scanf("%s%s",A,B);//兩個字元串數組可以一起存入 
    maxA=strlen(A);
    maxB=strlen(B); 
    //因為已經可以得出當前A和B的最後一位的位置,所以不用再反轉數組 
     
    //當前記錄的是位數都存在的時候,對應相加 
    for(i=maxA-1,j=maxB-1; i>=0&&j>=0; i--,j--)
    {
        s=(A[i]-'0')+(B[j]-'0')+r; 
        r=s/10;//進位 
        C[k]=s%10;//留在原位的數字 
        k++;
    }
    
    //當某一個長度大於另外一個長度的時候分類討論
    if(maxA>maxB)
    {
        for(;i>=0;i--)
        {
            s=A[i]-'0'+r;
            r=s/10;//進位 
            C[k]=s%10;
            k++;
        }
     }
     else if(maxA<maxB)
     {
         for(;j>=0;j--)
         {
             s=B[i]-'0'+r;
             r=s/10;//進位 
            C[k]=s%10;
            k++;
         }
      }
      else
      {
          C[k]=r;//如果是處在兩個都沒有到盡頭的時候,就是將最高位加了要進位的在前面加一位用需要進位的r進行保存 
          k++;
       } 
    //反著輸出,記錄第一個C中不為0的下標 
    for(i=MAX-1; i>=0; i--)
    {
        if(C[i]!=0)
        {
            break;
            n=i;
        }
     }
     for(j=i; j>=0; j--)
     {
         printf("%d",C[j]);
      } 
 } 
 

 


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

-Advertisement-
Play Games
更多相關文章
  • Java synchronized 關鍵字詳解 前置技能點 進程和線程的概念 線程創建方式 線程的狀態狀態轉換 線程安全的概念 synchronized 關鍵字的幾種用法 1. 修飾非靜態成員方法 2. 修飾靜態成員方法 3. 類鎖代碼塊 4. 對象鎖代碼塊 synchronized 修飾非靜態方法 ...
  • 前言 在我們平時自己寫線程的測試demo時,一般都是用new Thread的方式來創建線程。但是,我們知道創建線程對象,就會在記憶體中開闢空間,而線程中的任務執行完畢之後,就會銷毀。 單個線程的話還好,如果線程的併發數量上來之後,就會頻繁的創建和銷毀對象。這樣,勢必會消耗大量的系統資源,進而影響執行效 ...
  • 這篇文章主要介紹 ElasticSearch 的基本概念,學習文檔、索引、集群、節點、分片等概念,同時會將 ElasticSearch 和關係型資料庫做簡單的類比,還會簡單介紹 REST API 的使用用法。 ElasticSearch 術語 索引和文檔是偏向於邏輯上的概念,節點和分片更偏向於物理上 ...
  • 基於JSP+Servlet+bootstrap開發電影院購票系統:開發環境: Windows操作系統開發工具: MyEclipse+Jdk+Tomcat+Mysql資料庫 程式要求:電影院訂票系統 用戶信息管理:用戶註冊後,可修改個人信息、登錄密碼等 影片分類:對影片進行分類,按類型、國家區域分類, ...
  • 開發環境: Windows操作系統開發工具: Eclipse+Jdk+Tomcat+MYSQL資料庫運行效果圖 源碼及原文鏈接:https://javadao.xyz/forum.php?mod=viewthread&tid=53 ...
  • 關註公眾號:CoderBuff,回覆“redis”獲取《Redis5.x入門教程》完整版PDF。 《Redis5.x入門教程》目錄 "第一章 · 準備工作" "第二章 · 數據類型" "第三章 · ​命令" "第四章 ​· 配置" "第五章 · Java客戶端(上)" "第六章 · 事務" "第七章 ...
  • Java 多線程同步 synchronized 多線程的同步問題指的是多個線程同時修改一個數據的時候,可能導致的問題 多線程的問題,又叫 Concurrency 問題 步驟 1 : 演示同步問題 假設蓋倫有10000滴血,並且在基地里,同時又被對方多個英雄攻擊 就是有 多個線程在減少蓋倫的hp 同時 ...
  • 1 matlab概貌 MATLAB是MATrix LABoratory(矩陣實驗室)的縮寫,是一款由美國The MathWorks公司出品的商業數學軟體。matlab是一種用於演算法開發、數據可視化、數據分析以及數值計算的高級技術計算語言和互動式環境。除了矩陣運算、繪製函數/數據圖像等常用功能外,ma ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...