`

1001

阅读更多
总时间限制:
500ms
内存限制:
65536kB
描述

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 Rnwhere R is a real number ( 0.0 < R < 99.999 ) and n is an integer such that 0 < n <= 25.

输入
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.
输出
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.
样例输入
95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12
样例输出
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
大致题意:
输入一个包含6位的数R,0.0 < R < 99.999 ,求它的n次方,0<n<=25
输出时前面的0要省去,末尾没有意义的0也要省去 ;
 
解决方案一:G++
 
#include<iostream>
using namespace std;

int main()
{
 char ch[6]; //用字符数组来接收浮点数
 int power; //阶数
 while(cin>>ch>>power)
 {
  int result[125]={0};
  int tail=5,head=0;
  int after=0;
  while(ch[tail]=='0')
   tail--;
  while(ch[head]!='.')
   head++;
  after=tail-head; //小数点后面的数的位数
  int i=0;
  int base=0;
  int p=1;
  int pow=power;
  while(tail>=0)//小数点后数的个数
  {
   if(ch[tail]!='.')//把所有数存入数组
   {
    result[i]=ch[tail]-'0';//去真是数值
    base+=(ch[tail]-'0')*p;//存储小树点末尾的数
    i++;//记录小数点后数的个数
    p*=10;
   }
   tail--;
  }
  /**
  逆序存储所有非0数
   int q = 0 ;
    while(q<i)
  {
      cout<<result[q] ;
      q++ ;
  }
  **/
  while(power>1)//计算阶乘
  {
   tail=0;
   while(tail<i)
   {
    result[tail]=base*result[tail];
    tail++;
   }
   int j=0;
   int before=0;
   int mid=0;
   while(j<i)
   {
    mid=(result[j]+before)%10;
    before=(result[j]+before)/10;
    result[j]=mid;
   // cout<<mid<<endl ;
    j++;
   }
   while(before>0)
   {
    result[i]=before%10;
    before/=10;
    i++;
   }
   power--;

  }
  after*=pow;//小数点的总位数

   /**     while(i>=0)
        {
                cout<<result[i];
                i--;
        } **/
  if(after>=i)//移位数大于总数的位数
    {
     int zero=after-i;//小数点后添0的个数
      cout<<".";
      while(zero>0)
      {
      cout<<"0";
        zero--;
      }
      i--;
      while(i>=0)
      {
       cout<<result[i];
        i--;
      }

      }
    else if(after<i)
    {
     i--;
      while(i>=0)
      {
       if(after-i==1)
         cout<<"."<<result[i];
        else
          cout<<result[i];
        i--;
      }

  }
  cout<<endl;
 }
}
 我写了一些注释,可以调用pow函数,这个计算式自己写的:
1.首先,用一个char字符数组,也就是字符串存储R
2.遍历R,去掉末尾多余的0和小数点,把所有数存在result数组中,用base记录这个大数;
3.通过result中的数与base相乘,各自取出个位,十位,百位,千位,等等
4.计算完成后,接下来就只剩小数点了,用after记录需要的小数点个数,如果result里面的元素个数
小于result,则证明这个数是小数,还要添0,反之,则移位就行。
 
解决方案二: GCC
 
 
#include<stdio.h>
int main()
{
    char ch[6];
    int power ;
   while(scanf("%s%d",&ch,&power)!=EOF)
   {
     int result[125]={0};
  int tail=5,head=0;
  int after=0;
  while(ch[tail]=='0')
   tail--;
  while(ch[head]!='.')
   head++;
  after=tail-head; //小数点后面的数的位数
  int i=0;
  int base=0;
  int p=1;
  int pow=power;
  while(tail>=0)//小数点后数的个数
  {
   if(ch[tail]!='.')//把所有数存入数组
   {
    result[i]=ch[tail]-'0';//去真是数值
    base+=(ch[tail]-'0')*p;//存储小树点末尾的数
    i++;//记录小数点后数的个数
    p*=10;
   }
   tail--;
  }
  /**
  逆序存储所有非0数
   int q = 0 ;
    while(q<i)
  {
      cout<<result[q] ;
      q++ ;
  }
  **/
  while(power>1)//计算阶乘
  {
   tail=0;
   while(tail<i)
   {
    result[tail]=base*result[tail];
    tail++;
   }
   int j=0;
   int before=0;
   int mid=0;
   while(j<i)
   {
    mid=(result[j]+before)%10;
    before=(result[j]+before)/10;
    result[j]=mid;
   // cout<<mid<<endl ;
    j++;
   }
   while(before>0)
   {
    result[i]=before%10;
    before/=10;
    i++;
   }
   power--;

  }
  after*=pow;//小数点的总位数

   /**     while(i>=0)
        {
                cout<<result[i];
                i--;
        } **/
  if(after>=i)//移位数大于总数的位数
    {
     int zero=after-i;//小数点后添0的个数
      printf("%c",'.') ;
      while(zero>0)
      {
      printf("%d",0) ;
        zero--;
      }
      i--;
      while(i>=0)
      {
       printf("%d",result[i]) ;
        i--;
      }

      }
    else if(after<i)
    {
     i--;
      while(i>=0)
      {
       if(after-i==1)
         printf("%c%d",'.',result[i]) ;
        else
          printf("%d",result[i]) ;
        i--;
      }

  }
  printf("\n");

   }
}
 scanf("%s%d",&ch,&power)!=EOF
 这句话一定要写,不然会报Output Limit Exceeded,没法终止程序。
 
 解决方法三:Java
 
import java.math.BigDecimal;
import java.util.Scanner;
/**
 * 高精度计算
 * @author tanlvxu
 *
 */
public class Main{

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in) ;
		while(cin.hasNext())
		{
			BigDecimal x = cin.nextBigDecimal() ;
			BigDecimal y = BigDecimal.valueOf(1.0) ;
			int n = cin.nextInt() ;
			for(int i=1;i<=n;i++)
			{
				y = y.multiply(x) ;
				
			}
			String out = new String(y.toPlainString()) ;
			boolean flag =  false ;
			int q = out.length() - 1 ;
			//去掉后面的0
			while(out.charAt(q)=='0'){
				q--  ;
			}
			if(out.charAt(q)=='.')
			{
				q-- ;
			}
			int p = 0 ;
			//去掉前面多余的0
			while(out.charAt(p)=='0')
				p++ ;
			for(int i=p;i<=q;i++)
			{
				System.out.print(out.charAt(i)) ;
				
			}
			System.out.println();
		}
	}

}
 或者也可以这样:
 
import java.math.BigDecimal;
import java.util.Scanner;

public class Demo5 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin = new Scanner(System.in) ;
		while(cin.hasNext())
		{
			BigDecimal x = cin.nextBigDecimal() ;
			int n = cin.nextInt() ;
			x = x.pow(n);
			
			String str = x.toPlainString() ;
			int q = str.length() - 1 ;
			
				while(str.charAt(q)=='0')
				{
					q -- ;
				}
				if(str.charAt(q)=='.')
				{
					q-- ;
				}
			int p = 0 ;
			while(str.charAt(p)=='0')
			{
				p++ ;
			}
			for(;p<=q;p++)
			{
				System.out.print(str.charAt(p));
			}
			System.out.println() ;
		}
	}

}
 
   java准确的计算精度BigInteger/BigDecimal常用方法:
   add()加,substract()减,multiply()乘,devide()除
   abs()绝对值,max()最大值,min()最小值,compare to()比较大小,toString(),toPlainString() 转化为字符串
 
     仅BigInteger , mod()求余, gcd()求最大公约数;,and()求与,or()求或,not()求反,xor()求异或
 
BigDecimal pow(int n)
          返回其值为 (thisn)BigDecimal,准确计算该幂,使其具有无限精度。
 String toPlainString()
          返回不带指数字段的此 BigDecimal 的字符串表示形式。
 String toString()
          返回此 BigDecimal 的字符串表示形式,如果需要指数,则使用科学记数法。

 

static BigDecimal valueOf(double val)
          使用 Double.toString(double) 方法提供的 double 规范的字符串表示形式将 double 转换为 BigDecimal
static BigDecimal valueOf(long val)
          将 long 值转换为具有零标度的 BigDecimal
static BigDecimal valueOf(long unscaledVal, int scale)
          将 long 非标度值和 int 标度转换为 BigDecimal
分享到:
评论

相关推荐

    HP 1001固网驱动

    标题中的“HP 1001固网驱动”指的是HP公司生产的型号为1001的网络打印服务器的驱动程序。HP(Hewlett-Packard)是一家全球知名的科技公司,其产品线涵盖打印机、计算机硬件等多个领域。在这个特定的情况下,我们关注...

    NST1001应用手册 1.0_NST1001_NST1001中文手册_nst1001手册_

    《NST1001应用手册 1.0》是针对NST1001这款接触式温度集成电路的专业开发指南,旨在为工程师和开发者提供详尽的技术资料和应用指导。这款手册结合了理论与实践,深入浅出地介绍了NST1001的各项功能特性,以及如何在...

    1001 bit tools 1.1.5 简体中文版

    《1001 Bit Tools 1.1.5:实用工具箱的全面解析》 在IT领域,一款全面且易用的工具集合软件是每个技术爱好者和专业人员的必备。"1001 Bit Tools 1.1.5 简体中文版"就是这样一款强大的工具集,它为用户提供了一系列...

    NST1001温度传感器使用例子.zip

    在本文中,我们将深入探讨如何在51单片机STC12C5A60S2上使用NST1001温度传感器进行数据采集。NST1001是一款常用的数字温度传感器,它能提供精确的温度测量值,并且与微控制器的接口简单,非常适合在各种嵌入式系统中...

    Decawave DWM1001硬件的简单 C 示例_C语言_代码_下载

    请注意,以下示例包含使用 DWM1001C 的 UWB 功能的非常基本的应用程序。 符合法规的 DWM1001C 高级固件可在https://www.decawave.com/product/dwm1001-module/上找到 概述 该项目包含 DWM1001 硬件及其衍生产品的 ...

    BARROT_BR1001_Datasheet_V1.3.pdf

    百瑞科技的BR1001是一款蓝牙SoC产品,它是一个针对2.4GHz蓝牙低功耗(BLE)无线微控制器应用的定制系统芯片(SoC)。BR1001集成了2.4GHz ISM频段射频收发器,用于无线连接,并且内部包含了一个单个低功耗32位RISC ...

    1001bit 建筑su插件sketchup中德天正

    1001bit Tools (1001bit 建筑工具集),1001bit_pro v2.1建模插件中文汉化版(比suapp还好用还全面的SketchUp插件,支持SketchUp8.0,2013,2014,2015) 可以自由添加减少要的图标,从此不再被各种各样眼花缭乱的插件所...

    驱动程序-打印机驱动-固网hp1001打印服务器驱动.zip

    本压缩包文件"驱动程序-打印机驱动-固网hp1001打印服务器驱动.zip"是专为固网hp1001打印服务器设计的驱动程序集合,旨在确保该打印服务器能够与电脑系统无缝协作。 固网hp1001打印服务器是一种网络打印解决方案,...

    1001序列检测器modelsim仿真和测试文件

    这里我们关注的是“1001序列检测器”,它是一种用于检测特定序列(在这种情况下可能是1001)的数字逻辑电路。模型模拟器(Modelsim)是一款广泛使用的仿真工具,特别适合于这样的任务。 首先,我们要理解序列检测器...

    DWM1001原理图.pdf

    根据提供的文件信息,DWM1001原理图涉及到以下几个主要知识点: 1. DWM1001模块概述: DWM1001是Decawave公司开发的一款超宽带(Ultra Wideband,简称UWB)无线通信模块,适用于室内定位和追踪系统。该模块集成了...

    1001 bit pro 2.1中文for2014-2015

    "1001 bit pro 2.1中文for2014-2015"是一个软件产品,根据其标题和描述,我们可以推测这是一款专为2014至2015年设计的中文版专业软件。"1001 bit"可能是该软件系列或公司的名称,标签进一步确认了这一主题。尽管没有...

    IP1001_pdf

    IP1001是一款集成的物理层设备,适用于1000BASE-T、100BASE-TX和10BASE-T网络应用。这款设备支持多种媒体访问控制器(MAC)的接口,包括介质独立接口(MII)、千兆介质独立接口(GMII)和简化千兆介质独立接口...

    IP1001数据手册

    《IP1001数据手册》是一份详细阐述IP1001硬件特性和应用的文档,对于硬件设计工程师来说,是进行相关产品开发的重要参考资料。这份手册包含了硬件设计的关键信息,如芯片封装、电气特性、接口定义以及操作指南等。...

    EXCEL VBA 范例应用大全1001例

    《EXCEL VBA 范例应用大全1001例》是一本全面介绍Excel VBA编程技术的实用教程,其特色在于提供了大量的实例,帮助读者深入理解和掌握VBA在Excel中的应用。这本书旨在帮助Excel用户提升工作效率,通过编写自定义宏和...

    dwm1001.pdf

    ### DWM1001模块概述 DWM1001模块是一款基于Decawave公司DW1000 Ultra Wideband (UWB) 收发器芯片的产品,它符合IEEE 802.15.4-2011 UWB标准。此模块集成了UWB天线、蓝牙天线、所有射频电路、Nordic Semiconductor ...

    HR1001C 增强型LLC控制器 自适应死区控制; 电容模式保护和 增强的电涌保护

    HR1001C是增强型LLC控制器 这提供了自适应的死区时间调整 (ADTA)和电容模式保护(CMP) 特性,以及功能上的改进 飙升的性能。 ADTA在两者之间插入了一个死区 互补门自动输出。这 是否通过保持输出关闭来确保 感应半桥...

    大麦盒子DM1001、DM1004降级图文教程

    ### 大麦盒子DM1001、DM1004降级图文教程 #### 前言 自从大麦盒子推出2.0UI系统以来,不少用户对新系统的使用体验表示不满。新版本系统中增加了许多广告,并且操作变得更加复杂。此外,系统自带的后台功能还可能将...

    TDT 1001-2012 地籍调查规程.zip

    《TDT 1001-2012地籍调查规程》是中国土地调查领域的标准规范,它详细规定了地籍调查的全过程,包括调查的原则、方法、程序、技术要求和成果管理等内容。这一规程对我国的土地管理和规划具有重要的指导意义,确保了...

    sketchup 1001插件,2014-15汉化版

    sketchup 1001插件,2014-15汉化版,自用没有问题sketchup 1001插件,2014-15汉化版,自用没有问题sketchup 1001插件,2014-15汉化版,自用没有问题sketchup 1001插件,2014-15汉化版,自用没有问题sketchup 1001...

Global site tag (gtag.js) - Google Analytics