

#include <iostream>
using namespace std;
int main()
{
char in[1001];
int i,j,d,len,num[1001],res[1001];
while(cin>>in)
{
len=strlen(in);
for(i=1;i<=len;++i)
num[i]=in[len-i]-48;
for (i=len+1;i<=1000;++i)
num[i]=0;
for(i=0;i<1001;i++)
res[i]=0;
d=0;
for(i=len;i>=1;i--)
{
d=d*10+num[i];
res[i]=d/3;
d%=3;
}
while(len>1&&res[len]==0) len--;
for(i=len;i>=1;i--)
cout<<res[i];
cout<<endl;
}
return 0;
}
结构定义,输入,输入


#define maxsize 100
struct hp
{
int len;
int s[maxsize+1];
};
void input(hp &a,string str)
{
int i;
while(str[0]=='0' && str.size()!=1)
str.erase(0,1);
a.len=(int)str.size();
for(i=1;i<=a.len;++i)
a.s[i]=str[a.len-i]-48;
for (i=a.len+1;i<=maxsize;++i)
a.s[i]=0;
}
void print(const hp &y)
{
int i;
for(i=y.len;i>=1;i--)
cout<<y.s[i];
cout<<endl;
}
高精度加法
大数左对齐,个位在最左边,高位在右边


void plus(const hp &a,const hp &b,hp &c) //高精度加法
{
int i,len;
for(i=1;i<=maxsize;i++) c.s[i]=0;
if(a.len>b.len) len=a.len;
else len=b.len;
for(i=1;i<=len;i++)
{
c.s[i]+=a.s[i]+b.s[i];
if(c.s[i]>=10)
{
c.s[i]-=10;
c.s[i+1]++;
}
}
if(c.s[len+1]>0) len++;
c.len=len;
}
高精度减法


void subtract(const hp &a,const hp &b,hp &c) //高精度减法
{
int i,len;
for(i=1;i<=maxsize;i++) c.s[i]=0;
if(a.len>b.len) len=a.len;
else len=b.len;
for(i=1;i<=len;i++)
{
c.s[i]+=a.s[i]-b.s[i];
if(c.s[i]<0)
{
c.s[i]+=10;
c.s[i+1]--;
}
}
while(len>1&&c.s[len]==0) len--;
c.len=len;
}


int compare(const hp &a,const hp &b)
{
int len;
if(a.len>b.len) len=a.len;
else len=b.len;
while(len>0 && a.s[len]==b.s[len]) len--;
if(len==0) return 0;
else return a.s[len]-b.s[len];
}
高精度*单精度


void multiply(const hp &a,int b,hp &c) //高精度*单精度
{
int i,len;
for(i=1;i<=maxsize;i++) c.s[i]=0;
len=a.len;
for(i=1;i<=len;i++)
{
c.s[i]+=a.s[i]*b;
c.s[i+1]+=c.s[i]/10;
c.s[i]%=10;
}
len++;
while(c.s[len]>=10)
{
c.s[len+1]+=c.s[len]/10;
c.s[len]%=10;
len++;
}
while(len>1&&c.s[len]==0) len--;
c.len=len;
}
高精度*高精度


void multiplyh(const hp &a,const hp &b,hp &c) //高精度*高精度
{
int i,j,len;
for(i=1;i<=maxsize;i++) c.s[i]=0;
for(i=1;i<=a.len;i++)
for(j=1;j<=b.len;j++)
{
c.s[i+j-1]+=a.s[i]*b.s[j];
c.s[i+j]+=c.s[i+j-1]/10;
c.s[i+j-1]%=10;
}
len=a.len+b.len+1;
while(len>1&&c.s[len]==0) len--;
c.len=len;
}
高精度/单精度 {d为余数}


void divide(const hp &a,int b,hp &c,int &d) //高精度/单精度 {d为余数}
{
int i,len;
for(i=1;i<=maxsize;i++) c.s[i]=0;
len=a.len;
d=0;
for(i=len;i>=1;i--)
{
d=d*10+a.s[i];
c.s[i]=d/b;
d%=b;
}
while(len>1&&c.s[len]==0) len--;
c.len=len;
}
高精度*10


void multiply10(hp &a) //高精度*10
{
int i;
for(i=a.len;i>=1;i--)
a.s[i+1]=a.s[i];
a.s[1]=0;
a.len++;
while(a.len>1&&a.s[a.len]==0) a.len--;
}
高精度/高精度


void divideh(const hp &a,const hp &b,hp &c,hp &d) //高精度/高精度 {d为余数}
{
hp e;
int i,len;
for(i=1;i<=maxsize;i++)
{
c.s[i]=0;
d.s[i]=0;
}
len=a.len;
d.len=1;
for(i=len;i>=1;i--)
{
multiply10(d);
d.s[1]=a.s[i];
while(compare(d,b)>=0)
{
subtract(d,b,e);
d=e;
c.s[i]++;
}
}
while(len>1&&c.s[len]==0) len--;
c.len=len;
}
此题解法将大数右对齐,个位在最右边,与上面的手法略有不同


#include <iostream>
#include<string.h>
using namespace std;
char m[111],can[111],n[111];
int len;
void jia()
{
int i,jinwei=0;
for(i=110;i>=111-len;i--)
{
m[i] += n[i]+ jinwei -48;
if(m[i] >'9')
{
jinwei =1;
m[i] -=10;
}
else
jinwei = 0;
}
while(jinwei == 1)
{
m[i]++;
if(m[i]>'9')
{
jinwei = 1;
m[i] -= 10;
}
else
jinwei=0;
i--;
}
}
int main()
{
int i;
for(i=0;i<=110;i++)
m[i] = '0';
while(scanf("%s",can))
{
len = strlen(can);
if(len == 1 && can[0] == '0')
break;
for(i=0;i<len;i++)
n[111-len+i] = can[i];
jia();
}
for(i=0;i<110;i++)
if(m[i] != '0')
break;
for(;i<=110;i++)
printf("%c",m[i]);
printf("\n");
return 0;
}
TOJ 2804. The Art Gallery Problem
高精度/单精度,照模板来就行


#include <iostream>
using namespace std;
int main()
{
char in[1001];
int i,j,d,len,num[1001],res[1001];
while(cin>>in)
{
len=strlen(in);
for(i=1;i<=len;++i)
num[i]=in[len-i]-48;
for (i=len+1;i<=1000;++i)
num[i]=0;
for(i=0;i<1001;i++)
res[i]=0;
d=0;
for(i=len;i>=1;i--)
{
d=d*10+num[i];
res[i]=d/3;
d%=3;
}
while(len>1&&res[len]==0) len--;
for(i=len;i>=1;i--)
cout<<res[i];
cout<<endl;
}
return 0;
}