1. 程式人生 > >大數運算模板(C語言)

大數運算模板(C語言)

程式碼說明:

//大數相加
#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; }