大數運算模板(C語言)
阿新 • • 發佈:2019-02-02
程式碼說明:
//大數相加
#include <stdio.h>
#include <string.h>
#define MAXN 100
int an1[MAXN+10];
int an2[MAXN+10];
char str1[MAXN+10];
char str2[MAXN+10];
int main()
{
memset(an1,0,sizeof(an1));
int i,j;
scanf("%s",str1);
j=0;
int len1=strlen(str1);
for(i=len1-1;i>=0;i--)
an1[j++]=str1[i]-'0' ;
while(~scanf("%s",str2)&&str2[0]!='0')
{
memset(an2,0,sizeof(an2));
j=0;
int len2=strlen(str2);
for(i=len2-1;i>=0;i--)
an2[j++]=str2[i]-'0';
//下面是主要運算過程
for(i=0;i<MAXN;i++){
an1[i]+=an2[i];
if(an1[i]>=10 ){
an1[i]-=10;
an1[i+1]++;
}
}
//輸出
int pan_0 = 0;
for(i=MAXN;i>=0;i--){
if(pan_0)
printf("%d",an1[i]);
else if(an1[i]){
printf("%d",an1[i]);
pan_0 = 1;
}
}
printf ("\n");
}
return 0;
}
//大數相減
//改動主要運算過程
for(i=0;i<MAXN;i++){
an1[i]-=an2[i];
if(an1[i]<0){
an1[i]+=10;
an1[i+1]--;
}
}
//大數相乘
#include <stdio.h>
#include <string.h>
#define MAXN 100
int an1[MAXN*2+10];
int an2[MAXN+10];
int aresult[MAXN*2+10];
char str1[MAXN+10];
char str2[MAXN+10];
int main()
{
memset(an1,0,sizeof(an1));
int i,j;
scanf("%s",str1);
j=0;
int len1=strlen(str1);
for(i=len1-1;i>=0;i--)
an1[j++]=str1[i]-'0';
int duandian;
duandian=len1-1;
while(~scanf("%s",str2)&&str2[0]!='0')
{
memset(aresult,0,sizeof(aresult));
memset(an2,0,sizeof(an2));
j=0;
int len2=strlen(str2);
for(i=len2-1;i>=0;i--)
an2[j++]=str2[i]-'0';
//下面是主要運算過程
for(i=0;i<duandian+1;i++)
for(j=0;j<len2;j++)
aresult[i+j]+=an1[i]*an2[j];
for(i=0;i<MAXN;i++){
if(aresult[i]>=10){
aresult[i+1]+=aresult[i]/10;
aresult[i]%=10;
}
}
//輸出
memset(an1,0,sizeof(an1));
int pan_0 = 0;
for(i=MAXN*2;i>=0;i--){
if(pan_0){
printf("%d",aresult[i]);
an1[i]=aresult[i];
}
else if(aresult[i]){
printf("%d",aresult[i]);
duandian=i;
an1[i]=aresult[i];
pan_0 = 1;
}
}
printf("\n");
memset(str2,0,sizeof(str2));
}
return 0;
}
//大數相除,兩個數
//反覆做減法,能減幾個,商就是幾。
#include <stdio.h>
#include <string.h>
#define MAXN 100
int an1[MAXN+10]; //被除數
int an2[MAXN+10]; //除數
int aresult[MAXN+10]; //商
char str1[MAXN+10];
char str2[MAXN+10];
//substract函式表示an1減去an2,返回結果的長度;不夠返回-1;剛好返回0;
int subtract(int *p1,int *p2,int len1,int len2)
{
int i;
//判斷p1是否比p2大,不是返回-1
if(len1<len2)
return -1;
int pan = 0;
if(len1==len2){
for(i=len1-1;i>=0;i--){
if(p1[i]>p2[i])
pan = 1;
else if(p1[i]<p2[i]){
if(!pan)
return -1;
}
}
}
//p1不小於p2,做減法
for(i=0;i<len1;i++){
p1[i]-=p2[i];
if(p1[i]<0){
p1[i]+=10;
p1[i+1]--;
}
}
for(i=len1-1;i>=0;i--)
if(p1[i])
return i+1;
//一樣大
return 0;
}
int main()
{
int t;
scanf("%s",str1);
scanf("%s",str2);
int i,j;
memset(an1,0,sizeof(an1));
memset(an2,0,sizeof(an2));
memset(aresult,0,sizeof(aresult));
j=0;
int len1=strlen(str1);
for(i=len1-1;i>=0;i--)
an1[j++]=str1[i]-'0';
j=0;
int len2=strlen(str2);
for(i=len2-1;i>=0;i--)
an2[j++]=str2[i]-'0';
//運用substract函式
len1=subtract(an1,an2,len1,len2);
//情況1
if(len1<0){
printf("0\n");
}
//情況2
else if(len1==0){
printf("1\n");
}
//情況3
else
{
aresult[0]++; //已經減了一次,商加1
int times=len1-len2;
if(times<0) //不能再減
goto output;
else if(times>0){
for(i=len1-1;i>=0;i--){
if(i>=times)
an2[i]=an2[i-times];
else
an2[i]=0;
}
}
//!!!
len2=len1;
for(j=0;j<=times;j++){
int tmp;
while((tmp=subtract(an1,an2+j,len1,len2-j))>=0){
len1=tmp;
aresult[times-j]++;
}
}
output:
//進位
for(i=0;i<MAXN;i++){
if(aresult[i]>=10){
aresult[i+1]+=aresult[i]/10;
aresult[i]%=10;
}
}
//輸出
int pan_0 = 0;
for(i=MAXN;i>=0;i--){
if(pan_0){
printf("%d",aresult[i]);
}
else if(aresult[i]){
printf("%d",aresult[i]);
pan_0 = 1;
}
}
printf("\n");
}
return 0;
}