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

📄 大数运算3.txt

📁 计算机实现大数加减乘除运算时应该遵循一定的规则
💻 TXT
字号:
/*用数组存储数字,可以超越数据类型的限制,实现极大数的加法,减法和乘法 */
/*2005-3-7   梁见斌*/ 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 80

int a[MAX]={0}, b[MAX]={0};
int *r, *s;
char e[40], f[40];/* e[30]和f[30]存放以字符串形式输入的乘数和被乘数*/ 
char *p, *q;
   
void NiZhi(int *ShuZu, int len);/*把数字逆置,把个位数字存储在a[0]*/ 
void ZhuanHuan(char *ZhiFu, int *ShuZi, int len);/*把字符改存为整型数字*/ 
int PanDuan(int len);/*当len1=len2时判断a[]和 b[]谁大 */
void JiaFa(int len1, int len2);
void JianFa(int len1, int len2);
void ChengFa(int len1, int len2);

int main(void)
{
   int len1, len2;
   int choice;
   
   do{
       puts("请您选择操作的方式:");
        puts("\t加法请按1 ");
        puts("\t减法请按2 ");
        puts("\t乘法请按3 ");
        scanf("%d", &choice);
   }while(choice < 1 || choice >3);  
   
   r=a;
   s=b;
   p=e;
   q=f;
   puts("Inter m:");
   scanf("%s", p);
   puts("Inter n:");
   scanf("%s", q);
   
   len1=strlen(e);
   len2=strlen(f);
   ZhuanHuan(p, r, len1);
   ZhuanHuan(q, s, len2);
   
   NiZhi(r, len1);
   NiZhi(s, len2);

      switch(choice)
      {
         case 1: JiaFa(len1, len2);
                 break;
       case 2: JianFa(len1, len2);
                 break;          
      case 3: ChengFa(len1, len2);
                 break;
       default: printf("It's error");          
      }   
       
   system("pause");
   return 0;       
}   

void NiZhi(int *ShuZu, int len)
{
   int i, t;
   for(i=0; i<len/2; i++)
   {
      t=*(ShuZu+i);
      *(ShuZu+i)=*(ShuZu+len-i-1);
      *(ShuZu+len-i-1)=t;
   } 
} 

void ZhuanHuan(char *ZhiFu, int *ShuZi, int len)
{
   int i;
   for(i=0; i<=len-1; i++)
       *(ShuZi+i)=int(*(ZhiFu+i))-48;     
} 

void ChengFa(int len1, int len2)
{
   int i, j, k;
   int c[MAX]={0}, aa[MAX]={0};/*a[max]和aa[max]存放被乘数,b[max]存放乘数,c[max]存放积*/ 
   int x, jinwei, d;
   
   for(i=0; i<=len2; i++)
   {
      for(j=0; j<=len1; j++)/*每次都使 aa[ ]表示被乘数*/
          aa[j]=a[j]; 
      d=20;/*提供足够多的存储空间以存放积的进位,此处设为20,可根据数据的大小调节*/ 
      jinwei=0;/*c表示积的进位,初值为0*/ 
     
      for(j=0; j<=len1+d; j++)/*用乘数的每一位从个位开始依次和被乘数相乘,用aa[ ]存储当前积*/ 
      {
         x=aa[j]*b[i]+jinwei;
         jinwei=x/10;
         aa[j]=x%10;
      }  
      while(a[j] == 0)/*用j表示现有数字的个数,多出的存储空间应消除*/ 
          j--;
          
      d=4;/*提供足够多的存储空间以存放积的进位,此处设为4,可根据数据的大小调节*/ 
      jinwei=0;/*c表示积的进位,初值为0*/ 
      for(k=0; k<=j+d; k++)/*c[max]存放原始积,注意每次把当前积与原始积时相加时两者的位置对应情况*/ 
      {
         x=aa[k]+c[k+i]+jinwei;
         jinwei=x/10;
         c[k+i]=x%10;
      }   
   }  
   k=k+i; /*用k表示现有数字的个数,多出的存储空间应消除*/ 
   while(c[k] == 0)
          k--;
          
   printf("%s *  %s =\n", p, q);
      for(i=k; i>=0; i--)
       printf("%d",c[i]);   
}

void JiaFa(int len1, int len2)
{
   int i, j;
   int x, jinwei, max;
   
   max=(len1 >= len2)?len1:len2;    
   jinwei=0;
   for(i=0; i<=max+2; i++)
   {
      x=a[i]+b[i]+jinwei;
      jinwei=x/10;
      a[i]=x%10;
   }  
   while(a[i] == 0)/*用j表示现有数字的个数,多出的存储空间应消除*/ 
       i--;
   printf("%s +  %s =\n", p, q);
      for(j=i; j>=0; j--)
       printf("%d",a[j]);
}   

void JianFa(int len1, int len2)
{
   int i, j;
   int max;
   int flag=0;
        
   if(len1 == len2)/*当len1=len2时判断a[]和 b[]谁大 */
       flag=PanDuan(len1);
   if((len1 > len2) || (len1 == len2) && flag)/*若m大于n直接按m-n计算*/ 
   {
      for(i=0; i<len1; i++)
      {
         if(a[i] >= b[i])
             a[i]=a[i]-b[i];
         else
         {
            a[i+1]-=1;
            a[i]=a[i]+10-b[i];
         }   
      }  
      while(a[i] == 0)/*用j表示现有数字的个数,多出的存储空间应消除*/ 
          i--;
      printf("%s - %s =\n", p, q);
         for(j=i; j>=0; j--)
          printf("%d",a[j]);
   }  
   else/*若m小于n,则按n-m计算,输出结果前面加负号*/ 
      {
      for(i=0; i<len2; i++)
      {
         if(b[i] >= a[i])
             b[i]=b[i]-a[i];
         else
         {
            b[i+1]-=1;
            b[i]=b[i]+10-a[i];
         }   
      }  
      while(b[i] == 0)/*用j表示现有数字的个数,多出的存储空间应消除*/ 
          i--;
      printf("%s - %s =\n", p, q);
      printf("-");
         for(j=i; j>=0; j--)
          printf("%d",b[j]);
   }  
}

int PanDuan( int len) 
{
   int i=len;
   while(a[i] >= b[i] && i >= 0)
       i--;
      if(i >= 0)
          return 0;
   else if((i < 0) && (a[i+1] == b[i+1]))
      {
         printf("\nThe answer is 0");
         system("pause");
      exit(0);
   }   
   else
       return 1; 
}  

⌨️ 快捷键说明

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