`
java-mans
  • 浏览: 11420344 次
文章分类
社区版块
存档分类
最新评论

高精度

 
阅读更多

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




分享到:
评论

相关推荐

    高精度地图:自动驾驶时代的基础设施.pdf

    所谓高精度地图(也称为高精度地图),实际上是和普通导航电子地图相对而言的服务于自动驾驶系统的专题地图。高精度地图可以分为两个层级:静态高精度地图和动态高精度地图。静态高精度地图处于底层,是目前研发的...

    常用的一些自己的库,高精度运算和矩阵乘法

    写高精度运算和矩阵乘法的时候,把常用的都封装在一起,写在一个头文件里方便使用.. 矩阵(matrix) 高精度(longnum) 重载了运算符+,-,*,/ 适用运算: 矩阵相乘 高精度数+高精度数 高精度数+低精度数 高精度数×高...

    高精度定时器计时器

    通过使用硬件支持高精度计时器以及CPU主频实现高精度定时器,计时器

    1307:【例1.3】高精度乘法

    1307:【例1.3】高精度乘法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 4358 通过数: 1440 【题目描述】 输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。 【输入】 输入两个高精度正...

    c++高精度整数库(支持高精度除高精度)

    这个版本的高精度整数库不仅支持高精度除高精度,同时修复了减法计算中的一个严重的bug。并支持高精度类型与其他一切可转换为高精度类型的类型(int,long long,unsignd,string)进行混合运算。同时,全面优化了除法、...

    Java高精度计算Java高精度计算

    Java高精度计算Java高精度计算Java高精度计算Java高精度计算Java高精度计算Java高精度计算Java高精度计算Java高精度计算Java高精度计算Java高精度计算Java高精度计算Java高精度计算

    QT高精度定时器

    qt及windows提供的定时器在ms级延时时是无法精确到ms的,因此写了一个获取cpu的高精度定时器,仅限在pc机上使用,因为会占用cpu资源不建议在单片机及arm上使用

    高精度_c++高精度_

    c++高精度

    基于磁栅的高精度位移传感器设计_臧金杰.caj

    位移传感技术是一项对现代科学研究和工业生产有着重要影响的传感技术,在高精度数控机床、航空航天、石油化工等国民经济各重要领域有着广泛应用。为符合各行各业尤其是现代化工业生产日益增长的需求,位移测量正朝着高...

    Windows高精度定时器(VC++实现)

    Windows平台高精度定时器封装类,最高精度可达1ms。

    高精度加法减法乘法除法

    高精度 加法 减法 乘法 除法。你想要的全部囊括了!

    高精度减法(C++)

    C++高精度减法运算(文件流输入输出),支持正整数运算。经VC++及DevC++5编译通过,测试无误。

    基于高精度-小量程的电子秤设计分析.pdf

    基于高精度-小量程的电子秤设计分析.pdf基于高精度-小量程的电子秤设计分析.pdf基于高精度-小量程的电子秤设计分析.pdf基于高精度-小量程的电子秤设计分析.pdf基于高精度-小量程的电子秤设计分析.pdf基于高精度-小...

    高精度类(压位)C++实现

    高精度压位 #include #include #include using namespace std; const int maxleng=500; class BigInt { private: int leng; int num[maxleng]; public:

    高精度计算 高精度加减乘除法

    高精度计算 高精度加法 高精度减法 高精度乘法 高精度除法

    蓝牙AOA高精度定位技术白皮书.pdf

    蓝牙AOA高精度定位技术白皮书

    mySoftTimer-windows高精度定时器.zip

    windows自带的定时器精度一般在10ms量级,精确度不足,在部分需要高精度定时的应用场合中,需要一种更高精度的定时器。 该高精度定时器能提供约1ms的定时精度,在轻负荷条件下的定时精度较稳定。 关键的是,该定时器...

    [C#]高精度计时器类

    这是一个C#高精度计时器类的实现.平时C#的Timer控件精度只有1/64秒,如果您需要更高的精度则建议使用此类.不完善的地方请改正

    简单万进制高精度源代码

    C++高精度源码,给大家瞧瞧。不过这可是万进制的哦!运行起来会快得多。 呃……我是菜鸟,也就能发这些了(给菜鸟同行们看看)。望多多指教。

Global site tag (gtag.js) - Google Analytics