#include<iostream>
#include<string>
using namespace std;

string BigIntegerMod(const string &str1,const string &str2) // str1%str2


{
int i;
int len,len1,len2,index;
bool flag;

len1=str1.length();
len2=str2.length();
len=len1-len2;
if(len<0) return str1;

int *num1=new int[len1+2];
int *num2=new int[len2+2];

memset(num1,0,sizeof(int)*(len1+2));
memset(num2,0,sizeof(int)*(len2+2));

for(i=len1-1,index=0;i>=0;--i)

{
num1[index++]=str1[i]-'0';
}
for(i=len2-1,index=0;i>=0;--i)

{
num2[index++]=str2[i]-'0';
}

while(true)

{
for(i=len1-1;i>=0;i--)

{
if(num1[i])

{
len1=i+1;
break;
}
if(i==0) len1=0;
}

len=len1-len2;
if(len<0) break;

flag=false;
index=0;

for(i=len1-1;i>=len;i--)

{
if(num1[i]==num2[i-len]) continue;
else if(num1[i]<num2[i-len])

{
flag=true;
break;
}
else break;
}

if(flag) --len;
if(len<0) break;

while(++index)

{
flag=false;
for(i=len1-1;i>=len;i--)

{
if(num1[i]==num2[i-len]) continue;
else if(num1[i]<num2[i-len])

{
flag=true;
break;
}
else break;
}
if(flag)

{
--index;
break;
}

for(i=len;i<len1;i++)

{
num1[i]-=num2[i-len];
if(num1[i]<0)

{
num1[i]+=10;
--num1[i+1];
}
}
}

if(index==0) break;
}

string ans;
flag=false;
for(i=len1;i>=0;--i)

{
if(flag||num1[i])

{
flag=true;
ans+='0'+num1[i];
}
}
if(!flag) ans="0";

delete [] num1;
delete [] num2;

return ans;
}

int main()


{
string str,str1,str2;
while(cin>>str1>>str2)

{
str=BigIntegerMod(str1,str2);
cout<<str<<endl;
}
return 0;
}

posted on 2011-07-31 15:24
wuxu 阅读(507)
评论(0) 编辑 收藏 引用 所属分类:
高精度