當前位置:首頁 » 編程語言 » 大整數加減法運算的c語言數組
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

大整數加減法運算的c語言數組

發布時間: 2023-03-28 00:33:52

『壹』 c語言中怎麼實現兩個超大整數的相加減乘除

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#define N 100

int main(int argc, char const *argv[])

{

char arr[N] = {};

gets(arr);

char brr[N] = {};

gets(brr);

int len1,len2,i = 0,j = 0;

len1 = strlen(arr);

len2 = strlen(brr);

int len = len1>len2?len1:len2;

/* c99之後數組初始化支持整型表達式,稱為可變長數組,但按照c89的標準是不對的

int num1[len]; //將字元串轉換成翻轉的整型數組

int num2[len];

*/

int* num1 = (int*)malloc(len*sizeof(int));

int* num2 = (int*)malloc(len*sizeof(int));

for (i = 0; i < len; i++)

{

num1[i] = i<len1 ? arr[len1-i-1]-'0':0;

}

for (j = 0; j < len; j++)

{

num2[j] = j<len2 ? brr[len2-j-1]-'0':0;

}

//int sum[len]; //定義和數組

int* sum = (int*)malloc(len*sizeof(int));

int flag=0; //設進位符

for (i = 0; i < len; i++)

{

sum[len-1-i] = (num1[i]+num2[i]+flag)%10;

flag = (num1[i]+num2[i]+flag)/10;

}

if (flag == 1) printf("1"); //如果最高位有進位 則輸出一個1

for (i = 0; i < len; i++)

{

printf("%d",sum[i]);

}

printf(" ");

free(num1);

free(num2);

free(sum);

num1 = NULL;

num2 = NULL;

sum = NULL;

return 0;

}

(1)大整數加減法運算的c語言數組擴展閱讀:

gets()函數用法

gets是從標准輸入設備讀字元串函數。

函數原型:char*gets(char*str);

功能為:從stdin流中讀取字元串,直至接受到換行符或EOF時停止,並將讀取的結果存放在buffer指針所指向的字元數組中。換行符不作為讀取串的內容,讀取的換行符被轉換為『\0』空字元,並由此來結束字元串。

注意:不會判斷上限,以回車結束讀取,所以程序員應該確保buffer的空間足夠大,以便在執行讀操作時不發生溢出。使用時需要包含stdio.h頭文件

參數

str為字元串指針,用來存放讀取到的數據。

返回值

讀入成功,返回與參數buffer相同的指針;讀入過程中遇到EOF(End-of-File)或發生錯誤,返回NULL指針。所以在遇到返回值為NULL的情況,要用ferror或feof函數檢查是發生錯誤還是遇到EOF。

『貳』 怎樣用C語言做超大整數的加減運算

用高精度演算法來實現,即用數組或指針來儲存數字,例如A〔20〕來儲存a ,用B〔20〕來儲存b,這樣a 和b就可以是很大的數,再用一個C〔21〕來儲存結果,為什麼C要21呢,你知道,加法是要近位的,呵呵。這里給出相加的偽代碼,d =0/*用來存儲近位*/,for i=0到19{c=A〔i〕+B〔i〕+d ,d =c/10,c=c%10,C〔i〕=c}if d 不等於0 C〔i+1〕=d ,再逆的輸出C就可以了!編程要學會思考,現在你可以試試編下高精度乘法,例如可以輸出100的階乘!

『叄』 c語言程序設計:大整數的加減法

用rand()產生隨機數,rand()會產生從0到一個很大的數,我記不清了,反咐模耐正很大。如果想出現100以內的,就用rand()%100。你可以定義三個int型整數,兩個表示加或者減的對象,另一個標示加或者減,因為只要出現兩種情況之一,所以可以用rand()%2,這樣只會有0,1兩種情況來標示加或者減。下面的就很容易了inta,b,i,c;for(i=0;i<10;i++){a=rand()%100;b=rand()%100;c=rand()%2;if(c==0)/衡春/標示加碼握法{printf("%d+%d=%d\n",a,b,a+b);}else{printf("%d-%d=%d\n",a,b,a-b);}}大致就這樣,希望給你點幫助

『肆』 C語言 大整數加減法

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

char a[1000],b[1000];
int c[1001];
int x,y,i,j,k;
int blen=0;
int alen=0;
char flag = '+';//用於減法標記負數
int Subtract(char *a, char *b, int len) { //為了避免代碼重復,將共同的計算抽出寫成函數
int i;
for (i=len-1; i>=0; i--) {
if (a[i] < b[i]) {
c[i] = a[i] + 10 - b[i];
b[i-1]++;
} else {
c[i] = a[i] - b[i];
}
}
return 0;
}

