大數相加的另外一種思路
1;這個思路是我一學長告訴我的,然而我因為有個語法知識沒用好導致初始化0(數字零)沒成功,後來還是學長幫我敲完的,原來那個歸零要轉化為int型別的陣列來完成的,這項工作。看來我需要去問問度娘
memset函式的使用了。
memset函式的使用,原型為void *memset(void *buffer, int c, int count)
buffer:為指標或是陣列,
c:是賦給buffer的值,
count:是buffer的長度.
對字串使用,使用該函式來初始化,此時的0是空零』\0』
對int陣列使用,則這裡的0就是數字0了;
不說閒話了,先介紹一下這個思路。
2;我之前的部落格就說過以字串輸入,那麼高位就是陣列前面的數,因此我們的運算都是從後面開始往前面進行運算的,然而這種方法就是從前面開始運算的,當然那必須還要一項工作就是反向也就將字串掉
頭,這裡可以用乙個strrev就輕鬆完成了,
strrev的使用情況,
標頭檔案是#include
功能:把字串s的所有字元的順序顛倒過來(不包括空字元null);
說明:返回指向顛倒順序後的字串指標。
我當時就出錯,我一直以為要用乙個指標去接收這個掉頭了的位址,後面就要用到指標所以始終報錯,然而是我沒記清,其實這個函式沒有必要去用新的去接收它,它其實就是原字串的位址,也就說strrev(a);之後我們再繼續使用a,這個a字串就是已經顛倒了的;
返回指向顛倒順序後的字串指標。這個指標表示的也就是原來的位址;
#include
#include
int main()
, *aa;
printf("%p\n",a);
printf("%s\n",a);
aa = strrev(a);
printf("%p\n",aa);
printf("%s\n",a);
return
0;}
輸出的兩個位址值是相同的。很好的解釋了上面。
這些問題都解決了,再對這種方法就好敲多了。感覺都可以直接擺**了,在**裡面去理解了。
先看一下我那個出來bug的**吧,隨後就擺出我學長打的**;
//輸入兩個正的大數,輸出前乙個加後乙個的結果;
這個是出了問題的**;
#include
#include
int main()
; char a[1004]=,b[1004]=;
scanf("%d",&n);
while(n--)
jws = 0;
for(i = 0; i < max; i++)
else jws = 0;
bj[i] = mwh;
// printf("%d\n",bj[i]);
}if(jws == 1)
for(i--; i != -1; i--)
printf("\n");
}return
0 ;}
接下來的才是我學長打的**;他用的是c++;並且我也寫了一點注釋;
#include
#include
#include
using
namespace
std;
int n;
int maxi(int aaa,int bbb)
int main()
for(int i=strlen(b)-1;i>=0;i--)
int maxn=maxi(re,rel);
for(int i=0;i//相加,後面單獨來同一進製;
for(int i=0;i1;i++)//統一來進製 ;
}printf("%d",cc[maxn-1]);
for(int i=maxn-2;i>=0;i--)
大數相乘 大數相加
大數相乘 大數相乘 1 include includeint main int ans i while lb 0 int cnt j for i 0 i 0 i if e i break 去除前面多餘的0 if i 1 else 當結果是0的時候 printf 0 printf n return 0...
list 相加 大數相加
演算法流程 1 大數可能超出任何一種整數型別,會引發溢位問題,所以用字串的格式儲存字串a,b 2 獲取字串a的長度為alen,字串b的長度為blen 3 比較alen和blen的大小,用maxlen儲存更大值。4 建立陣列aarr,大小為maxlen,儲存字串a每一位上的值 5 建立陣列barr,大...
大數相加(JAVA)
類似於acm1003,當兩個數特別大的時候,比如數百位長,這個時間沒法用int,long等基本資料型別來表示,這個時候我們要把它轉化為字串相加,具體實現如下 static void aplusb stringbuilder s1,stringbuilder s2 for int i l1 l2 1 ...