poj1001 高精度

2024-04-28 17:18
文章标签 高精度 poj1001

本文主要是介绍poj1001 高精度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

如题:http://poj.org/problem?id=1001

 

  

Exponentiation
Time Limit: 500MS Memory Limit: 10000K
Total Submissions: 142484 Accepted: 34813

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 computer systems.

This problem requires that you write a program to compute the exact value of R n where R is a real number ( 0.0 < R < 99.999 ) and n is an integer such that 0 < n <= 25.

Input

The input will consist of a set of pairs of values for R and n. The R value will occupy columns 1 through 6, and the n value will be in columns 8 and 9.

Output

The output will consist of one line for each line of input giving the exact value of R^n. Leading zeros should be suppressed in the output. Insignificant trailing zeros must not be printed. Don't print the decimal point if the result is an integer.

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

Hint

If you don't know how to determine wheather encounted the end of input:
s is a string and n is an integer
C++while(cin>>s>>n){...}cwhile(scanf("%s%d",s,&n)==2) //to  see if the scanf read in as many items as you want/*while(scanf(%s%d",s,&n)!=EOF) //this also work    */{...}

Source

East Central North America 1988

 

 

思路:很繁琐的一道题,题目思路很清晰,高精度乘法,找准小数点的位数,输出时加进去小数点。实现起来对小数点位数的处理和各种边界(小数点影响的前导后导0的处理),一个细节处理不好,就崩了。

在每一次的乘法中没有处理前导0,而是在所有运算后同时处理上下界和小数点的位置。确定输出的上界i,下界j。然后输出即可。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

char str[10];
int a[10];
int res[500];

int Multiple(int ma,int mr)
{
    int i,j;
    int k=ma+mr;
    int c[500]={0};
    for(i=1;i<=ma;i++)
        for(j=1;j<=mr;j++)
    {
        c[i+j-1]+=a[i]*res[j];
        c[i+j]+=c[i+j-1]/10;
        c[i+j-1]%=10;
    }
        for(i=1;i<=k;i++)
            res[i]=c[i];
        mr=k;
        return mr;
}
int main()
{
 // freopen("C:\\1.txt","r",stdin);
    while(~scanf("%s",str+1))
    {
        int n;
        cin>>n;
        memset(a,0,sizeof(a));
        memset(res,0,sizeof(res));
        int dot_pos=-1;
        int i,j;
        int len=strlen(str+1);
        int ma=0,mr=0;
        for(i=len;i>=1;i--)
            if(str[i]=='.')
                dot_pos=i;
            else
                a[++ma]=str[i]-'0';
   mr=ma;
   for(i=1;i<=ma;i++)
    res[i]=a[i];
        for(i=0;i<n-1;i++)
           mr=Multiple(ma,mr);
        if(dot_pos==-1)
        {
            for(i=mr;i>=1;i--)
                printf("%d",res[i]);
            printf("\n");
        }
        else
        {
            dot_pos=len-dot_pos;
            dot_pos*=n;
            int up=mr,down=1;
            for(i=1;i<=mr;i++)
                if(res[i]!=0)
                 {
                     down=i;
                     break;
                 }
            for(i=mr;i>=1;i--)
                if(res[i]!=0)
                {
                    up=i;
                    break;
                }
            i=up;
            j=down;
            if(dot_pos>up)
                i=dot_pos;
            if(dot_pos<down)
                j=dot_pos+1;
            while(i>=j)
            {
                if(i==dot_pos)
                    printf(".");
                    printf("%d",res[i]);
                i--;
            }
          printf("\n");
        }
    }
    return 0;
}

 

 

这篇关于poj1001 高精度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943804

相关文章

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

高精度打表-Factoring Large Numbers

求斐波那契数,不打表的话会超时,打表的话普通的高精度开不出来那么大的数组,不如一个int存8位,特殊处理一下,具体看代码 #include<stdio.h>#include<string.h>#define MAX_SIZE 5005#define LEN 150#define to 100000000/*一个int存8位*/int num[MAX_SIZE][LEN];void

