标签:can nbsp 函数 乘法 big color 交换 min 阶乘
乘法
string mul(string a,string b)
{
reverse(a.begin(),a.end());//交换顺序,方便计算
reverse(b.begin(),b.end());
int len1=a.size();
int len2=b.size();
for(int i = 0;i < len1;++i)
for(int j = 0;j < len2;++j)
t[i+j]=(a[i]-‘0‘)*(b[j]-‘0‘)+t[i+j];//先整体乘起来,不进位
int over=0;
for(int i = 0;i < len1+len2;++i)//进位
{
t[i]+=over;
over=0;
if(t[i]>=10)
{
over=t[i]/10;
t[i]%=10;
}
}
string c;
for(int i = 0;i < len1+len2;++i)
{
c+=(t[i]+‘0‘);
}
return c;
}
减法(只允许正数):
string sub(string a,string b)
{
string now;
now.erase(0);
if(cmp(a,b))//比较a,b谁长
{
string c;
c=a;
a=b;
b=c;
now+=‘-‘;
}
int len1=a.size();
int len2=b.size();
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
int over=0;
int len=min(len1,len2);
char c;
for(int i = 0;i < len;++i)//减去短的数
{
c=a[i]-b[i]+over;
over=0;
if(c<0)
{
c+=10;
over=-1;
}
c=c+‘0‘;
now+=c;
}
for(int i = len;i < len1;++i)加上长的数的后面的部分
{
c=a[i]-‘0‘+over;//记得进位
over=0;
if(c<0)
{
over=-1;
c+=10;
}
c=c+‘0‘;
now+=c;
}
if(now[0]==‘-‘)//负号处理
reverse(now.begin()+1,now.end());
else
reverse(now.begin(),now.end());
return now;
}
bool cmp(string a,string b)//比较函数
{
if(a.size()>b.size())
return false;
else if(a.size()==b.size())
{
for(int i = 0;i < a.size();++i)
{
if(a[i]==b[i])
continue;
else if(a[i]>b[i])
return false;
else
return true;
}
}
else
return true;
}
大数阶乘(hdu1042):
#include <stdio.h> #include <cstring> #include <string> #include <stdlib.h> using namespace std; int a[100005]; int main() { int n; while(~scanf("%d",&n)) { memset(a,0,sizeof(a)); a[1]=1; int wei=1; for(int i = 1;i <= n;++i) { int over=0; for(int j = 1;j <= wei;++j) { a[j]=i*a[j]+over; over=a[j]/10; a[j]=a[j]%10; } while(over>0) { wei++; a[wei]=over%10; over=over/10; } } for(int i = wei;i >= 1;--i) printf("%d",a[i]); printf("\n"); } return 0; }
大数求余
LL bigmod(string a,LL b)
{
int len=a.size();
LL ans=0;
for(int i=0;i<len;++i)
ans=(ans*10%b+a[i]-‘0‘)%b;
return ans;
}
标签:can nbsp 函数 乘法 big color 交换 min 阶乘
原文地址:https://www.cnblogs.com/aaddvvaanntteezz/p/10238097.html