对于大数的加减乘除,不会JAVA,只会用C来模拟
HDU-1002-A+B Problem II
http://acm.hdu.edu.cn/showproblem.php?pid=1002
简单的大数相加,用字符串模拟即可
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char s1[1005],s2[1005];
int s[1200];
int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int i,temp,t,k;
int len1,len2,len;
scanf("%d",&t);
for(k=1;k<=t;k++)
{
scanf("%s %s",s1,s2);
len1=strlen(s1);
len2=strlen(s2);
len=max(len1,len2);
memset(s,0,sizeof(s));
for(i=len1-1;i>=0;i--) //将s1从低位加到s
s[len1-1-i]+=(s1[i]-'0');
for(i=len2-1;i>=0;i--)
s[len2-1-i]+=(s2[i]-'0'); //将s2从低位加到s
for(i=0,temp=0;i<len;i++) //处理进位
{
s[i]+=temp;
temp=(s[i]/10);
s[i]%=10;
}
printf("Case %d:\n",k);
printf("%s + %s = ",s1,s2);
if(temp>0)
printf("%d",temp);
for(i=len-1;i>=0;i--) //逆向输出
printf("%d",s[i]);
printf(k==t?"\n":"\n\n");
}
return 0;
}
HDU-1042-N!
http://acm.hdu.edu.cn/showproblem.php?pid=1042
字符串模拟大数的阶乘
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n;
void sol(int n) //模拟n的阶乘
{
int i,len,j,temp;
int a[50000];
a[0]=1;
len=1;
for(i=2;i<=n;i++)
{
for(j=0;j<len;j++)
a[j]*=i;
for(j=0,temp=0;j<len;j++)
{
a[j]+=temp;
temp=(a[j]/10);
a[j]%=10;
}
while(temp)
{
a[len++]=(temp%10);
temp/=10;
}
}
for(i=len-1;i>=0;i--)
printf("%d",a[i]);
printf("\n");
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0||n==1)
{
printf("1\n");
continue;
}
sol(n);
}
return 0;
}
HDU-1753-大明A+B
http://acm.hdu.edu.cn/showproblem.php?pid=1753
带小数的大数加法,把整数和小数分开即可
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int flag1,flag2; //表示小数点的位置
char s1[500],s2[500];
int alen;//整数长度
int blen;//小数长度
int a[500]; //计算小数部分的和
int b[500]; //计算整数部分的和
int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int i,t,j,temp;
while(scanf("%s %s",s1,s2)!=EOF)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
flag1=flag2=-1;
for(i=0;i<strlen(s1);i++)
{
if(s1[i]=='.')
{
flag1=i;
break;
}
}
if(flag1==-1) //如果没有小数点,就放在整数位后
flag1=strlen(s1);
for(i=0;i<strlen(s2);i++)
{
if(s2[i]=='.')
{
flag2=i;
break;
}
}
if(flag2==-1) //如果没有小数点,就放在整数位后
flag2=strlen(s2);
t=0;
for(i=flag1+1;i<strlen(s1);i++) //小数位正存
a[t++]+=(s1[i]-'0');
t=0;
for(i=flag2+1;i<strlen(s2);i++)
a[t++]+=(s2[i]-'0');
alen=max(strlen(s1)-flag1-1,strlen(s2)-flag2-1); //小数位长度
for(i=alen-1,temp=0;i>=0;i--) //处理小数部分
{
a[i]+=temp;
temp=(a[i]/10);
a[i]%=10;
}
if(temp)
b[0]+=temp;
t=0;
for(i=flag1-1;i>=0;i--) //整数位反存
b[t++]+=(s1[i]-'0');
t=0;
for(i=flag2-1;i>=0;i--)
b[t++]+=(s2[i]-'0');
blen=max(flag1,flag2); //整数位长度
for(i=0,temp=0;i<blen;i++) //处理整数部分
{
b[i]+=temp;
temp=(b[i]/10);
b[i]%=10;
}
if(temp) //整数位输出
printf("%d",temp);
for(i=blen-1;i>=0;i--)
printf("%d",b[i]);
if(alen<1)
{
printf("\n");
continue;
}
for(i=alen-1;i>=0;i--) //小数位输出
{
if(a[i]!=0)
break;
}
if(i==-1)
printf("\n");
else
{
printf(".");
for(j=0;j<=i;j++)
printf("%d",a[j]);
printf("\n");
}
}
return 0;
}
HDU-1402-A*B Problem Plus
http://acm.hdu.edu.cn/showproblem.php?pid=1402
呜呜,Time Limit Exceeded,想不出什么优化的方法,先贴个超时的代码,下回再研究,网上说可用傅立叶变换,表示不会用哇
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char s1[50005],s2[50005];
int s[100005];
int main()
{
int len1,len2,temp;
int i,j;
while(scanf("%s%s",s1,s2)!=EOF)
{
len1=strlen(s1);
len2=strlen(s2);
memset(s,0,sizeof(s));
for(i=0;i<len1;i++) //模拟乘法
for(j=0;j<len2;j++)
s[i+j]+=(s1[len1-1-i]-'0')*(s2[len2-1-j]-'0');
for(i=0,temp=0;i<len1+len2;i++)
{
s[i]+=temp;
temp=(s[i]/10);
s[i]%=10;
}
for(i=len1+len2-1;i>=0;i--)
if(s[i]!=0)
break;
if(i==-1)
{
printf("0\n");
continue;
}
for(j=i;j>=0;j--)
printf("%d",s[j]);
printf("\n");
}
return 0;
}
POJ-1001-Exponentiation
http://poj.org/problem?id=1001
带小数的幂乘,一样用字符串模拟
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int sign,i,t,n,j,k;
char s[6];
int b[6],c[300],temp[300];
while(scanf("%s",s)!=EOF)
{
sign=0;
t=1;
for(i=0;i<6;i++)
{
if(s[i]>='0'&&s[i]<='9')
{
b[t]=s[i]-'0';
c[t]=b[t];
t++;
}
else
b[0]=t-1;
}
scanf("%d",&n);
for(k=1;k<n;k++) //做n-1次正向的乘法
{
memset(temp,0,sizeof(temp));
for(i=1;i<=5*k;i++)
for(j=1;j<=5;j++)
temp[i+j]+=(c[i]*b[j]);
for(i=5*(k+1);i>=2;i--)
{
temp[i-1]+=temp[i]/10;
temp[i]%=10;
}
for(i=1;i<=5*(k+1);i++)
c[i]=temp[i];
}
b[0]=n*b[0]; //整数位
i=1;
while(c[i]==0)
i++;
j=5*n;
while(c[j]==0)
j--;
for(k=i;k<=b[0];k++)
{
sign=1;
printf("%d",c[k]);
}
if(b[0]+1<=j)
printf(".");
for(k=b[0]+1;k<=j;k++)
{
sign=1;
printf("%d",c[k]);
}
if(sign==0)
printf("0");
printf("\n");
}
return 0;
}