高精度计算----减法运算(浮点型)

基于上一贴,修改减法运算适合于高精度浮点型计算。 因为减法比加法难度大一点,考虑的地方也要多一些,可能代码有欠缺,欢迎指出。 运算说明: 1、相减函数依旧没改变,包括上一贴的判断被减数与减数的大小函数也没变。 2、增加两个函数,取小数位数函数和结果处理(回归小数点)函数 3、与加法浮点高精度运算相比,这里改变较多的是结果处理函数,加法加完后,位数不减反增,而且最多增一位。减法会消失掉好多

高精度计算----减法运算

处理大数减法运算: 1、首先要判断被减数与减数哪个更大,再相应的带入减法函数去处理。具体的比较可以使用字符串的相关知识去比较。 2、相减要先对齐数组,依照减数的长度,执行相应的减法运算次数。 3、不需要借位相减的话,直接减去;需要的话,向前借一位,若前一位是0,则再前借(此时前一位的0变为10)。 测试程序效果如下:   以下代码包括相减函数,比较被减数减数函数,若有错误,请指出:

高精度加法,乘法,阶乘

#include <iostream>#include <map>#include <string>#include <algorithm>using namespace std;const int Max = 50000;string str1,str2;/***********乘法***********/void chenfa(){cin >> str1>>str2;int a

高精度治具加工的重要性和创新性

在现代制造业中,高精度治具加工扮演着至关重要的角色。它不仅是生产过程中的关键环节,更是推动行业不断创新和发展的重要力量。时利和将解析高精度治具加工的重要性和创新性。   一、高精度治具加工的重要性   1.确保产品质量   高精度治具能够为生产过程提供准确的定位、夹紧和导向功能,从而确保产品的尺寸精度、形状精度和表面质量。例如,在电子制造领域,高精度的治具可以保证芯片的精确安装,提高电子

【HDU】4927 Series 1 高精度

传送门:【HDU】4927 Series 1 题目分析:公式很好推,到最后就是C(n-1,0)*a[n]-C(n-1,1)*a[n-1]+C(n-1,2)*a[n-2]+...+C(n-1,n-1)*a[n]。 用C(n,k)=C(n,k-1)*(n-k+1)/k即可快速得到一行的二项式系数。 我看JAVA不到1000B 15分钟就能过。。。我又敲了大数模板然后将近2个小时才过T U

高精度加、减、乘、除(高精除以低精)

高精度加法 法1:P1601 A+B Problem(高精) #include <bits/stdc++.h>using namespace std;char s1[510], s2[510];int a[510], b[510], sum[510];int lena, lenb, lens;int main(){cin >> s1 >> s2;lena=strlen(s1);le

【高精度】-DLUTOJ-1176-大数乘法

题目链接:http://acm.dlut.edu.cn/problem.php?id=1176 题目描述:赤裸的大数乘法 解题思路: 突然想到自己没写过高精度乘法,就回咱们自己OJ上找出了这道题,赤裸的高精度乘法而已,没想到依然觉得不好写,准确说来是我从小到大算乘法的习惯使我产生了错觉:“ 想写大数乘法就得先写一个大数加法出来 ”。喂!我短路了半天才想明白,int 数组里可以存个两位数啊,再

人脸静态活体检测(高精度版) API 对接说明

人脸静态活体检测(高精度版) API 对接说明 本文将介绍人脸静态活体检测(高精度版)API 对接说明,它可用于对用户上传的静态图片进行防翻拍活体检测,以判断是否是翻拍图片。 接下来介绍下 人脸静态活体检测(高精度版) API 的对接说明。 申请流程 要使用 API,需要先到 人脸静态活体检测(高精度版) API 对应页面申请对应的服务,进入页面之后,点击「Acquire」按钮,如图所示: