POJ 1001解题思路

POJ 1001是高精度大数相乘的题目,主要是考察通用乘法,该题目解题核心有两个:1、大数乘法,基本数据结构已经无法满足该乘法要求时,只能通过改变数字的表示形式,使用最基本的数组来进行解决;2、格式化输出,即将在数字前后无用的0进行清理。

同时需要注意的是该题目输入的数据是小数,因此必须考虑乘积的小数点位置,最简单的办法就是记住输入参数的小数位数a,然后根据幂运算的次数n,得出在最终的乘积中,小数位数为a*n;

根据该思路,该题目解题代码如下:

#include <iostream>
#include <string>


using namespace std;


#define RESULT_LENGTH 150 //幂运算的结果长度
#define INPUT_LENGTH 7 //输入长度


int pointbits = 0;//记录小数位数
char baseNumber[INPUT_LENGTH]={'\0'};//输入的底数
int length = 0;//底数的实际长度
int ex = 0;//输入的指数


int a[RESULT_LENGTH] = {0};//用作被乘数
int alength = 0;//a的实际长度
int b[RESULT_LENGTH] = {0};//用作乘数
int blength = 0;//b的实际长度
int c[RESULT_LENGTH] = {0};//用作临时结果
int clength = 0;//c的实际长度


//格式化输入的底数;即获取小数位数,底数去小数点并反转
void formatInput();


//将格式化后的字符串数组转换成整数数组
void charArray2intArray();


//大指数幂乘法,a[]为被乘数,b[]为乘数,c[]为积,alength为a[]的长度,blength为b[]的长度
int cal();
//大指数幂乘法的递归版本
//void cal();


//格式化结果输出,主要功能是去掉结果头尾的无用0
void formatOutput(char result[]);


void formatInput()
{
length = strlen(baseNumber);
//查找小数点所在位置,记录小数位数,底数去小数点
for(int i=0;i<length;i++)
{
if(baseNumber[i]=='.')
{
pointbits = (length-i-1)*ex;
for(;i<length-1;i++)
{
baseNumber[i] = baseNumber[i+1];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
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. 输入说明 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 小提示 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) { ... } c while(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 */ { ... } 来源 East Central North America 1988 北大OJ平台(代理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值