#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 阅读(501)
评论(0) 编辑 收藏 引用 所属分类:
高精度