• 2013.6.17大数计算之浮点数


    #include <stdio.h>
    #include <string.h>
    
    void Swap(char &a,char &b)
    {
    	char c =a;
    	a =b;
    	b = c;
    }
    void ReverseString(char *s)
    {
    	int i=0;
    	int j = strlen(s)-1;
    	while (i<j)
    	{
    		Swap(s[i],s[j]);
    		i++;
    		j--;
    	}
    }
    void AddString(char *A,char *B,char *C)
    {
    	char AA[100];
    	char BB[100];
    	char CC[100];
    	strcpy(AA,A);
    	strcpy(BB,B);
    	ReverseString(AA);
    	ReverseString(BB);
    	int posAA=-1;
    	int posBB=-1;
    
    	char *p = strchr(AA,'.');
    	if (p!=NULL)
    	{
    		posAA = p-AA;
    	}
    	
    	char *q = strchr(BB,'.');
    	if (q!=NULL)
    	{
    		posBB = q-BB;
    	}
    	
    	int lenCC=0;
    	int len_float_min = posAA<posBB ? posAA : posBB;
    	if (p==NULL || q==NULL)
    	{
    		len_float_min=0;
    	}
    	int i=0,j=0;
    	int carry = 0;
    	while (posAA-i>len_float_min)
    	{
    		int tmp = carry+AA[i]-'0';
    		carry = tmp/10;
    		CC[lenCC++] = tmp%10+'0';
    		i++;
    	}
    	while (posBB-j>len_float_min)
    	{
    		int tmp = carry+BB[j]-'0';
    		carry = tmp/10;
    		CC[lenCC++] = tmp%10+'0';
    		j++;
    	}
    	while (i<posAA && j<posBB)
    	{
    		int tmp = carry + AA[i]-'0'+BB[j]-'0';
    		carry = tmp/10;
    		CC[lenCC++] = tmp%10+'0';
    		i++; 
    		j++;
    	}
    	CC[lenCC++] = '.';
    	i++;
    	j++;
    	if (p==NULL)
    	{
    		i=0;
    	}
    	if (q==NULL)
    	{
    		j=0;
    	}
    	while (i<strlen(AA) && j<strlen(BB))
    	{
    		int tmp = carry + AA[i]-'0'+BB[j]-'0';
    		carry = tmp/10;
    		CC[lenCC++] = tmp%10+'0';
    		i++; 
    		j++;
    	}
    	while (i<strlen(AA))
    	{
    		int tmp = carry+AA[i]-'0';
    		carry = tmp/10;
    		CC[lenCC++] = tmp%10+'0';
    		i++;
    	}
    	while (j<strlen(BB))
    	{
    		int tmp = carry+BB[j]-'0';
    		carry = tmp/10;
    		CC[lenCC++] = tmp%10+'0';
    		j++;
    	}
    	if (carry)
    	{
    		CC[lenCC++]=carry+'0';
    	}
    	CC[lenCC]=0;
    	ReverseString(CC);
    	int cnt=0;
    	for (i=0;i<strlen(CC);++i)
    	{
    		if (CC[i]!='0') break;
    		cnt++;
    	}
    	for (i=cnt;i<strlen(CC)+1;++i)
    	{
    		CC[i-cnt] = CC[i];
    	}
    
    	cnt=0;
    	for (i=strlen(CC)-1;i>=0;--i)
    	{
    		if (CC[i]!='0') break;
    		cnt++;
    	}
    	CC[strlen(CC)-cnt]=0;
    
    	char *r = strchr(CC,'.');
    	int pos = r-CC;
    
    	if (pos==strlen(CC)-1)
    	{
    		CC[strlen(CC)-1]=0;
    	}
    	strcpy(C,CC);
    	
    
    	
    }
    int main()
    {
    	char s[300];
    	char s1[100];
    	char s2[100];
    	char s3[100];
    //	strcpy(s1,"1111.222");
    //	strcpy(s2,"2222.333477777");
    
    	scanf("%s",s);
    //	strcpy(s,"1.2+3");
    	int pos=0;
    	char *p = strchr(s,'+');
    	pos = p-s;
    	int i=0;
    	for (i=0;i<pos;++i)
    	{
    		s1[i]=s[i];
    	}
    	s1[pos]=0;
    	for (i=pos+1;i<strlen(s);++i)
    	{
    		s2[i-pos-1] = s[i];
    	}
    	s2[strlen(s)-pos-1]=0;
    	AddString(s1,s2,s3);
    
    	printf("%s
    ",s3);
    	return 0;
    }
    

  • 相关阅读:
    [转贴]Linux内核LTS长期支持版生命周期
    【转贴】Debian 10 "buster" 正式发布
    [百度经验]重置组策略的方法
    【转贴】我对测试工作的一些认识
    【转贴】使用sar进行性能分析
    【转贴】龙芯内核发展策略 已经支持k8s
    【转贴】优秀的龙芯Docker虚拟机解决方案
    Windows 2016 安装单机版本Oracle ASM 的简单说明
    【转贴】中标麒麟操作系统(龙芯版)与360安全浏览器完成产品兼容性互认证测试
    AQTime教程
  • 原文地址:https://www.cnblogs.com/wuhayaoshenmeai/p/3361870.html
Copyright © 2020-2023  润新知