【poj1001】 Exponentiation

http://poj.org/problem?id=1001 (题目链接)

题意:求实数R的n次方,要求高精度。

Solution 
  SB题Wa了一下午,直接蒯题解。 
  高精度,小数点以及去前导后导零很麻烦,而且题目数据很刁钻。 
  注意几个数据: 
  00.000 20 
  0

  000.10 20 
  .00000000000000000001

  .10000 25 
  .0000000000000000000000001

  1 0 
  1

  如果还要数据大话,大牛博客上有。

代码:

#include<iostream>
using namespace std;
char str[10];
int n, dot;
int res[999999], a[999999], b[999999];
int len, lena, lenb;

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] += a[i] * b[j];
            if (res[i+j-1]>9)
            {
                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-1] %= 10;
    }
    lena = lena + lenb;
    for (i=1; i<=lena; i++) 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‘;
            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("\n");
        }
        else
        {
            dot = 5 - 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) j = dot + 1;
            for (; i>=j; i--)
            {
                if (i==dot) printf(".");
                printf("%d", a[i]);
            }
            printf("\n");
        }
    }
    return 0;
}

  

时间: 2024-12-26 11:37:43

【poj1001】 Exponentiation的相关文章

【PKU1001】Exponentiation(高精度乘法)

Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 145642   Accepted: 35529 Description Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the n

POJ2406 Power Strings 【KMP】

Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 31388   Accepted: 13074 Description Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "

【转】对于杭电OJ题目的分类

[好像博客园不能直接转载,所以我复制过来了..] 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDI

【POJ2406】【KMP】Power Strings

Description Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative inte

【Kettle】4、SQL SERVER到SQL SERVER数据转换抽取实例

1.系统版本信息 System:Windows旗舰版 Service Pack1 Kettle版本:6.1.0.1-196 JDK版本:1.8.0_72 2.连接数据库 本次实例连接数据库时使用全局变量. 2.1 创建新转换:spoon启动后,点击Ctrl+N创建新转换 2.2 在新转换界面中,右键点击DB连接,系统会弹出[数据库连接]界面. windows系统环境下,可用${}获取变量的内容. 说明: 连接名称:配置数据源使用名称.(必填) 主机名称:数据库主机IP地址,此处演示使用本地IP(

详解go语言的array和slice 【二】

上一篇  详解go语言的array和slice [一]已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多.上一篇的最后讲解到创建新的slice时使用第三个索引来限制slice的容量,在操作新slice时,如果新slice的容量大于长度时,添加新元素依然后使源的相应元素改变.这一篇里我会讲解到如何避免这些问题,以及迭代.和做为方法参数方面的知识点. slice的长度和容量设置为同一个值 如果在创建新的slice时我们把

【转载】C++拷贝构造函数(深拷贝,浅拷贝)

对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CExample {private:     int a;public:     CExample(int b)     { a=b;}     void Show ()     {        cout<

【BZOJ】1799: [Ahoi2009]self 同类分布

[题意]给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.1 ≤ a ≤ b ≤ 10^18 [算法]数位DP [题解] 感觉这种方法很暴力啊. 枚举数位和1~162(不能枚举0,不然会模0,相当于除0),记忆化f[pos][sum][val],sum表示当前数位和,val表示数字取模枚举的数位和. 每次sum+i和(val*10+i)%MOD转移. sum用减法优化,即记忆化(MOD-sum),但是枚举过程中都要memset,导致效率低下,记忆化效果很差. 要什么方法才能跑1.3s

【BZOJ4942】[Noi2017]整数 线段树+DFS(卡过)

[BZOJ4942][Noi2017]整数 题目描述去uoj 题解:如果只有加法,那么直接暴力即可...(因为1的数量最多nlogn个) 先考虑加法,比较显然的做法就是将A二进制分解成log位,然后依次更新这log位,如果最高位依然有进位,那么找到最高位后面的第一个0,将中间的所有1变成0,那个0变成1.这个显然要用到线段树,但是复杂度是nlog2n的,肯定过不去. 于是我在考场上yy了一下,这log位是连续的,我们每次都要花费log的时间去修改一个岂不是很浪费?我们可以先在线段树上找到这段区间