• Precision power (高精度幂运算)(相乘的变体)


    POJ 1001  http://poj.org/problem?id=1001

    //注意存储方式是从后往前存储的 也就是逆序存储的
    #include<iostream>
    using namespace std;
    char str[10];
    int n, dot;
    int res[200], a[200], b[200];//a记录的是相乘之后的数
    int len, lena, lenb;//lena、lenb分别记录a,b的长度
    
    void mul()
    {
    	int i,j;
    	memset(res, 0, sizeof(res));
    	for(i=1; i<=lena; i++)  
    	{	
    		for(j=1; j<=lenb; j++)
    		{	
    			res[i+j-1]=res[i+j-1]+a[i]*b[j];
    			if (res[i+j-1]>9)
    			{
    				res[i+j] =res[i+j]+res[i+j-1]/10;
    				res[i+j-1]%=10;
    			}
    		}
    	}
    	if (res[lena+lenb-1]>9) //最高位的处理 
    	{		
    		res[lena+lenb] = res[lena+lenb-1] / 10;    //res[lena+lenb] + 
    		res[lena+lenb-1] = res[lena+lenb-1] % 10;
    	}
    	lena = lena + lenb;
    	for (i=1; i<=lena; i++)   //将结果值重新放在a里
    		a[i] = res[i];
    }
    
    int main()
    {
    	int i,j,up,down;
    	while (scanf("%s %d", str, &n)!=EOF)
    	{
    		dot = -1;
    		for (i=5, j=1; i>=0; i--)
    		{
    			if (str[i]!='.')
    			{
    				a[j]=b[j]=str[i]-'0';
    			    j++;
    			}
    			else
    				dot = i;
    		}
    		if(dot==-1)                 //如果没有小数,就有六位;否则,是五位
    			lena=lenb=6;
    		else
    			lena=lenb=5;
    		for (i=1; i<n; i++)
    			mul();
    		if (dot==-1)       //如果没有小数直接输出
    		{
    			for (i=lena; i>=1; i--)
    				printf("%d", a[i]);
    			printf("
    ");
    		}
    		else//在此处处理小数的时候,对于那些在不计小数相乘后的结果前后有出现零的先处理零,将前后的零全部去掉,
    			//然后再查看小数位置,调整输出的起始地址
    		{
    			dot=5-dot;//第几位是小数
    			dot=dot*n;
    			for (i=1; i<=lena; i++)//消除小数后的没有实际含义的零
    			{
    				if (a[i]!=0)
    				{
    					down=i;//记录小数后面第一个不为零的位置
    					break;
    				}
    			}
    			for (j=lena; j>=1; j--)//消除正式前的没有实际含义的零
    			{
    				if (a[j]!=0)
    				{
    					up = j;//记录整数后面第一个不为零的位置
    					break;
    				}
    			}
    			i=up;
    			if (up<dot)//整数前需补零
    				i = dot;
    			j=down;
    			if (j>dot)  //应对那些10.000这样
    				j = dot + 1;
    			for (; i>=j; i--)
    			{
    				if (i==dot)
    					printf(".");
    				printf("%d", a[i]);
    			}
    			printf("
    ");
    		}
    	}
    	return 0;
    }
    


     

  • 相关阅读:
    python 包与模块
    互斥锁与自旋锁
    TCP三次握手四次挥手
    缓存击穿、缓存穿透、缓存雪崩
    五种IO模型
    MySQL使用mysqldump进行数据备份
    golang数据库连接池参数设置
    golang代码文件目录组织、包目录组织学习笔记
    【转】如何用Vim提高开发效率
    emacs显示行号
  • 原文地址:https://www.cnblogs.com/zswbky/p/5432080.html
Copyright © 2020-2023  润新知