int Subtraction(){
for (i=0;i<100;i++)
{
scanf("%c",&b[i]);
if(b[i]=='\n')
break;
blen++;
}
printf("=");
if(alen>blen)
{
x=(alen-blen);
for(i=blen-1;i>=0;i--)
{
alen--;
b[alen]=b[i];
}
for (i=0;i<x;i++)
b[i]='0';
alen=blen+x;
blen=alen;
} else if (blen > alen) {
x=(blen-alen);
for(i=alen-1;i>=0;i--)
{
blen--;
a[blen]=a[i];
}
for (i=0;i<x;i++)
a[i]='0';
blen=alen+x;
alen=blen;
}
for (i=alen-1;i>=0;i--) {
a[i]=a[i]-'0';
b[i]=b[i]-'0';
}
if (strcmp(a, b) > 0) {
Subtract(a, b, alen);
}else {
flag = '-';
Subtract(b, a, alen);
}
return 0;
}

int Addition(){
for (i=0;i<100;i++)
{ scanf("%c",&b[i]);
if(b[i]=='\n')
break;
blen++;
}
printf("=");
if(alen>blen)
{
x=(alen-blen);
for(i=blen-1;i>=0;i--)
{
alen--;
b[alen]=b[i];
}
for (i=0;i<x;i++)
b[i]='0';
alen=blen+x;
} else if (blen > alen) {
x=(blen-alen);
for(i=alen-1;i>=0;i--)
{
blen--;
a[blen]=a[i];
}
for (i=0;i<x;i++)
a[i]='0';
blen=alen+x;
alen=blen;
}

for (i=alen-1;i>=0;i--) {
a[i]=a[i]-'0';
b[i]=b[i]-'0';
if(c[i+1]+a[i]+b[i]>=10)
{
c[i]=(c[i+1]+a[i]+b[i])/10;
c[i+1] = (c[i+1]+a[i]+b[i])%10;

}
else
{
c[i+1]+=(a[i]+b[i]);
}
}

return 0;

}

int main()
{
for (i=0;i<100;i++)
a[i]=0;
for (i=0;i<100;i++)
b[i]=0;
for (i=0;i<101;i++)
c[i]=0;

for (i=0;i<100;i++)
{
scanf("%c",&a[i]);
if(a[i]=='+')
{
Addition();
goto output1;
}
if(a[i]=='-')
{
Subtraction();
goto output2;
}
alen++;
}
output1:
{
for (i=0;i<=alen;i++)
printf("%d",c[i]);
return 0;
}
output2:
{
printf("%c", flag);
for (i=0;i<alen;i++)
printf("%d",c[i]);
return 0;
}
}

代碼運行結果:
123456789-12345
=+123444444

Terminated with return code 0
Press any key to continue ...

123456+111111
=0234567

Terminated with return code 0
Press any key to continue ...

1000000-1
=+0999999

Terminated with return code 0
Press any key to continue ...

1-1000000
=-0999999

Terminated with return code 0
Press any key to continue ...

//對你的代碼作了! 希望有助於你的學習。

『伍』 怎樣用C語言做超大整數的減法運算

設計一個比較長的數組來記錄各位數值,計算就行。
示例:
const int MAXL = 512;
//_num表示各位數值,_len表示數值長度,_num[i]表示該位是10^i的位置
struct HugeNumber{
char _num[MAXL];
int _len;
};
//實現這個函數,就有減法了,具體就參照小學數學的減法寫個借位減法就行了
void sub_huge(const HugeNumber &a, const HugeNumber &b, HugeNumber &result);

『陸』 大一c語言:用數組設計一個20位長整數,並實現用這個長整數進行加法或減法運算。 急求啊

//這是肢信我之前寫的一個大整數的加減乘的程序,先輸入兩個數的各位的值
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

voidputin(int*x,int*y,inta,intb)
{
inti;
for(i=0;i<a;i++)
{
printf("輸入x[%d]:",i);
scanf("%d",&x[i]);
}
for(i=0;i<b;i++)
{
printf("輸入y[%d]:",i);
scanf("%d",&y[i]);
}
}

voidjiafa(int*x,int*y,int*z,int*c,inta,intb)
{
inti,j;
z[0]=(x[0]+y[0])%10;
c[0]=(x[0]+y[0])/10;
for(i=1,j=1;i<a;i++,j++)
{
if(j<b)
{
z[i]=(x[i]+y[j]+c[i-1])%10;
c[i]=(x[i]+y[j]+c[i-1])/10;
}
elseif(i==b)
{
z[i]=x[i]+c[b-1];
}
elsez[i]=x[i];
}
if(c[i-1]!=0)
{
z[i]=c[i-1];

}
elsez[i]=0;
}

