poj-1001 高精度幂

POJ 1001 求高精度幂(高精度) Description 对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。  现在要你解决的问题是:对一个实数R( 0.0 Input T输入包括多组 R 和 n。 R 的值占第 1 到第 6 列,n 的值占第 8 和第 9 列。 Output 对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后 阅读详情
求高精度幂
Time Limit: 500MS Memory Limit: 10000K
Total Submissions: 114985 Accepted: 27919

Description

对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。

现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < n <= 25。

Input

T输入包括多组 R 和 n。 R 的值占第 1 到第 6 列,n 的值占第 8 和第 9 列。

Output

对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。

Sample Input

95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12

Sample Output

548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201

 

解题时间:2013/3/23 - 2013/3/24

        

解题思路:

     用数组表示数串,每一个数组元素存储数串的一位。

     数字串反向存储,如123.456   存储为654321  记录长度和小数点的位置,这样存储是为了方便计算。

     所有的乘法都用累加来实现。

 

代码:

#include <stdio.h>

void ADD(int arr1[],int arr2[],int *L1,int L2,int *P1,int P2)
{
    int temp;
    int L;
    int i;
    if(*P1>=P2)
    {
        temp=*P1-P2;
        L=*L1>(L2+temp)?*L1:(L2+temp);
        for(i=temp; i<L; i++)
        {
            arr1[i]+=arr2[i-temp];
        }
        *L1=L;
    }
    else
    {
        temp=P2-*P1;
        L=(*L1+temp)>L2?(*L1+temp):L2;
        for(i=L-1; i>=0; i--)
        {
            if(i>=temp) arr1[i]=arr1[i-temp];
            else arr1[i]=0;
        }
        for(i=0; i<L; i++)
        {
            arr1[i]+=arr2[i];
        }
        *L1=L;
        *P1=P2;
    }
    //规范化
    for(i=0; i<*L1; i++)
    {
        if(arr1[i]>=10)
        {
            arr1[i]-=10;
            arr1[i+1]++;
        }
    }
    if(arr1[i]==1)
        *L1+=1;
}
//arr2复制到arr1
void COPY(int arr1[],int arr2[],int *L1,int L2,int *P1,int P2)
{
    int i=0;
    for(; i<L2; i++)
    {
        arr1[i]=arr2[i];
    }
    while(i<150)
    {
        arr1[i]=0;
        i++;
    }
    *L1=L2;
    *P1=P2;
}
//规范化得到t1,t2的值
void NORMALIZE(int arr[],int L,int P,int *t1,int *t2)
{
    *t1=0,*t2=0;
    int i;
    for(i=0; (i<P-1)&&(arr[i]==0); i++)
    {
        *t1=*t1+1;
    }
    for(i=L; (i>=P)&&(arr[i-1]==0); i--)
    {
        *t2=*t2+1;
    }
}
void SETZERO(int arr[],int *L,int *P)
{
    int i;
    for(i=0; i<*L; i++)
    {
        arr[i]=0;
    }
    *L=0;
    *P=0;
}
int main()
{
    char str[7];//输入的串
    int n;
    int sumNow[150] = {0};//当前值
    int sumNowL=0,sumNowP=0;//串长度,不包括小数点,小数点位置如123.456为4
    int sumLast[150] = {0};//每次幂之后的值
    int sumLastL=0,sumLastP=0;
    int sumTemp[150] = {0};//中间值
    int sumTempL=0,sumTempP=0;
    int s[6]= {0}; //输入的串
    int sL,sP;
    int i,j;
    int t1,t2;

    while(scanf("%s %d",str,&n)!=EOF)
    {
        SETZERO(sumLast,&sumLastL,&sumLastP);
        SETZERO(sumTemp,&sumTempL,&sumTempP);
        //将输入的串用数组的形式表示
        sL=6;
        sP=6;
        j=0;
        for(i=5; i>=0; i--)
        {
            if(str[i]=='.')
            {
                sL=5;
                sP=6-i;
            }
            else
            {
                s[j]=str[i]-48;
                j++;
            }
        }
        //计算每次幂后的结果
        COPY(sumNow,s,&sumNowL,sL,&sumNowP,sP);
        COPY(sumLast,s,&sumLastL,sL,&sumLastP,sP);
        n--;
        while(n)
        {
            SETZERO(sumNow,&sumNowL,&sumNowP);
            for(i=0; i<sL; i++)
            {
                if(s[i]==0)
                    continue;
                COPY(sumTemp,sumLast,&sumTempL,sumLastL,&sumTempP,sumLastP);
                for(j=1; j<s[i]; j++)
                {
                    ADD(sumTemp,sumLast,&sumTempL,sumLastL,&sumTempP,sumLastP);
                }
                sumTempP=sumTempP+sP-i-1;//L是否要变
                ADD(sumNow,sumTemp,&sumNowL,sumTempL,&sumNowP,sumTempP);
            }
            n--;
            COPY(sumLast,sumNow,&sumLastL,sumNowL,&sumLastP,sumNowP);
        }
        NORMALIZE(sumNow,sumNowL,sumNowP,&t1,&t2);
        for(i=sumNowL; i>0; i--)
        {
            if(t2)
            {
                t2--;
            }
            else
            {
                if(i>t1)
                    printf("%d",sumNow[i-1]);
            }
            if((i==sumNowP)&&(t1+1!=sumNowP))
            {
                printf(".");
            }
        }
        printf("\n");
    }
    return 0;
}



 

 

 

 

 

 

 

 

 

 

 

POJ1001 (求高精度幂,Exponentiation,C++) 北京大学程序在线评测系统 (“PekingUniversityOnlineJudge”) POJ1001 (求高精度幂,Exponentiation,C++) 题目的网址 题目大意是对一个实数R( 0.0 < R < 99.999 ),精确计算 R 的 n 次方,其中n 是整数并且 0 < n <= 25。 具体思路在代码中的注释中都有体现,不做过多解释。 话不多说,具体代... 阅读详情

相关推荐

西门子交换机环网冗余设置(实战篇2.2)

MRP的重组时间为 200ms 因此 PROFINET 通信必须选择大于 200ms 的看门狗时间,看门狗。ET200SP默认为 2ms*3=6ms) MRP 的重组时间为 200ms 故系统会报出看门狗超时。更新,默认是 3 个周期,超出设置的周期数就会报 IO 设备故障。时间不是直接配置的,而是作为没有 IO 数据可接受的更新周期,也就是允许几个周期没有数据。来达到大于 200ms 的看门狗时间的要求(看门狗时间 可接受更新周期数 更新时间)。是IO 控制器和 IO 设备)

weixin_42580591的博客 363

1001. 求高精度幂

1001. 求高精度幂Description对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。 现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < n <= 25。InputT输入包括多组 R 和 n。 R 的值占第 1 到第 6 列,n 的值占第 8

second24的博客 472

使用everything出现mem_virtual_alloc(): Fatal Error: out of memory解决方案

本文主要介绍了使用everything出现mem_virtual_alloc(): Fatal Error: out of memory解决方案,希望能对使用everything的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

POJ 1001

Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 143401   Accepted: 34998 Description Problems involving the computation of exact values of very

bear_huangzhen的专栏 1673

PCB仿真软件:Altium Designer_(15).AltiumDesigner的版本控制与项目管理

在进行PCB设计时,版本控制和项目管理是确保设计质量和团队协作效率的关键。Altium Designer 提供了强大的版本控制和项目管理功能,可以帮助设计团队更好地管理和维护项目。本节将详细介绍如何在Altium Designer中进行版本控制和项目管理,包括如何使用版本控制系统、如何管理项目文件、如何进行团队协作等。

kkchenjj的博客 1202

YOLOv11 环境配置全流程 | 从零开始搭建训练与推理环境

YOLOv11环境配置与训练全流程指南 本文详细介绍了YOLOv11目标检测模型的环境配置、训练与推理全流程。内容包括: 环境要求:列出GPU、CUDA、Python等组件的版本要求,提供快速检查脚本 Windows配置: CUDA 12.6和cuDNN 8.9.7安装步骤 使用Conda创建隔离环境 PyTorch GPU版本安装方法 IDE环境配置 Linux配置:提供Ubuntu 22.04下的CUDA、cuDNN安装命令和Conda环境搭建 Docker方案:提供一键式容器化部署命令 训练实战: 数

shrgegrb的博客 2012

用Poj1000 和 Poj1001写第一个Java程序——Java从0开始学习系列之路(1)

今天第一次接触了JAVA,之前C和C++接触的比较多,写的代码中90%是面向过程,大概有5万行, 但还是觉得自己非常的菜 (I very  vegetable !),学校发的JAVA课本第一眼就 没有让我心动的感觉,又是传智播客的书,实在无感(怪我啰),我打算根据POJ的简单题和博客题解来学校,遇到不会的知识点再专门学习,JAVA的细节打算上课听讲时听一听,有空再看看JAVA的面试题来巩固。这也...

CCSGTC的博客 551

RT-DETR改进策略【模型轻量化】| 替换骨干网络为 2024轻量化网络MoblieNetV4:移动生态系统的通用模型

本文记录的是基于MobileNet V4的RT-DETR目标检测轻量化改进方法研究。通过整合UIBMobile MQA以及优化的NAS策略能够在在不降低性能指标的前提下,降低计算成本。本文配置了原论文中和五种模型,以满足不同的需求。

Limiiiing的博客 1922

北大ACM poj 1001

网上搜来的借鉴一下 #include main() {     double f;     int n,i,j;     int top,bottom;     int show;     for(;~scanf("%lf%d",&f,&n);)     {         int p[300]={1},tmp=0;         f*=1e6;         for(

gubojun的专栏 673

使用 MATLAB/Simulink + Communications Toolbox + 5G Toolbox,构建一个2×2 MIMO-OFDM通信系统

