POJ1001

目标:计算大数幂运算

要求:

1.输入:0.0<R<99.999 0<n<=25。其中R占输入的1-6列 n占输入的8-9列。

2.输入:无用的前导0不需要输出,无用的后导0不需要输出,整数不输出小数点

3.代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>


#define N 10000


int main()
{
char Input[7] ; //保存原始输入数据
int n ; //乘法次数
int point_pos ; //小数点的位置
int strlen_b ;
char a[ N ] ; //乘数a,也是最终的结果
char b[ N ] ; //乘数b
int c[ N ] ; //临时保存乘法执行结果的变量
int flag ; //用于判断R 与 n输入的数据是否在要求范围内
int k ;








//Input start
while(scanf("%s%d",Input,&n) == 2)
{

//初始化乘数数组及中间结果保存数组 
memset( a, '\0', N ) ;
a[0] = '0' ;
a[1] = '1' ;
memset( b, '\0', N ) ;
b[0] = '0' ;
memset( c, 0, N * sizeof(int) ) ;





//取出小数点
strlen_b = 1 ;
for (int i = (int)strlen(Input)-1; i >= 0; i-- )
{
( Input[i] != '.' ) ? b[strlen_b++] = Input[i] : ( point_pos = ( (int)strlen(Input) - 1 - i ) * n ) ;
}


b[strlen_b] = '\0' ;



//判断R n的范围是否合法,因为浮点数比较大小比较麻烦,所以把浮点数转换成整数进行范围比较
k = 1 ;
flag = 0 ;
for (int i = 1; i < (int)strlen(b); ++i)
{
flag += ( b[ i ] - '0' ) * k ;
k = k * 10 ;
}
if ( ( flag <= 0 ) || ( flag >= 99999 ) || ( n <= 0 ) || ( n > 25 ) )
{
continue ;
}



//开始进行乘法运算
int sum ; //用于保存乘法和进位 
int j ;
for( int k = 1; k <= n; k++ )
{


//mutiplication and add
for( int alength = 1; alength < (int)strlen(a); alength++ )
{
sum = 0 ;
j = alength ;
for( int blength = 1; blength < (int)strlen(b); blength++)
{
sum = ( a[ alength ] - '0' ) * ( b[ blength ] - '0' ) + sum ;
c[ j ]  += sum % 10 ;
j++ ;
sum /= 10 ; 
}
if( sum != 0 )
c[ j++ ] += sum ;
}




//将乘法结果转化成合法模式
for( int i = 1; i < j; i++ )
{
c[ i+1 ] += c[i] / 10 ;
c[ i ] = c[ i ] % 10 ;
}

if ( c[j] != 0)
{
j++ ;
}

for( int i = 1; i < j; i++ )
{
a[ i ] = c[ i ] + '0' ;
c[ i ] = 0 ;

a[j] = '\0' ;
}//mutiplication end 

memset( b , '\0', N ) ;
b[ 0 ] = '0' ;
for (int i = 1, j = 1; j < (int)strlen(a) ; i++)
{
if ( i == ( point_pos + 1 ) )
{
b[i] = '.' ;
continue ;
}


b[i] = a[j++] ;
}


b[j+1] = '\0' ;



int l, r ;
for (int i = 1; i < (int)strlen(b); ++i)
{
if (b[i] != '0')
{
l = i ;
break ;
}
}
for (int i = (int)strlen(b) - 1 ; i >= 1; --i)
{
if (b[i] != '0')
{
r = i ;
break ;
}
}


if ( r == l )
{
printf("0\n") ;
continue ;
}


if ( b[l] == '.')
{
for (int i = r; i > l; --i)
{
printf("%c", b[i]);
}
printf("\n");
continue ;
}


for (int i = r; i >= l; --i)
{
printf("%c", b[i]);
}
printf("\n");
}
return 0 ;

}


4.一些心得

    我也是报了一下午的WA,但是测试网上给的数据都是对的。其实网上的测试数据没啥用,人家都说n要大于0了,还在那测试呢。那不有病吗。关于报WA的错误无非就是那么几种,第一就是没有按要求输出数据,那三条必须都满足。第二就是最高位进位的时候要么是没进位,要么是进位了没有更新保存结果的数据长度(因为我的结果数组长度一直在用j变量保存),你可能会说那我用strlen能不能测试出来,我只能说有可能测出来是对的,有可能测出来是错误的。这个没有去除前导0和后导0的时候,结果数组的长度一定要人为的进行维护。如果没听懂我说的什么意思,那么你输入4 5,或许你一直WA的问题,你就明白了。

用到循环的时候一定要注意循环结束之后是否对结果还会产生影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值