#include<stdio.h>
#include<stdlib.h>#include<string.h>#define SIZE 100 /*一个大整数用个字节保存,最多表示100位大整数*//*大整数的定义*/typedef struct BigNum /*大整数字符结构*/{ char data[SIZE]; /*空间为SIZE个字节*/}BigNum;typedef struct BigInt/*大整数整数数组结构*/{ int data[SIZE+1];}BigInt;/*基本函数的声明部分如下:*/void input_BigNum(BigNum &BigNum_a);/*大整数的输入函数*/void Printf_BigNum(BigNum BigNum_a);/*输出大整数的函数*/BigNum abs_BigNum(BigNum BigNum_a);/*求大整数BigNum_a绝对值函数*/int Length_BigNum(BigNum BigNum_a);/*求大整数BigNum_a的实际位数即为长度length*/BigNum add_BigNum(BigNum &BigNum_a,BigNum &BigNum_b);/*求大整数BigNum_a,BigNum_b的和值*/BigNum sub_BigNum(BigNum &BigNum_a,BigNum &BigNum_b);/*求大整数BigNum_a,BigNum_b的差值*/BigNum negate_BigNum(BigNum BigNum_a);/*求大整数BigNum_a的负数*/BigNum inc_BigNum(BigNum BigNum_a);/*求大整数BigNum_a的自增运算*/BigNum dec_BigNum(BigNum BigNum_a);/*求大整数BigNum_a的自减运算*/char toChar(int a);/*数字转数字字符*/int toInt(char a);/*数字字符转数字*/void clear_BigNum(BigNum &BigNum_a);/*清空函数*//*各个函数实现部分*/void input_BigNum(BigNum &BigNum_a){/*大整数的输入函数*/ printf("Enter BigNums and end of Enter botton!\n"); getchar(); gets(BigNum_a.data);}void Printf_BigNum(BigNum BigNum_a){/*输入大整数的函数*/ int i=1; printf("%c",BigNum_a.data[0]); if(BigNum_a.data[0]=='-') while(BigNum_a.data[i]!='\0'&&i<Length_BigNum(BigNum_a)+1) { printf("%c",BigNum_a.data[i]); i++; } else if(BigNum_a.data[0]!='-') while(BigNum_a.data[i]!='\0'&&i<Length_BigNum(BigNum_a)) { printf("%c",BigNum_a.data[i]); i++; } printf("\n");}BigNum abs_BigNum(BigNum BigNum_a){/*求大整数BigNum_a绝对值函数*/ int i; BigNum BigNum_b; if(BigNum_a.data[0]=='-') for(i=0;i<SIZE;i++) BigNum_b.data[i]=BigNum_a.data[i+1]; else for(i=0;i<SIZE;i++) BigNum_b.data[i]=BigNum_a.data[i]; return BigNum_b;}int Length_BigNum(BigNum BigNum_a){/*求大整数BigNum_a的实际位数即为长度length不包括符号位*/ int i=0; char *B; B=BigNum_a.data; if(*B=='-') { i=0; B++; } while(*B!='\0') { i++; B++; } return i;}BigNum add_BigNum(BigNum &BigNum_a,BigNum &BigNum_b){/*求大整数BigNum_a,BigNum_b的和值*/ int i,La,Lb,Lc; int *pa_last,*pb_last,*pc_last; BigInt BigInt_a,BigInt_b,BigInt_c; BigNum BigNum_c; for(i=0;i<SIZE;i++) {/*初始化数组不易输出错误的信息*/ BigNum_c.data[i]='\0'; BigInt_a.data[i]=0; BigInt_b.data[i]=0; BigInt_c.data[i]=0; } La=strlen(BigNum_a.data); Lb=strlen(BigNum_b.data); if(BigNum_a.data[0]!='-'&&BigNum_b.data[0]!='-') {/*BigNum_a,BigNum_b都为大正整数情况*/ Lc=La>Lb?(La+1):(Lb+1); for(i=0;i<La;i++) BigInt_a.data[i]=toInt(BigNum_a.data[i]);/*将BigNum_a,BigNum_b转化成BigInt_a,BigInt_b进行相加运算*/ for(i=0;i<Lb;i++) BigInt_b.data[i]=toInt(BigNum_b.data[i]); pa_last=BigInt_a.data+La-1;/*三指针初始化*/ pb_last=BigInt_b.data+Lb-1; pc_last=BigInt_c.data+Lc-1; while(pa_last>=BigInt_a.data&&pb_last>=BigInt_b.data&&pc_last>=BigInt_c.data) { *pc_last+=*pa_last+*pb_last; if(*pc_last>=10) {/*进位代码*/ *pc_last-=10; pc_last--; (*pc_last)++; pc_last++; } pa_last--; pb_last--; pc_last--; } while(pa_last>=BigInt_a.data) {/*La>Lb*/ *pc_last+=*pa_last; pa_last--; pc_last--; } while(pb_last>=BigInt_b.data) {/*La<Lb*/ *pc_last+=*pb_last; pb_last--; pc_last--; } for(i=0;i<Lc;i++) BigNum_c.data[i]=toChar(BigInt_c.data[i]);/*将BigInt_c转化成BigNum_c*/ } else if(BigNum_a.data[1]=='-'&&BigNum_b.data[1]=='-') {/*BigNum_a,BigNum_b都为大负整数情况*/ printf("akdhkajhfdkj"); La=Length_BigNum(BigNum_a); Lb=Length_BigNum(BigNum_b); Lc=La>Lb?(La+1):(Lb+1); for(i=2;i<=La;i++) BigInt_a.data[i]=toInt(BigNum_a.data[i]);/*将BigNum_a,BigNum_b转化成BigInt_a,BigInt_b进行相加运算*/ for(i=2;i<=Lb;i++) BigInt_b.data[i]=toInt(BigNum_b.data[i]); pa_last=BigInt_a.data+La;/*三指针初始化*/ pb_last=BigInt_b.data+Lb; pc_last=BigInt_c.data+Lc; while(pa_last>BigInt_a.data+1&&pb_last>BigInt_b.data+1&&pc_last>BigInt_c.data+1) { *pc_last+=*pa_last+*pb_last; if(*pc_last>=10) { *pc_last-=10; pc_last--; (*pc_last)++; pc_last++; } pa_last--; pb_last--; pc_last--; } while(pa_last>BigInt_a.data) {/*La>Lb*/ *pc_last+=*pa_last; if(*pc_last>9) { *pc_last-=10; pc_last--; (*pc_last)++; pc_last++; } pa_last--; pc_last--; } while(pb_last>BigInt_b.data) {/*La<Lb*/ *pc_last+=*pb_last; if(*pc_last>9) { *pc_last-=10; pc_last--; (*pc_last)++; pc_last++; } pb_last--; pc_last--; } BigNum_c.data[1]='-'; for(i=0;i<Lc;i++) BigNum_c.data[i]=toChar(BigInt_c.data[i]);/*将BigInt_c转化成BigNum_c*/ } return BigNum_c;}BigNum sub_BigNum(BigNum &BigNum_a,BigNum &BigNum_b){/*求大整数BigNum_a-BigNum_b的差值*/ int i=0,La=0,Lb=0,Lc=0; int *pa_last=NULL,*pb_last=NULL,*pc_last=NULL; BigInt BigInt_a,BigInt_b,BigInt_c; BigNum BigNum_c; for(i=0;i<SIZE;i++) {/*初始化数组不易输出错误的信息*/ BigNum_c.data[i]='\0'; BigInt_a.data[i]=0; BigInt_b.data[i]=0; BigInt_c.data[i]=0; } if(BigNum_a.data[1]!='-' && BigNum_b.data[1]=='-') {/*(+BigNum_a)-(-BigNum_b)*/ Lb=strlen(BigNum_b.data); printf("\tThe length %d of the sub_BigNUm_b ",Lb-1); for(i=2;i<Lb;i++) { BigNum_b.data[i-1]=BigNum_b.data[i]; } BigNum_c=add_BigNum(BigNum_a,BigNum_b); } if(BigNum_a.data[1]=='-' && BigNum_b.data[1]!='-') {/*(-BigNum_a)-(+BigNum_b)*/ Lb=strlen(BigNum_b.data); BigNum_b.data[0]='-'; BigNum_b.data[Lb+1]='\0'; for(i=0;i<Lb;i++) { BigNum_b.data[i+1]=BigNum_b.data[i]; } BigNum_c=add_BigNum(BigNum_a,BigNum_b); } if(BigNum_a.data[0]!='-' && BigNum_b.data[0]!='-')/*two positive number*/ {/*(BigNum_a)-(BigNum_b)*/ La=strlen(BigNum_a.data); Lb=strlen(BigNum_b.data); Lc=La>Lb?La:Lb; for(i=0;i<La;i++) BigInt_a.data[i]=toInt(BigNum_a.data[i]);/*将BigNum_a,BigNum_b转化成BigInt_a,BigInt_b进行相加运算*/ for(i=0;i<Lb;i++) BigInt_b.data[i]=toInt(BigNum_b.data[i]); pa_last=BigInt_a.data+La-1;/*三指针初始化*/ pb_last=BigInt_b.data+Lb-1; pc_last=BigInt_c.data+Lc-1; while(pa_last>=BigInt_a.data && pb_last>=BigInt_b.data && pc_last>=BigInt_c.data) { *pc_last+=(*pa_last)-(*pb_last); if(*pc_last<0) { *pc_last+=10; pc_last--; (*pc_last)--; pc_last++; } pc_last--; pc_last--; pc_last--; } while(pa_last>=BigInt_a.data) { *pc_last=*pa_last-*pc_last; pc_last--; pc_last--; } while(pa_last>=BigInt_a.data) { *pc_last=*pa_last-*pc_last; pc_last--; pc_last--; } for(i=0;i<Lc;i++) BigNum_c.data[i]=toChar(BigInt_c.data[i]); } if(BigNum_a.data[0]=='-' && BigNum_b.data[0]=='-')/*two negative number*/ {/*(-BigNum_a)-(-BigNum_b)*/ La=strlen(BigNum_a.data); Lb=strlen(BigNum_b.data); for(i=1;i<Lb;i++) { BigNum_b.data[i-1]=BigNum_b.data[i]; } BigNum_b.data[Lb-1]='\0'; for(i=1;i<La;i++) { BigNum_a.data[i-1]=BigNum_a.data[i]; } BigNum_a.data[La-1]='\0'; BigNum_c=add_BigNum(BigNum_b,BigNum_a); } return BigNum_c;}BigNum negate_BigNum(BigNum BigNum_a){/*求大整数BigNum_a的负数*/ int i=0; BigNum BigNum_b; for(i=0;i<SIZE;i++) BigNum_b.data[i]='\0'; if(BigNum_a.data[0]=='-') for(i=1;i<=Length_BigNum(BigNum_a);i++) BigNum_b.data[i-1]=BigNum_a.data[i]; else { BigNum_b.data[0]='-'; for(i=0;i<Length_BigNum(BigNum_a);i++) BigNum_b.data[i+1]=BigNum_a.data[i]; } return BigNum_b;}BigNum inc_BigNum(BigNum BigNum_a){/*求大整数BigNum_a的自增运算*/ int i; BigNum BigNum_b; char *BigNum_last; for(i=0;i<SIZE;i++) BigNum_b.data[i]='\0'; if(BigNum_a.data[0]!='-') {/*正大整数++*/ BigNum_last=BigNum_a.data+Length_BigNum(BigNum_a)-1; while(*BigNum_last=='9') { *BigNum_last='0'; BigNum_last--; } if(BigNum_last<BigNum_a.data) { /*printf("\tThe BigNum are all 9!\n");*/ BigNum_a.data[0]='1'; BigNum_b.data[Length_BigNum(BigNum_a)]='0'; } else (*BigNum_last)++;/*最左边的9的数字字符加1*/ for(i=0;i<Length_BigNum(BigNum_a);i++) BigNum_b.data[i]=BigNum_a.data[i]; } else if(BigNum_a.data[0]=='-') {/*负大整数++*/ BigNum_last=BigNum_a.data+Length_BigNum(BigNum_a); while(*BigNum_last=='0') { *BigNum_last='9'; BigNum_last--; } if(BigNum_last<=BigNum_a.data) {/*全部为0除了第一个'-'号*/ for(i=0;i<Length_BigNum(BigNum_a);i++) { BigNum_a.data[i]='0'; } BigNum_a.data[Length_BigNum(BigNum_a)]='1'; } else (*BigNum_last)--; for(i=0;i<=Length_BigNum(BigNum_a);i++) BigNum_b.data[i]=BigNum_a.data[i]; } //free(BigNum_last); return BigNum_b;}BigNum dec_BigNum(BigNum BigNum_a){/*求大整数BigNum_a的自减运算*/ int i; char *BigNum_last; BigNum BigNum_b; for(i=0;i<SIZE;i++) BigNum_b.data[i]='\0'; if(BigNum_a.data[0]!='-') {/*正大整数--*/ BigNum_last=BigNum_a.data+Length_BigNum(BigNum_a)-1; while(*BigNum_last=='0') { *BigNum_last='9'; BigNum_last--; } if(BigNum_last>=BigNum_a.data) {/*大整数不全为'0'*/ (*BigNum_last)--; } else if(BigNum_last<BigNum_a.data) {/*大整数全为'0'*/ BigNum_a.data[0]='-'; for(i=1;i<Length_BigNum(BigNum_a);i++) { BigNum_a.data[i]='0'; } BigNum_a.data[Length_BigNum(BigNum_a)]='1'; } for(i=0;i<=Length_BigNum(BigNum_a);i++) BigNum_b.data[i]=BigNum_a.data[i]; } if(BigNum_a.data[0]=='-') {/*负数--*/ BigNum_last=BigNum_a.data+Length_BigNum(BigNum_a); while(*BigNum_last=='9') { *BigNum_last='0'; BigNum_last--; } if(BigNum_last>BigNum_a.data) {/*不全为'9'*/ (*BigNum_last)++; } else if(BigNum_last<=BigNum_a.data) {/*如:'-99999999'*/ BigNum_a.data[1]='1'; BigNum_last=BigNum_a.data+Length_BigNum(BigNum_a)+1; *BigNum_last='0'; BigNum_last++; *BigNum_last='\0'; } for(i=0;i<=Length_BigNum(BigNum_a);i++) BigNum_b.data[i]=BigNum_a.data[i]; } return BigNum_b;}char toChar(int a){/*数字转数字字符*/ return (char)(a+48);}int toInt(char a){/*数字字符转数字*/ return (int)(a-48);}int menu(){ int sign=10; printf("\t************************\n"); printf("\t***1.Input BigNum!****\n"); printf("\t***2.Printf BigNum!****\n"); printf("\t***3.Abs of BigNum!****\n"); printf("\t***4.Length BigNum!****\n"); printf("\t***5.Negate BigNum!****\n"); printf("\t***6.Inc the BigNum!****\n"); printf("\t***7.Dec the BigNum!****\n"); printf("\t***8.Add two BigNums!***\n"); printf("\t***9.Sub two BigNums!***\n"); printf("\t***0.Exit the system!***\n"); printf("\t************************\n"); printf("Input the number in(1-9)...\n"); scanf("%d",&sign); return sign;}void clear_BigNum(BigNum &BigNum_a){ int i=0,La; La=strlen(BigNum_a.data); for(i=0;i<La;i++) { BigNum_a.data[i]='\0'; }}int main(){ int i=SIZE; BigNum BigNum_a,BigNum_b,BigNum_c;Loop:i=menu(); switch(i) { case 1: { input_BigNum(BigNum_a); goto Loop; } case 2: { Printf_BigNum(BigNum_a); goto Loop; } case 3: { BigNum_b=abs_BigNum(BigNum_a); Printf_BigNum(BigNum_b); goto Loop; } case 4: { clear_BigNum(BigNum_a); input_BigNum(BigNum_a); printf("Length is:\t%d\n",Length_BigNum(BigNum_a)); goto Loop; } case 5: { BigNum_b=negate_BigNum(BigNum_a); Printf_BigNum(BigNum_b); goto Loop; } case 6: { BigNum_b=inc_BigNum(BigNum_a); Printf_BigNum(BigNum_b); goto Loop; } case 7: { BigNum_b=dec_BigNum(BigNum_a); Printf_BigNum(BigNum_b); goto Loop; } case 8: { printf("Input zero before input BigNum!\n"); clear_BigNum(BigNum_a); clear_BigNum(BigNum_b); input_BigNum(BigNum_a); input_BigNum(BigNum_b); BigNum_c=add_BigNum(BigNum_a,BigNum_b); Printf_BigNum(BigNum_c); goto Loop; } case 9: { printf("Input zero before input BigNum!\n"); clear_BigNum(BigNum_a); clear_BigNum(BigNum_b); clear_BigNum(BigNum_b); input_BigNum(BigNum_a); input_BigNum(BigNum_b); BigNum_c=sub_BigNum(BigNum_a,BigNum_b); Printf_BigNum(BigNum_c); goto Loop; } case 0:exit(1); } return 0;}