本文通过Simulink+CommunicationsToolbox构建2×2 MIMO-OFDM通信系统,重点实现信道均衡滤波器(ZF与MMSE)的设计与应用。详细介绍了系统架构、建模步骤(包括信道估计、均衡器实现)和仿真场景设计,通过BER、星座图和EVM对比分析验证了MMSE均衡器在抑制噪声和信号恢复方面的优势。文章总结了MIMO均衡的核心原理与实践经验,并提出了扩展至大规模MIMO、深度学习均衡器等优化方向,为无线通信系统设计提供实用指导。

amy_mhd的博客 125

SO_KEEPALIVE、TCP_KEEPIDLE、TCP_KEEPINTVL、保活包

是一个套接字选项,用于设置是否启用 keepalive 机制。在这段代码中没有涉及到选项的设置。当被设置为非零值时,表示启用 keepalive 机制。keepalive 是一种用于检测连接是否仍然有效的机制。通过定期发送一些特定的探测数据,可以检测到网络连接的异常中断或对端应用程序的崩溃退出。为了避免以上情况,可以启用 keepalive 机制,即使在无数据传输的情况下也定期发送探测数据。如果在一定时间内没有收到对端的响应,就认为连接已经失效,并进行相应的处理。要启用选项,需要使用函数。其中,fd。

m0_46376834的博客 4813

求高精度幂 POJ1001

求高精度幂 Description 对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。  现在要你解决的问题是:对一个实数R( 0.0 n),其中n 是整数并且 0 Input T输入包括多组 R 和 n。 R 的值占第 1 到第 6 列,n 的值占第 8 和第 9 列。 Output 对于

algorithm_fish的专栏 494

【Bluetooth|蓝牙开发】二、蓝牙开发入门

蓝牙,是一种利用低功率无线电,支持设备短距离通信的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换,蓝牙工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段,使用IEEE802.11协议。

Donge's Blog 1万+

poj 1001 求高精度幂

这一题应该算是非常基础的高精度模板题了,但是由于我之前没有做过类似的题目,所以这题还是花了不少时间。 关键是输入的顺序跟实际计算的顺序是相反的,这就容易出错,还有就是输入可能会有带无意义的“0”的情况,所以还得把这些零处理掉,比如输入“3.000”,此处的“0”跟小数点都是没有意义的,最后的结果不能够输出来,我看网上的题解都是最后在处理这些零的,但我是在输入的时候就把这些零处理掉了,因为我发现,

Kerwun的博客 569

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

POJ 1001 Exponentiation 求高精度幂

题目链接 Description Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a taxing experience for many...

RPG_Zero的博客 256

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

poj-1001高精度幂

**求高精度幂** Time Limit: 500MS Memory Limit: 10000K Total Submissions: 191401 Accepted: 45899 Description 对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。 现在要你解决的问题是:对一个实...

zgh27的博客 191

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

POJ 1001 求高精度幂

高精度问题  初学的时候觉得很恶心。 去掉小数点,原数组存在另一个数组,将小数点标记。 用中间数组进行存储,模仿笔算乘法 去掉前导0 后导0 用up down  #include #include #include using namespace std; #define MAX 26*5 char str[6]; int res[MAX],a[MAX],b[

DisCrany的博客 473

PoJ1001,高精度求幂Exponentiation

接触这道题的时候还不了解大整数相乘,所以以下代码没有任何借鉴。 Exponentiation Description Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the nati...

weixin_44630656的博客 214

POJ 1001Exponentiation解题报告——求高精度幂

http://poj.org/problem?id=1001/* DescriptionProblems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a t

wangdeqiang2007的博客 499

POJ 1001 高精度幂

本题是高精度运算题,现实

u014070944的专栏 681

POJ 1001 Exponentiation - 高精度高位数运算

/* * POJ 1001 Exponentiation * 求R^n, 其中0.0 < R < 99.999, 0 < n <= 25; * * 1) 高精度高位数计算; * 2) 将字符串转换为数组,按位计算; * 3) 采用连乘求幂 或 将次数转换为二进制数以减少相乘次数; * */#include using namespace std;#define MAX_NUMBER_LENGTH

ChenK在学习! 1005

POJ 1001 Java:求高精度幂

题目本身不难,主要考察到对大数的处理。 Java.math包中,有BigInteger和BigDecimal两个类,分别可以表示长度不可变的,任意精度的整数和小数,并且可以和字符串相互转换,使得Java在处理大数方面具有独特的优势。 AC代码: import java.util.*; import java.math.*; public class POJ1001 { public

卡卡罗特 1407

[POJ] 1001 -> 求高精度幂

求高精度幂 Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 143826   Accepted: 35104 Description 对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。 现在要你解决的问题是:对一个实

一个程序猿的BLOG 854

求高精度幂【POJ 1001】【编程】

Description 对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。  现在要你解决的问题是:对一个实数R( 0.0 Input T输入包括多组 R 和 n。 R 的值占第 1 到第 6 列,n 的值占第 8 和第 9 列。 Output 对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方

roman1232008的专栏 1047
上一篇: 北大ACM分类
下一篇: poj-1004 简单题,学习输入输出格式
ErrorZero
博客等级 码龄14年 3粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值