高精度

对于大数的加减乘除,不会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;
}




posted on 2012-06-30 23:02  java课程设计例子  阅读(177)  评论(0编辑  收藏  举报