voidchengfa(int*x,int*y,int*z,int*c,inta,intb)
{
inti,j;
int*t=(int*)malloc(sizeof(int)*b*(a+b));
int*c1=(int*)malloc(sizeof(int)*(a+b));
int*p=(int*)malloc(sizeof(int)*(a+b));
for(i=0;i<a+b;i++)
c1[i]=0;
for(i=0;i<b;i++)
for(j=0;j<a+b;j++)
t[i*(a+b)+j]=0;


for(j=0;j<b;j++)
{
for(i=0;i<a;i++)
{
if(i==0)
{
t[j*(a+b)+i]=(x[i]*y[j]+c[0])%10;
c[i]=(x[i]*y[j]+c[0])/10;
}
else
{
t[j*(a+b)+i]=(x[i]*y[j]+c[i-1])%10;
c[i]=(x[i]*y[j]+c[i-1])/10;
}
}
if(c[i-1]!=0)
t[j*(a+b)+i]=c[i-1];
}
for(i=0;i<b;i++)
for(j=0;j<i;j++)
{
for(intk=a+b-1;k>0;k--)
t[i*(a+b)+k]=t[i*(a+b)+k-1];
t[i*(a+b)+0]=0;
}
jiafa(t+0*(a+b),t+1*(a+b),z,c1,a+b,a+b);
for(i=2;i<b;i++)
{
for(j=0;j<a+b;j++)
p[j]=z[j];
jiafa(p,t+i*(a+b),z,c1,a+b,a+b);
}

}

voidjianfa(int*x,int*y,int*z,int*c,inta,intb)
{
inti,j;
x[0]>塵握=y[0]?c[0]=0:c[0]=-1;
z[0]=(x[0]-y[0]+10)%10;
for(i=1,j=1;i<a;i++,j++)
{
if(j<b)
{
x[i]>=y[j]?c[i]=0:c[i]=-1;
z[i]=(x[i]-y[j]+c[i-1]+10)%10;
}
elseif(j==b)
{
z[i]=x[i]+c[j-1];
}
elsez[i]=x[i];
}
}


voidprint(int歷兄輪*x,int*y,int*z,inta,intb,intc)
{
inti;
for(i=0;i<c-a;i++)
printf("");
for(i=a-1;i>=0;i--)
printf("%d",x[i]);
printf(" ");

for(i=0;i<c-b;i++)
printf("");
for(i=b-1;i>=0;i--)
printf("%d",y[i]);
printf(" ");

for(i=c-1;i>=0;i--)
printf("-");
printf(" ");

for(i=c-1;i>=0;i--)
printf("%d",z[i]);
printf(" ");

}
voidmain()
{
intlengtha=5,lengthb=4,i;
//printf("輸入數組a和b的長度(a的長度大於b的長度):");
//scanf("%d%d",&lengtha,&lengthb);
int*a=(int*)malloc(lengtha*sizeof(int));
int*b=(int*)malloc(lengthb*sizeof(int));
int*sum=(int*)malloc((lengtha+1)*sizeof(int));
int*c=(int*)malloc((lengtha)*sizeof(int));
int*cha=(int*)malloc(lengtha*sizeof(int));
int*ji=(int*)malloc((lengtha+lengthb)*sizeof(int));

for(i=0;i<lengtha;i++)
{
a[i]=i+2;
b[i]=i+2;
c[i]=0;
}
a[lengthb]=9;

/*
printf("輸入%d個數組a的元素:",lengtha);
for(i=0;i<lengtha;i++)
scanf("%d",&a[i]);
printf("輸入%d個數組b的元素:",lengthb);
for(i=0;i<lengthb;i++)
scanf("%d",&b[i]);
*/

putin(a,b,lengtha,lengthb);
jiafa(a,b,sum,c,lengtha,lengthb);
printf("加法: ");
print(a,b,sum,lengtha,lengthb,lengtha+1);

jianfa(a,b,cha,c,lengtha,lengthb);
printf("減法: ");
print(a,b,cha,lengtha,lengthb,lengtha);


chengfa(a,b,ji,c,lengtha,lengthb);
printf("乘法: ");
print(a,b,ji,lengtha,lengthb,lengtha+lengthb);



}

『柒』 c語言 大整數減法

郁悶,我用紙寫了一下,寫了3面紙,現在時間不夠了,我不能把代碼抄上來了。唉……夠悲劇。
方法可以告訴你:
分別定義2個字元串數數和2個整數數,然後把字元串數組轉換成整數數組,這樣的轉換並不麻煩,你可以聲明一個中間字元串變數(這個字元串長度為1,因為只用於存放一個1個位元組的字元),然後分別把這個只含有一個字元的字元串轉化位整數並存入整數2維數組中,用atoi()函數把字元串轉換成整數。
假設轉換後的被減數組成的數組為a1[10][100],減數組成的數組為a2[10][100],然後模擬豎式運算,就是說如果a1[i][j]<a2[k][l]則a1[i][j]要加10再進行計算,當然a1[i][j-1]就要減1,因為被借了1。你可以把數出來的差放入新的整數數組中,如果a1的位數大於a2的位數,那隻要把多出的部分直接放入新數組中即可。
還是這樣說比較好,我把代碼寫出來你更難看懂。。。

『捌』 超級大的整數的加減用c語言怎麼寫

可以用數組製作。
都知道int,float,double的精度和可使用的范圍都是有限的,對於大數相減,總是會產生溢出的情況。
所以對於大數相減,認為可以用數組來做。比如,定義一個數組a[100];a[1]用來保存個位數,a[2]用來保存十位數,等等。
如果a[i]的值大於或等於10,就讓a[i+1]++,a[i]-10就行了。
在列印的時候就用一個for語句,再調一下輸出格式就可以了。