⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 大整数的运算3.1.c

📁 本程序可以对那些数值超出整形的大整数进行+ - * % 运算欢迎大家使用并提出宝贵修改意见
💻 C
字号:
/*大整数的运算(加、减、乘及数制转化)*/
#define MAX 400
#define MAX1(x,y)     (x)>(y)?(x):(y)
void my_read(int a[])    /*记录输入得数值,数值部分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标记负数  */
     for(i=len-flag;i>0;i--)
       {if((s[len-i]-'0')<0||(s[len-i]-'0')>9)/*确定输入数字*/
          {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]得绝对值记录输入整数得位数(负数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"); /*进制转化*/ 
  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[])        /*输出各位数值(逆序)   */
 {int i;
  if (a[0]<0) printf("-");
  if (a[0]==0)
    {printf("0\n");return;}  /*使只输入'-'时,a[0]=0 */
  for(i=abs(a[0]);i>=1;i--)
     printf("%d",a[i]);
 }

void format(int a[]) /*将add数据改写为标准的十进制形式*/ 
 {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[])/*把十进制正数a 转为二进制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数据改写为标准的十进制形式*/
 {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两数完全一致*/
  flag=0;                          /*对不同a、b进行讨论*/
  if(a[0]==b[0])                   /* a、b两数位数一致*/
    {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绝对值*/
      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;
       }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -