Calculator
Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1400 Accepted Submission(s): 348
1) Assignment: X=Y
2) Addition: X+=Y
3) Multiplication: X*=Y
Notice that X and Y are two registers, and they may be the same.
Initially, all the registers are stored by integer 1. Your program should operate several operations and output the final result for 10 registers. You may assume that the length of each decimal number stored in the register is no longer than 5000.
Each line contains an operation to be calculated.
The number of operations will no more than 300000.
Calculator
看了題解=_=,有個”=“號的操作,如A=B,則之前像A+=B,A-=C,會出現冗餘操作,去掉這些操作就可以了。如果不優化,高精度要寫的非常好才能過,可我的太醜了。。,不管是即時進位還是最後進位都TLE了
不會用JAVA,只好用c++了
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
char A[10][100000];
int ans[100000];
char oper[300010][20];
bool fun[300010],need[10];
int bigint(char *s1,char *s2,char op)//s1,s2都是從高位到低位存的
{
int ints1[100000]={0};
int ints2[100000]={0};
memset(ans,0,sizeof(ans));
int lenth1=strlen(s1);
int lenth2=strlen(s2);
int lenth;
for(int i=0;i<lenth1;i++)
{
ints1[i]=s1[lenth1-1-i]-'0';
// cout<<ints1[i];
}
//cout<<endl;
for(int i=0;i<lenth2;i++)
{
ints2[i]=s2[lenth2-1-i]-'0';
// cout<<ints2[i];
}
//cout<<endl;
if(op=='*')
{
lenth=lenth1+lenth2;
for(int i=0;i<lenth1;i++)
for(int j=0;j<lenth2;j++)
{
ans[i+j]+=ints1[i]*ints2[j];
/*
int k=0;
while(ans[i+j+k]>=10)
{
ans[i+j+k+1]+=ans[i+j+k]/10;
ans[i+j+k]=ans[i+j+k]%10;
k=k+1;
}
*/
}
for(int i=0;i<lenth;i++)
if(ans[i]>=10)
{
ans[i+1]+=ans[i]/10;
ans[i]=ans[i]%10;
}
if(ans[lenth-1]==0)
lenth-=1;
}
else
{
if(op=='+')
{
lenth=max(lenth1,lenth2);
for(int i=0;i<lenth1||i<lenth2;i++)
{
ans[i]+=ints1[i]+ints2[i];
/*
int k=0;
while(ans[i+k]>=10)
{
ans[i+k+1]+=ans[i+k]/10;
ans[i+k]=ans[i+k]%10;
k=k+1;
}
*/
}
for(int i=0;i<=lenth;i++)
if(ans[i]>=10)
{
ans[i+1]+=ans[i]/10;
ans[i]=ans[i]%10;
}
if(ans[lenth]!=0)
lenth+=1;
}
}
//cout<<lenth<<endl;
return lenth;
}
void innit()
{
for(int i=0;i<10;i++)
{
strcpy(A[i],"1");
need[i]=true;
}
}
int main()
{
innit();
char s[20];
int k=0;
while(scanf("%s",oper[k++])!=EOF)
;
for(int i=k-1;i>=0;i--)
{
fun[i]=need[oper[i][0]-'A'];
if(oper[i][1]=='=')
{
need[oper[i][0]-'A']=false;
need[oper[i][2]-'A']=true;
}
}
for(int i=0;i<k;i++)
{
if(fun[i])
{
int lenth;
if(oper[i][1]!='=')
{
lenth=bigint(A[oper[i][0]-'A'],A[oper[i][3]-'A'],oper[i][1]);
for(int j=0;j<lenth;j++)
A[oper[i][0]-'A'][j]=ans[lenth-j-1]+'0';
A[oper[i][0]-'A'][lenth]='\0';
}
else
{
strcpy(A[oper[i][0]-'A'],A[oper[i][2]-'A']);
}
}
}
for(int i=0;i<10;i++)
{
cout<<A[i]<<endl;
}
return 0;
}