找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

C++-高精度计算器

admin 2019-5-29 05:23 128人围观 C++相关

//说明:直接输入几加/减/乘/除几即可



#include <bits/stdc++.h>
using namespace std;

struct bign
{
 int a[110000],len,f=1;
 bool zfsign;
};
int j;
string first;
string ch,dh;
void fchange(bign &a)
{
 for(int i=0,j=a.len-1;i<a.len;i++,j--)
 a.a[i]=ch[j]-'0';
}
void dchange(bign &a)
{
 for(int i=0,j=a.len-1;i<a.len;i++,j--)
 a.a[i]=dh[j]-'0';
}
void fchchange(bign &a)
{
 for(int i=1,j=a.len-1;i<=a.len;i++,j--)
 a.a[i]=ch[j]-'0';
}
void dchchange(bign &a)
{
 for(int i=1,j=a.len-1;i<=a.len;i++,j--)
 a.a[i]=dh[j]-'0';
}
void out(bign &a)
{
 if(a.len==0)
 {
  cout<<"0"<<endl;
  return;
 }
 if(a.f==-1)printf("-");
 while(a.a[a.len]==0&&a.len>=1)a.len--;
 for(int i=a.len;i>=0;i--)
 printf("%d",a.a[i]);
 printf("\n");
}
void chout(bign &a)
{
 if (a.len==0)
 {
  cout<<"0"<<endl;
  return;
 }
 if(a.f==-1)printf("-");
 while(a.a[a.len]==0&&a.len>=1)a.len--;
 for(int i=a.len;i>0;i--)
 printf("%d",a.a[i]);
 printf("\n");
}
bool cmp(bign &a,bign &b)
{
 while(a.a[a.len-1]==0&&a.len>1)a.len--;
 while(b.a[b.len-1]==0&&b.len>1)b.len--;
 if(a.len!=b.len)return a.len>b.len;
 for(int i=a.len-1;i>=0;i--)
 {
  if(a.a[i]!=b.a[i])return a.a[i]>b.a[i];
 }
 return true;
}
void ssub(bign &a,bign &b,bign &c)
{
 if(cmp(a,b)==false)
 {
  ssub(b,a,c);
  c.f=-1;
 }
 else
 {
  memset(c.a,0,sizeof(c.a));
  for(int i=0;i<a.len||i<b.len;i++)
  {
   c.a[i]+=a.a[i];
   if(i<b.len)c.a[i]-=b.a[i];
   if(c.a[i]<0)
   {
    c.a[i]+=10;
    c.a[i+1]--;
   }
  }
  c.len=a.len;
  while(c.a[c.len]!=0)c.len++;
 }
}
void add(bign &a,bign &b,bign &c)
{
 if(a.f==-1&&b.f==-1)
 {
  c.f=-1;
  a.f=1;
  b.f=1;
  add(a,b,c);
  return;
 }
 else if(a.f==-1&&b.f==1)
 {
  if(cmp(a,b)==true)c.f=-1;
  else c.f=1;
  a.f=1;
  ssub(a,b,c);
  return;
 }
 else if(a.f==1&&b.f==-1)
 {
  if(cmp(a,b)==true)c.f=1;
  else c.f=-1;
  b.f=1;
  ssub(a,b,c);
  return;
 }
 else
 {
  c.len=max(a.len,b.len)+1;
  memset(c.a,0,sizeof(c.a));
  for(int i=0;i<a.len||i<b.len;i++)
  {
   if(i<a.len)c.a[i]+=a.a[i];
   if(i<b.len)c.a[i]+=b.a[i];
   c.a[i+1]+=c.a[i]/10;
   c.a[i]%=10;
  }
 }
}
void sub(bign &a,bign &b,bign &c)
{
 if(a.f==-1&&b.f==1)
 {
  c.f=-1;
  a.f=1;
  add(a,b,c);
  return;
 }
 else if(a.f==1&&b.f==-1)
 {
  c.f=1;
  b.f=1;
  add(a,b,c);
  return;
 }
 else if(a.f==-1&&b.f==-1)
 {
  a.f=1;
  b.f=1;
  sub(b,a,c);
 }
 else
 {
  if(cmp(a,b)==false)
  {
   sub(b,a,c);
   c.f=-1;
  }
  else
  {
   memset(c.a,0,sizeof(c.a));
   for(int i=0;i<a.len||i<b.len;i++)
   {
    c.a[i]+=a.a[i];
    if(i<b.len)c.a[i]-=b.a[i];
    if(c.a[i]<0)
    {
     c.a[i]+=10;
     c.a[i+1]--;
    }
   }
   c.len=a.len;
   while(c.a[c.len]!=0)c.len++;
  }
 }
}
void cheng(bign &a,bign &b,bign &c)
{
 if(a.f!=b.f)c.f=-1;
 else c.f=1;
 for(int i=0;i<110000;i++)c.a[i]=0;
 for(int i=0;i<a.len||i<b.len;i++)
 {
  for(int j=0;j<b.len;j++)
  {
   c.a[i+j]+=a.a[i]*b.a[j];
   c.a[i+j+1]+=c.a[i+j]/10;
   c.a[i+j]%=10;
  }
 }
 c.len=a.len+b.len-1;
 for(int i=0;i<a.len;i++)
 {
  a.a[i+1]+=a.a[i]/10;
  a.a[i]%=10;
 }
 while(c.a[c.len]!=0)
 {
  c.a[c.len+1]+=c.a[c.len]/10;
  c.a[c.len]%=10;
  c.len++;
 }
}
int bijiao(bign &a,bign &b)
{   
 int i;   
 if (a.len>b.len) return 1;
 if (a.len<b.len) return -1; 
 for (i=a.len;i>0;i--)
 {
  if (a.a[i]>b.a[i]) return 1;
  if (a.a[i]<b.a[i]) return -1;
 }    return 0;
}
void jian(bign &a,bign &b)
{   
 int pd;   
 int i;  
 pd=bijiao(a,b);
 if (pd==0)
 {
  a.len=0;
  return;
 } 
 if(pd==1)   
 {       
  for (i=1;i<=a.len;i++)      
  {           
   if (a.a[i]<b.a[i])
   {
    a.a[i+1]--;
    a.a[i]+=10;
   }         
   if (a.a[i]>=b.a[i])a.a[i]-=b.a[i];       
  }      
  while((a.a[a.len]==0)&&(a.len>0))a.len--;      
  return;   
 }
}
void numcpy(bign &p,bign &q,int det)
{   
 for (int i=1;i<=p.len;i++) q.a[i+det-1]=p.a[i];
 q.len=p.len+det-1;
}
bign tmp;
void chugao(bign &a,bign &b,bign &c)
{   
 if(a.f!=b.f)c.f=-1;
 else c.f=1;
 int i;   
 c.len=a.len-b.len+1;   
 for (i=c.len;i>0;i--)   
 {         
  memset(tmp.a,0,sizeof(tmp.a));   
  numcpy(b,tmp,i);        
  while (bijiao(a,tmp)>=0)
  {
   c.a[i]++;
   jian(a,tmp);
  }  
 }   
 while((c.a[c.len]==0)&&(c.len>0))
 c.len--;
}
bign a,b,c;
char sign;
int main()
{
 int chlength=0,dhlength=0;
top:cin>>first;
 int find;
 for(int i=1;i<first.length();i++)
 {
  if(first[i]=='+'||first[i]=='-'||first[i]=='*'||first[i]=='/')
  {
   sign=first[i];
   find=i;
   break;
  }
 }
 if(first[0]=='-')
 {
  a.zfsign=false;
  a.f=-1;
  for(int i=1;i<find;i++)
  {
   ch[i-1]=first[i];
   chlength++;
  }
 }
 else
 {
  a.f=1;
  for(int i=0;i<find;i++)
  {
   ch[i]=first[i];
   chlength++;
  }
 }
 if(first[find+1]=='-')
 {
  b.zfsign=false;
  b.f=-1;
  j=0;
  for(int i=find+2;i<=first.length()-1;i++)
  {
   dh[j]=first[i];
   dhlength++;
   j++;
  }
 }
 else
 {
  j=0;
  b.f=1;
  for(int i=find+1;i<=first.length()-1;i++)
  {
   dh[j]=first[i];
   dhlength++;
   j++;
  }
 }
 a.len=chlength;
 b.len=dhlength;
 switch(sign)
 {
  case'+':
  fchange(a);
  dchange(b);
  printf("和:");
  add(a,b,c);
  break;
  case'-':
  fchange(a);
  dchange(b);
  printf("差:");
  sub(a,b,c);
  break;
  case'*':
  fchange(a);
  dchange(b);
  printf("积:");
  cheng(a,b,c);
  break;
  case'/':
  fchchange(a);
  dchchange(b);
  if(b.len==1&&b.a[0]==0)
  {
   printf("Sorry,we can't do this operstion.\nPlease try again!\n");
   goto top;
  }
  chugao(a,b,c);
  printf("商:");
  chout(c);
  printf("余数:");
  chout(a);
  return 0;
  break;
 default:
  printf("Sorry,we can't do this operstion.\nPlease try again!\n");
  goto top;
  break;
 }
 out(c);
 printf("\n");
 return 0;
}

----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:长春华泽辅导班,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

yafeilinux和他的朋友们微信公众号二维码

微信公众号

专注于Qt嵌入式Linux开发等。扫一扫立即关注。

Qt开源社区官方QQ群二维码

QQ交流群

欢迎加入QQ群大家庭,一起讨论学习!

我有话说......