1. 程式人生 > >兩個超大整數相加(c++)

兩個超大整數相加(c++)

昨天面試有個題,時間太緊,來不及寫了,回家除錯一下:

函式原型 bool add(const char *A, const char *B, char * dest);

思路: 模擬人工加法的過程,先從末尾開始加。如果存在進位,則標記

#include <iostream>

using namespace std;

bool add(const char *A, const char *B, char * dest)
{
    if(NULL == A || NULL == B || NULL == dest)
 {
  return false;
 }
   
 int iLenA = strlen(A);
 int iLenB = strlen(B);

 const char *pBTail = (B+iLenB-1);
 const char *pATail = (A+iLenA-1);
 bool bIsNeed = false; //標記是否需要進位

 int iMaxLen = (iLenB>iLenA?iLenB:iLenA);
 
 char *ret = new char[iMaxLen+2];
 memset(ret,0,iMaxLen+2);
 const char *head = ret;
 
    for(;iLenA>=0||iLenB>=0;iLenA--,iLenB--,pBTail--,pATail--)
 {
 
  char c1 = *pATail;
  char c2 = *pBTail;

 // 如果位數不夠,則用'0'替換
  if(iLenA<=0)
  {
   c1 = '0';
  }
  if(iLenB<=0)
  {
   c2 = '0';
  }

        char temp = c1 + c2
           - '0' + (bIsNeed==true?1:0);
  if(temp > '9')
  {
   bIsNeed = true;
   temp -= 10;
  }
  if(iLenA<=0 && iLenB<=0 && temp == '0')
  {
   break;
  }
  *ret = temp;
  ret++;
 }

    //將字串反轉儲存
 int len = strlen(head);
 dest[len] = '\0';
 char *pTail = (dest + len - 1);
 while(*head != '\0')
 {
   *(pTail--)  = *(head++);
 }

 return  true;

}


void main()
{
  char *a = "99999999999999999999990";
  char *b = "11";
  char *c = new char[50];
  memset(c,0,10);
  add(a,b,c);

  cout<<c;
 
}

測試用例:

a  '9999999999990' ,b '11'

a  '0',b '1199999000'

a  '0',b '0'

a  '555555',b '555555'

a  '1',b '999999999999999999'

a  '9',b '9'

相關推薦

超大整數相加(c++)

昨天面試有個題,時間太緊,來不及寫了,回家除錯一下: 函式原型 bool add(const char *A, const char *B, char * dest); 思路: 模擬人工加法的過程,先從末尾開始加。如果存在進位,則標記 #include <iostre

超大整數相加

用字串處理數值運算 總體思想:按照小學算術運算計算,按位運算從陣列最高位,一個個的取出來相加(當然的先把單個字元轉換為整型),記住進位,迴圈計算 需要做的事情: (1)判斷輸入的字串是否為數字(特別要考慮小數點,如果做除法,被除數不能為0) (2)

超大相加演算法

#include <stdio.h> #include <string.h> #include <stdlib.h> /*********************

C++實現超大的字符數字相加的算法的代碼

numbers lead last let rst ace num cout -i 如下資料是關於C++實現兩個超大的字符數字相加的算法的代碼。 #include <iostream> #include <string> #include <s

C++實現超大的字元數字相加的演算法的程式碼

如下資料是關於C++實現兩個超大的字元數字相加的演算法的程式碼。 #include <iostream> #include <string> #include <stack> using namespace std; void deleteLeadingZeros(st

C語言例項—輸入整數m和n,求其最大公約數和最小公倍數(gcc 編譯)。

1.輾轉相除法 輾轉相除法是古希臘求兩個正整數的最大公約數的,也叫歐幾里德演算法,其方法是用較大的數除以較小的數,上面較小的除數和得出的餘數構成新的一對數,繼續做上面的除法,直到出現能夠整除的兩個數,其中較小的數(即除數)就是最大公約數。以求288和123的最大公約數為例,操作如下: 288÷1

C#連結串列相加求和

您將獲得兩個非空連結串列,表示兩個非負整數。 數字以相反的順序儲存,每個節點包含一個數字。 新增兩個數字並將其作為連結列表返回。 您可以假設這兩個數字不包含任何前導零,除了數字0本身。 Input: (2 -> 4 -> 3) + (5 -> 6 ->

C語言例子(3)之求整數的最大公約數及最小公倍數

# include <stdio.h> void main() { int x, y, num1, num2, temp; printf("請輸入兩個正整數:\n"); scanf("%d %d", &num1, &num2); if(num1 <

輸入整數m和n,求其最大公約數和最小公倍數 C/C++

題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 1.程式分析:利用輾除法。 2.程式原始碼: #include <stdio.h> int main() { int a,b,num1,num2,temp; printf("請輸入2個正整數:\

c語言:輸入整數m和n,求其最大公約數和最小公倍數

輸入兩個正整數m和n,求其最大公約數和最小公倍數。解:程式:#include <stdio.h>int main(){int num1, num2, t,p;printf("請輸入兩個正整數

c++)輸入整數m和n,求其最大公約數和最小公倍數。

#include<iostream> using namespace std; int main() {int m,n,i,j,a;cin>>m>>n;j=m*n;

C語言例項12——輸入整數m和n,求其最大公約數和最小公倍數。

題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 //程式分析:利用輾除法。 #include<stdio.h> int main(){ int a,b,num1,num2,te

C語言實現只用加法和減法實現整數的乘除運算

1、乘法a*b如下 #include<stdlib.h> #include<stdio.h> int main() { int a,b; int i,result=0; scanf("%d%d",a,b); for(

C語言計算整數的最大公約數與最大公倍數

先給出原始碼,下面解釋。 <span style="background-color: rgb(255, 255, 255);"><span style="font-size:18px;color:#ff0000;">#include <s

SDUT 3503 有整數,求N!的K進制的位數

pos class 進制 amp code cpp ref clu lan 有兩個正整數,求N!的K進制的位數 題目鏈接:action=showproblem&problemid=3503">http://sdutacm.org/sdutoj/prob

計算任意個位整數之間所能組成的奇數個數

lac .com logs onclick 判斷 document com 編寫 htm <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>&

整數的最大公約數和最小公倍數

公倍數 最大 sys static () 一個 AR ati scanner import java.util.Scanner;public class Gyb { public static void main(String[] args) {

Add Two Numbers 連結串列相加 python

描述: You are given two linked lists representing two non-negative numbers. The digits are stored in reverseorder and each of their nodes contain a si

Java中byte型別相加結果賦值給byte型別的變數會報編譯錯誤,byte加byte的結果為什麼是int?

背景: 之前偶然看到有討論這個問題,在網上搜了半天,結果都不盡如人意,解釋沒有到位, 有的說byte加byte預設就是int,那為什麼這麼做呢? 這不是找麻煩麼?這種奇怪的預設還有哪些?帶來一些列疑問。。。。。。 有的說byte儲存的就是整型資料,這種說法的對錯姑且不論,至少我覺得難免有

【面試題】Java 2(多)大整數相加如何實現

之前面試阿里的時候,第四面的時候面試官讓我當他面實現這個題目, 一開始的時候問的時候 2個相加如何實現,然後我寫完了之後又問我如果是多個相加呢?面試官希望我能在實現的時候能夠考慮到各種可能性,比如多個數相加,然後等我寫完了之後,又問我有沒有更好的實現方法;以下是我的實現方法; 將待相加