每日一题2014/7/30

Exponentiation

Time Limit: 500MS   Memory Limit: 10000K
Total Submissions: 134035   Accepted: 32776

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 Rn 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

没做出来,抄的别人的代码,一开始思路差不多,但是我代码水平太差了
#include<iostream>
using namespace std;

#define LENGTH 200
class BigNumber
{
private:
    int* value;
    int decimal_bits;
    int exp;

    int previousBit(int bit) {
        if (bit < 10)
            return 0;
        else
            return bit / 10;
    }
public:
    BigNumber(char* str, int e) {
        value = new int[LENGTH];
        //decimal = new int[LENGTH];
        for(int i = 0; i < LENGTH; i++)
        {
            value[i] = 0;
            //decimal[i] = 0;
        }
        int index = -1;
        int str_len = strlen(str);
        for(int i = 0; i < str_len; i++)
            if(str[i] == ‘.‘)
                index = i;
        decimal_bits = (index == -1 ? 0 : str_len - index - 1);
        //将输入的字符串转化为相应的数值
        if (index == -1)
        {
            for (int i = 0; i < str_len; i++)
                value[LENGTH - str_len + i] = str[i] - ‘0‘;
        }
        else
        {
            for (int i = 0; i < index; i++)
                value[LENGTH - str_len + i + 1] = str[i] - ‘0‘;
            for (int i = index + 1; i < str_len; i++)
                value[LENGTH - str_len + i] = str[i] - ‘0‘;
        }
        exp = e;
    }

    ~BigNumber()
    {
        delete[] value;
    }
    void pow() {
        if (exp == 0) {
            for (int i = 0; i < LENGTH - 1; i++)
                value[i] = 0;
            value[LENGTH - 1] = 1;
            return;
        }

        int* tmp_value = new int[LENGTH];
        //int* tempDecimal = new int[LENGTH];
        for(int i = 0; i < LENGTH; i++)
            tmp_value[i] = value[i];

        for (int i = 0; i < exp - 1; i++)
        {
            //乘一次保存一次值
            int* result_value = new int[LENGTH];

            for(int j = 0; j < LENGTH; j++)
                result_value[j] = 0;

            for (int j = 0; j < LENGTH; j++)
            {
                if (tmp_value[j] != 0)
                {
                    for (int k = 0; k < LENGTH; k++)
                    {
                        if (value[k] != 0)
                            result_value[j + k - LENGTH + 1] += tmp_value[j]*value[k];
                    }
                }
            }
            for (int j = 0; j < LENGTH; j++)
                value[j] = result_value[j];

            //进行进位,以防在上述相乘的过程中溢出
            for (int j = LENGTH - 1; j >=0; j--)
            {
                value[j - 1] += previousBit(value[j]);
                value[j] %=10;
            }

            delete result_value;
        }

        delete[] tmp_value;

    }

    void print()
    {
        if (exp == 0)
            printf("%d\n", 1);
        else
        {
            if (decimal_bits == 0)
            {
                bool flag = false;
                for (int i = 0; i < LENGTH; i++)
                {
                    if (value[i] == 0 && !flag)
                        continue;
                    else
                    {
                        flag = true;
                        printf("%d", value[i]);
                    }
                }
                printf("\n");
            }
            else
            {
                int bits = decimal_bits*exp;
                bool is_zero = true;
                for (int i = 0; i < LENGTH - bits; i++)
                {
                    if (value[i] == 0 && is_zero)
                        continue;
                    is_zero = false;
                    printf("%d", value[i]);
                }
                bool output_dot = false;
                int output_pos = -1;
                for (int i = LENGTH - 1; i >= LENGTH - bits; i--)
                {
                    if (value[i] == 0 && !output_dot)
                        continue;
                    output_dot = true;
                    output_pos = i;
                    break;
                }
                if (output_dot)
                {
                    printf(".");
                    for (int i = LENGTH - bits; i <=output_pos; i++)
                        printf("%d", value[i]);
                }
                printf("\n");
            }
        }
    }
};

int main() {
    char* str=new char[6];
    int n;

    while(cin>>str>>n)
    {
        BigNumber* bn = new BigNumber(str, n);
        bn->pow();
        bn->print();
        delete bn;
    }
    return 0;
}

每日一题2014/7/30

时间: 2024-10-20 15:09:20

