不得不数 PAT要求的是乘法与除法是高精度与一个低精度就行了 但是这题是高精度与高精度 所以花的时间有点多 哎 还是自己太菜
输入
多行输入,每行两个整数,中间用运算符分隔。运算符为±/中的一种,分别表示加减乘整除。除了数字和运算符外,不会出现其余字符。
注意
这里每个操作数位数在1000位以内
样例输入
12+99
50-123
2525
726/12
样例输出
111
-73
625
60
直接上代码 吧 我写的有注释可以看懂
#include <bits/stdc++.h>
using namespace std;
const int maxn=1010;
struct bign
{
int len;
int d[maxn];
bign()
{
memset(d,0,sizeof(d));
len=0;
}
};
bign change(char str[])
{
bign a;
a.len=strlen(str);
//低位在数组最开始
for(int i=0;i<a.len;i++)
{
a.d[i]=str[a.len-i-1]-'0';
}
return a;
}
bign add(bign a,bign b)
{
bign c;
int carry=0;
for(int i=0;i<a.len||i<b.len;i++)
{
int temp=carry+a.d[i]+b.d[i];
c.d[c.len++]=temp%10;
carry=temp/10;
}
if(carry!=0)
c.d[c.len++]=carry;
return c;
}
void print(bign a)
{
for(int i=a.len-1;i>=0;i--)
{
printf("%d",a.d[i]);
}
printf("\n");
}
bign sub(bign a,bign b)//减法
{
bign c;
for(int i=0;i<a.len||i<b.len;i++)
{
if(a.d[i]<b.d[i]) //如果3-4 不够减 我们从高位借10 高位数需要减1 低位需要加10
{
a.d[i]+=10;
a.d[i+1]--;
}
c.d[c.len++]=a.d[i]-b.d[i];
}
while(c.d[c.len-1]==0&&c.len-1>=1)
c.len--;
return c;
}
bign multi(bign a,bign b)
{
bign c;
for(int i=0;i<a.len;i++)
{
for(int j=0;j<b.len;j++)
{
c.d[i+j]+=a.d[i]*b.d[j];//按乘法
}
}
c.len=a.len+b.len;
for (int i=0;i<c.len;++i)
if (c.d[i]>9)
{
c.d[i+1]+=c.d[i]/10;
c.d[i]%=10;
}//进位
while(c.d[c.len-1]==0&&c.len-1>=1)
c.len--;
return c;
}
bool bigger(bign a,bign b, int aLen, int bLen){
if(aLen < bLen){
return 0;
}else if(aLen > bLen){
return 1;
}else{`在这里插入代码片`
for(int i=aLen-1, j=bLen-1; i>=0 && j>=0; i--,j--){
if(a.d[i]<b.d[j]){
return 0;
}else if(a.d[i]>b.d[j]){
return 1;
}
}
return 1;
}
}
int sub(bign &a,bign &b, int aLen, int bLen){
bign c;
int maxLen=max(aLen,bLen);
for(int i=0; i<maxLen; i++){
if(a.d[i]<b.d[i]){
a.d[i] += 10;
a.d[i+1]--;
}
c.d[c.len++]=a.d[i]-b.d[i];
}
while(c.d[maxLen-1]==0&&maxLen>=1)
maxLen--;
for(int i=0; i<maxLen; i++){
a.d[i] = c.d[i];
}
return maxLen;
}
bool cmp(bign a,bign b) //这个函数 是用来测试减法时 如果a<b 我们就需要b-a计算 最后输出的时候前面加上一个-
{
int lenA=a.len;
int lenB=b.len;
if(lenA>lenB)
return 1;
else if(lenA<lenB)
return 0;
else
{
for(int i=lenA-1;i>=0;i--)
{
if(a.d[i]>b.d[i])
return 1;
else if(a.d[i]<b.d[i])
return 0;
}
}
}
int main()
{
char str1[maxn],str2[maxn];
char str3[2*maxn];
int sum=0;
while(cin>>str3)
{
if(strcmp(str3,"0")==0)
return 0;
//如果我们碰到了符号 我们就把符号前后两个数放到char数组里
int i=0;
while(str3[i]>='0'&&str3[i]<='9')
{
i++; //12+99 i等于2
}
int op=i,z=0,j;
int len=strlen(str3);
for(j=0;j<i;j++)
str1[j]=str3[j];
str1[j]='\0';
for(int j=op+1;j<len;j++)
str2[z++]=str3[j];
str2[z]='\0';
bign a=change(str1);
bign b=change(str2);
if(str3[op]=='+')
print(add(a,b));
else if(str3[op]=='-')
{
//首先比较一下大小
if(cmp(a,b))
print(sub(a,b));
else
{
printf("-");
print(sub(b,a));
}
}
else if(str3[op]=='*')
print(multi(a,b));
else if(str3[op]=='/')
{
//这里是用来被除数能减去除数多少次,减的次数就是商,减完剩下的部分就是余数。
while(bigger(a, b, a.len, b.len)){
a.len= sub(a, b, a.len, b.len);
sum++;
}
cout << sum << endl;
}
}
return 0;
}