1樓:網友
就像樓上那位說的一樣,你的程式是比較難懂滴~~~
#include
#include
void maxx(char *a,char *b);
int main()
char a[101]=,b[101]=;
scanf("察羨%s%s",a,b);
maxx(a,b);
return 0;
void maxx(char *a,char *b)
int res[101][101],result[1000],alen,blen,k=0,sum=0,i,j;
alen=strlen(a);
blen=strlen(b);
for(i=0;i=0;i--)
for(j=blen-1;j>=0;j--)
sum=sum+res[i++]j]; 這裡的i++當i=alen-1的時候是必須越界的,所以程式一執行系統。
就報錯,而且也不是簡單的相加就可以求出正確結果的。
result[k++]sum;
for(i=k-1;i>0;i--)
result[i]=result[i]%10;
result[i-1]=result[i]/10+result[i];
for(i=0;iprintf("%d",result[i]);
printf("");
個人覺得你程式的思路有點問題可能需要改改!!
maybe 中間結果放在乙個int型陣列中會好處理點,字串型的我還想不到怎麼處理比較好,當然孝歲輸入、輸出肯定要放在字元陣列中的。
2樓:匿名使用者
看了下,還是不改了,實現看不懂是什麼。。。
不過有以下幾地方你可以思考下:
#include
#include
void maxx(char *a,char *b);
int main()
char a[101]=,b[101]=;
scanf("%s%s",a,b);
maxx(a,b);
return 0;
void maxx(char *a,char *b)
int res[101][101]=,result[1000]=;1)所有初始化為0
int alen,blen,k=0,sum=0,i,j;
alen=strlen(a);
blen=strlen(b);
for(i=0;i=0;i--)
for(j=blen-1;j>=0;j--)
sum=sum+res[i++]j]; 2) 這裡的 i++是什麼意思?
sum +=res[i][j]; 是不是這句?
result[k++]sum; /3)這個sum是否是孫派自己想要的,因為再次進來的時候沒喚森有清0 也就是說,當你算第二行的和時,也加上第一行了。
for(i=k-1;i>0;i--)4)這個for 又是什麼呢?實在看不懂。
result[i]=result[i]%10;
result[i-1]=result[i]/10+result[i]; 因為,這裡你可見你的下一sum值已經被覆蓋掉。
/也就是說,在這個 for 裡邊,你只則鏈賀對 result[k-1]這個數進行了操作。
for(i=0;iprintf("%d",result[i]);
printf("");
c語言的超大數相加和相乘間題
3樓:網友
可以用幾個int儲存,比如int a1儲存大數最低15位(第一位放著,防止進位溢位),int a2再儲存15位,以此類推然後每個int相加,每個int第16位為進位,加上下個int,這樣下來,然後去掉第16位,顯示就從最高位列印出來,再列印下一位,緊挨著一起就讓使用者看到了(這是我現想的,一開始知道大概的位元組數,不知道你聽的懂不,本人表達能力不是很好)
還可以用陣列。
先用malloc()函式分配下面兩個的空間byte a[n1]
byte b[n2]
如果n1>=n2
分配乙個這個空間。
byte c[n1];
如果n1分配乙個這個空間。
byte c[n2];
a,b為加數,c為和。
然後從後面開始相加,加到前面,加一次付給c[i]就行了,最後打出c,要乙個乙個打出,連在一起你也可以去搜尋下windows計算器的原始碼,我這個很麻煩,而且還有些細節要處理,呵呵。
4樓:凝凝
超大數相加我覺得最好是用嵌入式彙編寫。首先確定超大數要佔用多少個位元組,將其變成數串,然後按照我們小學學過的方式來做加法。乘法就改成加法做。
如12345678901234567890,23456789012345678901,兩個數相加,無論是整形,長整形變數都無法儲存這兩個數。就把他變成數字串。「12345678901234567890,23456789012345678901」,可以用陣列儲存各個位,a=「12345678901234567890」,b="23456789012345678901"
c[19]=changetoint(a[19])+changetoint(b[19]),如果有進位位,就改一下,c[19]=c[19]%10,carr=1.
5樓:網友
這是高精度的加法和乘法。
寫過加的 就是字串的處理。
你用#include
用string 變數(定義字串)
遍歷處理每乙個字元讓字元 -'0'就得到相應數字大小如 字元 '7' - '0' = 7 這個就是數字了定義乙個flag變數來標示是否加起來超10,超10加令flag=1,運算下一位時記得加上flag
乘法還在學呵呵、不過原理應該一樣的就是每個字元的處理。
c語言程式設計時為了解決大數相乘時的溢位問題採用大數相加代替的策略有效嗎?
6樓:月下憶嬌娘
有其他的方法啊。比如。
乙個數太大,分兩段ab
同理乙個數分成cd
ab * cd = ..就可以了。需要進位的話就分成三段。
大數相乘,**錯誤了,c語言高手幫忙看看
7樓:黑水浮雲
1樓看不懂,2樓知道什麼是大數麼,double也就佔4個位元組,精度不夠。
這邊是第乙個錯誤。
k=200;
while(c[k]==0) k--;
你開陣列是c[200],是從c[0]到c[199],也就是沒有c[200]這個位置。建議把c[200]改為c[205];
還有這個。while(c[i-1]==0)
i--;這邊是要開始進位加,也就是要改為,while(c[i]>0) i++;
8樓:網友
#include
#include
int main()
這樣就可以實現了!大數相乘。
9樓:杜茂彥
1)c[200] = ; 你確定能夠保證把所有c給清0麼?
2)k=200;
while(c[k]==0) //k已經超過c陣列範圍;
3)如果c內容全部是0,此時while(c[k]==0) 就不能結束了,或者k<0了。
while(c[i-1]==0) 也一樣。
我是學c語言的新手,求高手幫助我註釋一下計算大數相乘的程式。
10樓:網友
#include
#include//strlen()函式要用這個標頭檔案。
void mult(char a,char b,char s)flag=0;
char result[101];
alen=strlen(a);blen=strlen(b);
for (i=0;i=0;i--)這裡是用小學的時候擺豎式的方法加起來。
for (i=blen-2;i>=0;i--)if (sum!=0)//如果還有進位,再向前進一位。
for (i=0;i=0;i--)反轉一下。
s[i]=result[k-1-i];
s[k]='0';/加末尾的字元0
while(1)
int main()
11樓:汽車安全出行
可惜我也是新手,不然能幫到你。
大數相乘 快速演算法
12樓:網友
給你乙個吧。
速度還可以。
自己讀下**。
演算法複雜度為:o(longhta*longthb)longtha為乘數的位數。
longhtb為被乘數的位數。
#include
#include
#include
#define len 1000
void mult(char ,char ,char );
main()
void reverse(char a)
longth=i+j-1;
if(jw>0)
ans[longth++]=jw+'0';
ans[longth]='\0';
reverse(ans);}
13樓:網友
在長度不很大的情況下,ftt不能體現優勢,其實只要減少乘法除法應該可以得到相當好的演算法。不過大部情況下這些做法都比較複雜,其實簡單的查表可能更好。
做乙個0-9的乘法表結果m,每次計算時只要c[i +j] = m[ia[i]][ib[j]];就好。
進位也可以同理,0-99的進位表和餘數表就可以解決除法和模的問題,不過這不是關鍵。
14樓:炒飯
**的oj,怎麼沒聽過。
C語言指標,這兩種寫法為什麼錯
swap int pt,int pt int temp temp pt pt pt pt temp 因為第二種的指標temp沒有初始化是不對的。也就像樓陵帆上說的,它們只改位址的位置,不改變內容。可是,像掘餘我上面說的判汪滾。最後沒有初始化temp也是種錯誤。呵呵,好問題,也是一般書比較少講解的。答...
C語言,為什麼這個表示式出來是錯的
資料型別是錯誤的 printf 要求 後面的填充 資料域 的 資料型別,必須和資料域指定的型別一致。f 要求 的資料型別是 float。在微軟的編譯器上,其實是double 而 b c d 計算的結果 是 int 型別b c d 2.1 的計算結果是 double 型別解決方法是 printf d ...
C語言計算分段函式的值為什麼不對呢?
問題一,x和y都是雙精度型 double 數變數,用格式輸入和輸出時,要使用格式符 lf,否則會出錯,得不到正確的結果。你用的 d是整型。int 數的輸出輸入格式符。所以你必須把他們統一起來,方法一是 把scanf和printf兩個語句中的 d都換成 lf 方法二是 把前面定義語句double x,...