每日一题2014/7/30的相关文章

&#8203;老男孩教育每日一题-第125天-显示文件oldboy.txt的第20行到30行请问如何做?

显示文件oldboy.txt的第20行到30行请问如何做? echo stu{00..40}|xargs -n1 >oldboy.txt 1.    head -30 oldboy.txt|tail -11 2.    sed -n '20,30p' oldboy.txt 3.    sed -n '20,30!d' oldboy.txt 4.    awk 'NR==20,NR==30' oldboy.txt 5.    awk 'NR>=20 && NR<=30' o

老男孩教育每日一题-第126天-通过shell脚本打印乘法口诀表

问题背景: 生成9*9乘法表 [[email protected] ~]# seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}' 1x1=1 1x2=2   2x2=4 1x3=3   2x3=6   3x3=9 1x4=4   2x4=8   3x4=12  4x4=16 1x5=5

每日一道题2014/7/23

10015 - Hankson的趣味题 Time Limit: 1000MSMemory Limit: 65535KB DescriptionHanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson.现在,刚刚放学回家的Hankson 正在思考一个有趣的问题.今天在课堂上,老师讲解了如何求两个正整数c1 和c2 的最大公约数和最小公倍数.现在Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公倍数”之类问题的“逆问题”,这

老男孩教育每日一题-第110天-find命令-size参数

老男孩教育每日一题-第110天-find命令-size参数1.查找当前目录下以log结尾的大于50k小于2M的普通文件2.查找当前目录下以log结尾的小于50k大于2M的普通文件以上两个问题有什么不同? 参考答案: 测试环境: [[email protected] tmp]# pwd /root/tmp [[email protected] tmp]# ll -h total 7.4M -rw-r--r-- 1 root root   262 Jul 30 15:45 a.log -rw-r--

老男孩教育每日一题-2017年5月17日-使用三剑客进行变化格式

1.题目 原始数据: 17/Apr/2015:09:29:24 +0800 17/Apr/2015:09:30:26 +0800 17/Apr/2015:09:31:56 +0800 18/Apr/2015:09:34:12 +0800 18/Apr/2015:09:35:23 +0800 19/Apr/2015:09:23:34 +0800 19/Apr/2015:09:22:21 +0800 20/Apr/2015:09:45:22 +0800 期望结果: 2015-04-17 09:29:

hdu 4972 A simple dynamic programming problem (转化 乱搞 思维题) 2014多校10

题目链接 题意:给定一个数组记录两队之间分差,只记分差,不记谁高谁低,问最终有多少种比分的可能性 分析: 类似cf的题目,比赛的时候都没想出来,简直笨到极点..... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <vector> 7 #include &

c#新手_每日一题(一)

进击c#的小白一枚,望大神指点. 每日一题M 个人的成绩存放在 score 数组中,请编写函数 GetBelowScore(),它的 功能是:返回低于平均分的分数,并将低于平均分的分数放在 below 所指的数组中.  例如,当 score 数组中的数据为 10.20.30.40.50.60. 70.80.90 时,函数返回值应该是 4,below 中的数据应为10.20.30.40. static void Main(string[] args) { int[] score = { 10, 2

2014.7.30【于明天返校

每当要离开一个地方的时候,就会特别的难过 与记忆有关,无论长短... 20天前, 我来到这个完全陌生的城市 我记得我day0的时候是这么写的,现在看来简直233333 居然还有气场..哈哈哈哈哈哈哈 之后过了一天, 我就和我对面那群人混熟了... 我认识了很傻的太太,很逗比的笑尘,很死宅的一奇,很认真的鸿辉,很高的晨铿,唱歌很棒的640,很萌的室友,以及人很好的林熠和泉一的ccy... 其实还有很多很多很可爱的人 我只想说我都不会忘记.... 日子一天天的过着.. 每天都对自己说一句bless

C语言每日一题之No.9

再做决定之前,我还是做好自己该做的.我不希望几年后会悔恨自己为什么在最该努力的时候不愿意吃苦.尊敬的女王陛下,请接题: 一.题目:有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规则插到字符串a中,最后输出"abdefghjkmnptwy". 二.思路:既然是已经排好序的,就用二分法查找的思想 将字符串s中的每个字符依次作为key拿来和字符串a做比较并且插入 三.程序 1 #include <stdio.h> 2 #include <string.