2017-06-19 43 views
-2

我解決了這個問題,首先計算兩個給定數字的長度,並將數字較少的數字(如果存在的話)對齊到一個新的數組中然後我想將每兩個對齊的元素(模數爲10)的總和保存到一個新的數組中,同時檢查這個數組是否與數字總和大於10--只是基本的總和。現在問題發生在添加兩個元素到aplusb整數,我試圖用寫入來修復它作爲字符數組添加兩個數字[1,10^10000] - C

int aplusb = (lengthA[max-i]-'0') +(temp[max-i]-'0'); 

但它不起作用。我被卡住了,我不知道該怎麼做。請幫忙。

整個代碼:

#include <stdio.h> 
#include <math.h> 

int main(){ 
    char a[10000]; 
    char b[10000]; 
    scanf("%s %s", &a, &b); 
    char sum[10000]; 
    int lengthA = 0; 
    int lengthB = 0; 

    int i = 0; 
    while(a[i]){ 
     i++; 
    } lengthA = i; 

    i = 0; 
    while(b[i]){ 
     i++; 
    } lengthB = i; 
    char temp[10000]; 

    int aplusb; 
    int carry = 0; 

    int max = lengthA; 
    int difference = abs(lengthA - lengthB); 
    if(lengthA>lengthB){ 
     for(i=0; i<lengthA; i++){ 
      temp[i+difference]=b[i]; 
     } 
     for(i=0; i<=max; i++){ 
      aplusb = lengthA[max-i]+temp[max-i]; //<-- this is the problematic line 
      if(carry = 1) aplusb++; 
      if(aplusb>9){ 
       carry = 1; 
       aplusb%=10; 
      } 
      sum[i]=aplusb; 
     } 
    } 

    for(i=0; i<=max; i++){ 
     printf("%c", sum[i]); 
    } 

    /* 
    if(lengthB>lengthA){ 
     max = lengthB; 
     for(i=0; i<lengthB; i++){ 
      temp[i+difference]=a[i]; 
     } 
    }*/ 

    return 0; 
} 
+0

'10^10000'是'10010'。一個'int'就足夠了。 – Olaf

+3

'if(carry = 1)'是賦值。更改爲'if(carry == 1)' –

+0

我的意思是10的權力10000 @Olaf – Vid

回答

0

否則操作和存儲關於非常大的數字是非常類似於其中x = 10 A0 + A1.10 + A2.10^2做的操作和存儲多項式,即... + an.10^n。

互聯網上有許多多項式庫,您可以從中找到靈感。所有對你很大數字的操作都可以用多項式來表示。這意味着通過使用基數2^8甚至基數2^63而不是基數10來內部存儲您的大數字,您將大大提高性能。

您還必須在操作後對係數進行歸一化處理,以保持係數爲正值。操作可能會導致負係數,這可以很容易地修復,因爲它與減法後借用非常類似,這意味着係數必須比基數大1bit。要轉換回基數10,需要爲v(你的值)求解r(你的結果),比如r(10)= v(2^63)。這隻有一個解決方案,如果您執行正係數規則。

[note]再想一想:畢竟,正係數的規則可能只是對於打印而言必要的。

例如:添加。 沒有內存錯誤檢查

int addPolys(signed char** result, int na, const signed char* a, int nb, const signed char* b) 
{ 
    int i, nr, nmin, carry, *r; 

    nr = max(na, nb) + 1; 
    nmin = min(na, nb); 

    r = malloc(sizeof(signed char) * (na + nb + 1)); 

    if (nb < na) 
    { 
    nr = nb; 
    } 

    for (i = 0; i < nmin; ++i) 
    { 
    r[i] = a[i] + b[i]; 
    } 
    for (; i < na; ++i) 
    { 
    r[i] = a[i]; 
    } 
    for (; i < nb; ++i) 
    { 
    r[i] = b[i]; 
    } 
    r[nr - 1] = 0; 
    // carry - should really be a proc of its own, unoptimized 
    carry = 0; 
    for (i = 0; i < nr; ++i) 
    { 
    r[i] += carry; 
    if (r[i] > 10) 
    { 
     carry = r[i]/10; 
     r[i] %= 10; 
    } 
    else if (r[i] < 0) 
    { 
     carry = (r[i]/10) - 1; 
     r[i] -= (carry * 10); 
    } 
    else 
     carry = 0; 
    } 

    // 'remove' leading zeroes 
    for (i = nr - 1; i > 0; --i) 
    { 
    if (r[i] != 0) break; 
    } 
    ++i; 

    *result = r; 
    if (i != nr) 
    {  
    *result = realloc(i * sizeof(signed char)); 
    } 
    return i; // return number of digits (0 being 1 digit long) 
} 
+0

感謝您的廣泛答覆,但我會先嚐試通過實施整數數組。我記住了+1位:)。 – Vid

+0

是的,使用base 10可能會更簡單。數學是相同的。 –

+0

我在一段時間後寫了一個多項式庫。不幸的是,它在C++中,但它定義了所有基本函數,如添加,乘法和除法多項式。 http://mroy.chez-alice.fr/polynomials/index.html –

0

該代碼與上萬個的數字現在的工作對於任意兩個正數:

#include <stdio.h> 
#include <math.h> 
#include <string.h> 

int main(){ 
    char chara[10000]; 
    char charb[10000]; 
    scanf("%s %s", &chara, &charb); 
    int lengthA = strlen(chara); 
    int lengthB = strlen(charb); 
    int max = lengthA; 
    if(lengthB>lengthA) max=lengthB; 
    int dif = abs(lengthA - lengthB); 

    //ustvari int tabele 
    int a[max]; 
    int b[max]; 
    int sum[max+1]; 

    // nastavi nule 
    int i; 
    for(i=0; i<max; i++){ 
     a[i] = 0; 
     b[i] = 0; 
     sum[i] = 0; 
    } sum[max] = 0; 

    //prekopiraj stevila iz char v int tabele &obrni vrstni red 

    for(i=0; i<lengthA; i++){ 
     a[i] = chara[lengthA-i-1]-'0'; 
    } 
    for(i=0; i<lengthB; i++){ 
     b[i] = charb[lengthB-i-1]-'0'; 
    } 

    int vsota; 
    int prenos = 0; 

    for(i=0; i<max; i++){ 
     vsota = a[i]+b[i] + prenos; 
     if(vsota>=10) prenos = 1; 
     else if (vsota<10) prenos = 0; 
     sum[i]=vsota%10; 
    } 

    if(prenos==1){ 
     sum[max] = 1; 
     for(i = max; i>=0; i--){ 
      printf("%d", sum[i]); 
     } 
    } else { 
     for(i = max-1; i>=0; i--){ 
      printf("%d", sum[i]); 
     } 
    } 
    return 0; 
} 
+0

詳細信息:「現在正在爲任何兩位數字爲1的正數開始工作」 - >關閉一位。 'chara [10000];'足以存儲9999個數字_string_。需要1個_null character_。 – chux

+0

簡化:不是'if(vsota> = 10)prenos = 1; else if(vsota <10)prenos = 0;總和[i] = vsota%10;',考慮'sum [i] = vsota%10; prenos = vsota/10;' – chux