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

📄 supernumbercount.cpp

📁 对于比32位还要大的数进行运算
💻 CPP
字号:
#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAX 200
void read(int *a)                         //字符置换
{
   int len,i,flag=0;
   char s[MAX];
   aa:
   while(1)
   {
     scanf("%s",s);
     len=strlen(s);
     if(s[0]=='-') flag=1;
     for(i=len-flag;i>=1;i--)
	 {
        if((s[len-i]-'0')<0||(s[len-i]-'0')>9)
		{
            printf("你输入的不合法,请重新输入数据:\n");
            getchar();
            goto aa;
		}
        else
            a[i]=s[len-i]-'0';
	 }
     if(flag)
        a[0]=-(len-1);
     else
        a[0]=len;
     break;
   }
   return;
}
void print(int *a)                      //输出结果
{
   int i;
   if(a[0]<0) printf("-");
   if(a[0]==0)
   {
      printf("0");
      return;
   }
   for(i=abs(a[0]);i>=1;i--)
      printf("%d",a[i]);
   printf("\n");
}
void jinwei(int *a)                             //处理进位
{
   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 jiafa(int *a,int *b,int *c)             //加法
{
   int len,i;
   if(a[0]<b[0]) len=a[0];
   else len=b[0];
   for(i=1;i<=len;i++)
      c[i]=a[i]+b[i];
   if(len<a[0])                        //多出的按位入组
   {
      for(;i<=a[0];i++)
         c[i]=a[i];
      c[0]=a[0];
   }
   else
   {
      for(;i<=b[0];i++)
	         c[i]=b[i];
      c[0]=b[0];
   }
   jinwei(c);
}
void xiangcheng(int *a,int x,int *b)         //数组a按位乘以数x
{
   int i;
   for(i=1;i<=a[0];i++)
      b[i]=a[i]*x;
   b[0]=a[0];
   jinwei(b);
   return;
}
void chengfa(int *a,int *b,int *c)                  //乘法
{
   int i,temp[MAX],j;
   xiangcheng(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
	  {
         xiangcheng(a,b[i],temp);
         for(j=1;j<i;j++)
         xiangcheng(temp,10,temp);
         jiafa(c,temp,c);                             //将积相加
	  }
   }
}
void jiewei(int *a)                                //处理借位
{
   int i;
   for(i=1;i<=a[0];i++)
   if(a[i]<0)
   { 
	  a[i]+=10;
      a[i+1]-=1;
   }
}
void jian(int *a,int *b,int *c)                  //按位相减
{
   int i;
   for(i=1;i<=b[0];i++)
     c[i]=a[i]-b[i];
   if(a[0]==b[0]) c[0]=a[0];
   for(;i<=a[0];i++)
     c[i]=a[i];
   jiewei(c);                                    //对c中进行借位处理
   i=c[0];
   while(1)
   if(c[i]==0) i--;
   else break;
   c[0]=i;
   return;
}
void jianfa(int *a,int *b,int *c)                //减法
{
   int i,flag=0;
   for(i=1;i<=a[0];i++)                          //判断a是否等于b
	   if(a[i]!=b[i]) {flag=1;break;}
   if (flag==0)
   {
      c[0]=0;
      return;
   }
   flag=0;
   if(a[0]==b[0])                                //a、b位数相同
   {
      i=a[0];
      while(i>0)
	  {
         if(a[i]>b[i])
		 {
            jian(a,b,c);
            break;
		 }
         if(a[i]<b[i])
		 {
            flag=1;
            jian(b,a,c);
            break;
		 }
         i--;
	  }
   }
   if(a[0]>b[0])                                //a位数大于b
      jian(a,b,c);
   else if (a[0]<b[0])                          //a位数小于b
   {
      flag=1;
      jian(b,a,c);
   }
   if(flag)
   c[0]=-c[0];
   else
   c[0]=c[0];
}
int chufa(int *a,int *b)
{
   int n=0,i,t=0;
   if(a[0]==b[0])                            //两相同位数的数相除
   {
	   for(i=1;i<=a[0];i++)
	   { 
          if(a[i]-b[i]<0) n--;
          else if(a[i]-b[i]==0) n++;
          else goto aa;
	   }
       if(n<a[0]) return 0;
	   else if(n==a[0]) return 1;
   }
   else if(a[0]==1&&a[1]==0) return 0;       //a为0
   else if(b[0]==1&&b[1]==1) return -1;      //b为1
   else if(a[0]<b[0]) return 0;              //a比b小
   else                                      //a比b大
   {
	   aa:
       jianfa(a,b,a);
	   if(a[0]>=0) t++;
	   while(a[0]>0&&a[0]>=b[0])
	   {
          jianfa(a,b,a);
          t++;
	   }
	   return t;
   }
}
void main()
{
   int a[MAX],b[MAX],c[MAX],n=1;
   int d,m;
   while(n)                                 //菜单循环
   {
	   printf("\n请选择功能(0~4):\n");
	   printf("1.大整数加法\n");
       printf("2.大整数减法\n");
	   printf("3.大整数乘法\n");
	   printf("4.大整数除法\n");
	   printf("0.退出\n");
	   scanf("%d",&d);
	   switch(d)
	   {   
	      case 1:
            printf("请输入大整数A:");
            read(a);
            printf("请输入大整数B:");
            read(b);
            if(a[0]<0 && b[0]<0)            //a、b都为负数
			{
                a[0]=-a[0];b[0]=-b[0];
                jiafa(a,b,c);c[0]=-c[0];
                a[0]=-a[0];b[0]=-b[0]; 
			}
            if(a[0]>0 && b[0]<0)            //a正数b负数
			{
                b[0]=-b[0];
                jianfa(a,b,c);
                b[0]=-b[0];
			}
            if(a[0]>0 && b[0]>0)            //a、b都为正数
            {
                jiafa(a,b,c);
			}
            if(a[0]<0 && b[0]>0)            //a负数b正数
			{
                a[0]=-a[0]; 
                jianfa(b,a,c); 
                a[0]=-a[0]; 
			}
            printf("A:\n");
            print(a);
            printf("B:\n");
            print(b);
            printf("C=A+B:\n");
            print(c);
            break;
	      case 2:
            printf("请输入大整数A:");
            read(a);
            printf("请输入大整数B:");
            read(b);
            if(a[0]<0 && b[0]<0)            //a、b都为负数
			{
                a[0]=-a[0];
                b[0]=-b[0];
                jianfa(b,a,c);
                a[0]=-a[0];
                b[0]=-b[0];
            }
            if(a[0]<0 && b[0]>0)            //a负数b正数
			{
                a[0]=-a[0];
                jiafa(a,b,c);
                a[0]=-a[0];
                c[0]=-c[0];
            }
            if(a[0]>0 && b[0]<0)            //a正数b负数
			{
                b[0]=-b[0];
                jiafa(a,b,c);
                b[0]=-b[0]; 
			}
            if(a[0]>0&&b[0]>0)              //a、b都为正数
            jianfa(a,b,c);
            printf("A:\n");
            print(a);
            printf("B:\n");
            print(b);
            printf("C=A-B:\n");
            print(c);
            break;
	      case 3:
            printf("请输入大整数A:");
            read(a);
            printf("请输入大整数B:");
            read(b);
            if(a[0]<0 && b[0]>0)            //a负数b正数 
			{
                a[0]=-a[0]; 
                chengfa(a,b,c); 
                a[0]=-a[0]; 
                c[0]=-c[0]; 
			}
            if(a[0]>0&&b[0]<0)              //a正数b负数 
			{
                b[0]=-b[0]; 
                chengfa(a,b,c); 
                b[0]=-b[0]; 
                c[0]=-c[0]; 
			} 
            if(a[0]<0&&b[0]<0)              //a、b都为负数
			{
                a[0]=-a[0]; 
                b[0]=-b[0]; 
                chengfa(a,b,c); 
                a[0]=-a[0]; 
                b[0]=-b[0]; 
			}
            chengfa(a,b,c);
            printf("A:\n");
            print(a);
            printf("B:\n");
            print(b);
            printf("C=A*B:\n");
            print(c);
            break;
          case 4:
            printf("请输入大整数A:");
            read(a);
            printf("请输入大整数B:");
            read(b);
            if(b[0]==1&&b[1]==0)           //b为0时 
				printf("错误!大整数B不可为零!\n");
            else
			{
               printf("A:\n");
               print(a);
               printf("B:\n");
               print(b);
               printf("C=A/B:\n");
               m=chufa(a,b); 
               if(m==-1) print(a);         //b为1时 
               else printf("%d\n",m); 
			}
               break;
	       case 0:n=0;break;
	       default:printf("输入错误,请重新输入:");
       }
   }
}

⌨️ 快捷键说明

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