?? 大整數(shù)的運(yùn)算3.1.c
字號(hào):
/*大整數(shù)的運(yùn)算(加、減、乘及數(shù)制轉(zhuǎn)化)*/
#define MAX 400
#define MAX1(x,y) (x)>(y)?(x):(y)
void my_read(int a[]) /*記錄輸入得數(shù)值,數(shù)值部分a與輸入順序相反*/
{int len,i,flag=0;
char s[MAX];
aa:
while(1)
{scanf("%s",&s);
len=strlen(s);
if(s[0]=='-') flag=1;/*以flag=1標(biāo)記負(fù)數(shù) */
for(i=len-flag;i>0;i--)
{if((s[len-i]-'0')<0||(s[len-i]-'0')>9)/*確定輸入數(shù)字*/
{printf("\tInput error in bit:%d ,Reenter!!",len-i+1);/*重新輸入*/
getch();
goto aa;
}
else a[i]=s[len-i]-'0';
}
if(flag) a[0]=-(len-1);/*a[0]得絕對(duì)值記錄輸入整數(shù)得位數(shù)(負(fù)數(shù)a[0]<0)*/
else a[0]=len;
break;
}
return;
}
void Print_menu(void)
{clrscr();
printf("\n\n\n");
printf("\t\t\t**************************************\n");
printf("\t\t\t* *\n");
printf("\t\t\t* 1.Plus *\n"); /*加法 */
printf("\t\t\t* 2.Minus *\n"); /*減法 */
printf("\t\t\t* 3.Multiply *\n"); /*乘法 */
printf("\t\t\t* 4.Transform *\n"); /*進(jìn)制轉(zhuǎn)化*/
printf("\t\t\t* 5.Help ? *\n");
printf("\t\t\t* 6.Exit *\n");
printf("\t\t\t* *\n");
printf("\t\t\t**************************************\n");
printf("\n\n\t\t\t Choose among (1~6):");
}
void my_print(int a[]) /*輸出各位數(shù)值(逆序) */
{int i;
if (a[0]<0) printf("-");
if (a[0]==0)
{printf("0\n");return;} /*使只輸入'-'時(shí),a[0]=0 */
for(i=abs(a[0]);i>=1;i--)
printf("%d",a[i]);
}
void format(int a[]) /*將add數(shù)據(jù)改寫(xiě)為標(biāo)準(zhǔn)的十進(jìn)制形式*/
{int p;
for(p=1; (p<a[0])||(a[p]>=10); p++)
{if(p>=a[0]) a[p+1]=0;
a[p+1]+=a[p]/10;
a[p]=a[p]%10;
}
if(p>=a[0]) a[0]=p;
return;
}
void add(int a[],int b[],int c[])/* c[i]記錄a[i]與b[i]之和 */
{int len,i;
if(a[0]<b[0]) len=a[0];
else len=b[0];
for(i=0;i<len;i++)
c[i+1]=a[i+1]+b[i+1];
if(len<a[0])
{for(;i<a[0];i++)
c[i+1]=a[i+1];
c[0]=a[0];
}
else
{for(;i<b[0];i++)
c[i+1]=b[i+1];
c[0]=b[0];
}
format(c);
}
void commaltiply (int a[],int x,int b[])
{
int i;
for(i=0;i<a[0];i++)
b[i+1]=a[i+1]*x;
b[0]=a[0];
format(b);
return;
}
void matiply(int a[],int b[],int c[])
{
int i,temp[MAX],j;
commaltiply(a,b[1],c);
for(i=2;i<=b[0];i++)
{
if (b[i]==0)
{
c[0]++;
for (j=c[0];j>1;j--)
c[1]=0;
}
else
{
commaltiply(a,b[i],temp);
for(j=1;j<i;j++)
commaltiply(temp,10,temp);
add(c,temp,c);
}
}
}
void dectobin(int a[],int b[])/*把十進(jìn)制正數(shù)a 轉(zhuǎn)為二進(jìn)制b */
{int p;
b[0]=0;
while(a[0]>0)
{b[0]++;
b[b[0]]=a[1]%2;
p=a[0];
while(p>0)
{if (a[p]%2 && p>1) a[p-1]+=10;
a[p]/=2;
if (a[a[0]]==0) a[0]--;
p--;
}
}
}
format1(int a[]) /*將sub數(shù)據(jù)改寫(xiě)為標(biāo)準(zhǔn)的十進(jìn)制形式*/
{int i;
for(i=1;i<=a[0];i++)
if(a[i]<0) {a[i]+=10;a[i+1]-=1;}
}
void sub_1(int a[],int b[],int c[])/* c[i]記錄a[i]與b[i]之差(a>b) */
{int i;
for (i=0; i<b[0]; i++)
c[i+1]=a[i+1]-b[i+1];
if(a[0]==b[0]) goto loop;
for(; i<a[0]; i++)
c[i+1]=a[i+1];
loop:
c[0]=a[0];
format1(c);
i=c[0];
while(1)
if (c[i]==0) i--;
else break;
c[0]=i;
return;
}
void sub(int a[],int b[],int c[]) /* c記錄a與b之差 */
{int i,flag=0;
for(i=1;i<=MAX1( (a[0]), (b[0]) );i++)
if(a[i]!=b[i]) {flag=1;break;}
if(flag==0) {c[0]=0;return;} /* flag=0記錄a、b兩數(shù)完全一致*/
flag=0; /*對(duì)不同a、b進(jìn)行討論*/
if(a[0]==b[0]) /* a、b兩數(shù)位數(shù)一致*/
{i=a[0];
while(i>0)
{if(a[i]>b[i])
{sub_1(a,b,c); break; }
if(a[i]<b[i])
{flag=1; sub_1(b,a,c); break;}
i--;
}
}
if(a[0]>b[0]) sub_1(a,b,c);
else
if (a[0]<b[0]) {flag=1; sub_1(b,a,c); }
if(flag) c[0]=-c[0];
else c[0]=c[0];
}
void main(void)
{int i,flag,a[MAX],b[MAX],c[MAX];
char yn;
strat:
while(1)
{Print_menu();
yn=getch();
if(yn=='1'||yn=='2'||yn=='3'||yn=='4'||yn=='5'||yn=='6') break;
else
{printf("\n\t\t\t\tError input! Press any key to ....");getch();}
}
clrscr();
if (yn=='6') return;
if (yn=='4')
{printf("Input the big number(integer) to be transformed:\n");
my_read(a);
for(i=0;i<abs(a[0]);i++) /*abs(X)取x絕對(duì)值*/
b[i+1]=a[i+1];
b[0]=a[0];
if(a[0]<0) {a[0]=-a[0];dectobin(a,c);/*a[0]=-a[0];*/c[0]=-c[0];goto e;}
dectobin(a,c);
e:
printf("Figure in decimalist (integer):");
my_print(b);
printf("\nFigure in binary system (integer):");
my_print(c);
goto loop;
}
printf("Input integer A:");
my_read(a);
printf("Input integer B:");
my_read(b);
if (yn=='1')
{
if(a[0]<0 && b[0]<0) {a[0]=-a[0];b[0]=-b[0];add(a,b,c);c[0]=-c[0];
a[0]=-a[0];b[0]=-b[0];goto c;}
if(a[0]>0 && b[0]<0) {b[0]=-b[0];sub(a,b,c);b[0]=-b[0];goto c;}
if(a[0]>0 && b[0]>0) {add(a,b,c);goto c;}
if(a[0]<0 && b[0]>0) {a[0]=-a[0];sub(b,a,c);a[0]=-a[0];goto c;}
c:
printf("\n\t\t\tA=");
my_print(a);
printf("\n\t\t\tB=");
my_print(b);
printf("\n\t\t\tC=A+B=");
my_print(c);
goto loop;
}
if (yn=='2')
{
if (a[0]<0 && b[0]<0) {a[0]=-a[0];b[0]=-b[0];sub(b,a,c);a[0]=-a[0];b[0]=-b[0];}
if (a[0]<0 && b[0]>0) {a[0]=-a[0];add(a,b,c);a[0]=-a[0];c[0]=-c[0];}
if (a[0]>0 && b[0]<0) {b[0]=-b[0];add(a,b,c);b[0]=-b[0];}
if (a[0]>0 && b[0]>0) sub(a,b,c);
printf("\n\t\t\tA=");
my_print(a);
printf("\n\t\t\tB=");
my_print(b);
printf("\n\t\t\tC=A-B=");
my_print(c);
goto loop;
}
if (yn=='3')
{
if (a[0]<0 && b[0]>0) {a[0]=-a[0];matiply(a,b,c);a[0]=-a[0];c[0]=-c[0];goto d;}
if (a[0]>0 && b[0]<0) {b[0]=-b[0];matiply(a,b,c);b[0]=-b[0];c[0]=-c[0];goto d;}
if (a[0]<0 && b[0]<0) {a[0]=-a[0];b[0]=-b[0];matiply(a,b,c);
a[0]=-a[0];b[0]=-b[0];goto d;}
matiply(a,b,c);
d:
printf("\n\t\t\tA=");
my_print(a);
printf("\n\t\t\tB=");
my_print(b);
printf("\n\t\t\tC=A*B=");
my_print(c);
goto loop;
}
loop:
printf("\n\t\t\tDo you want to continue computing?(y/n)");
while(1)
{yn=getch();
if((yn=='y')||(yn=='n'))
{if (yn=='y') goto strat;
if (yn=='n') return;
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -