| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
贴一个改了N次才提交上的考虑了所有异常输入输出的代码给大家看看,附上几组测试数据特别需要注意的几组测试数据是:
0.00000 0
1.23456 0
123456. 0
123456. 1
1234.00 1
123.000 2
大家可以试一下这几组异常数据,如果你都跑过了,而且格式完全正确,AC应该就没什么问题了。
至于鄙人的代码,的确写的又臭又长,被这个题折磨的暂时没什么好心情去改了。
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
char result[200];
void reverse(char * a)
{
int len=strlen(a);
for(int i=0; i<len/2; i++)
{
int temp=a[i];
a[i]=a[len-1-i];
a[len-1-i]=temp;
}
}
void multiply(char * a, char * b, char * result)//一定要保证输入的a和b指针是不同的
{
reverse(a);
reverse(b);
int a_len, b_len, i, j;
a_len=strlen(a);
b_len=strlen(b);
int * res=new int[a_len+b_len];
memset(res, 0, (a_len+b_len)*sizeof(int) );
for(i=0; i<a_len; i++)
for(j=0; j<b_len; j++)
{
res[i+j] += (a[i]-'0')*(b[j]-'0');
}
//调整进位
i=j=0;
for(i=0; i<a_len+b_len; i++)
{
res[i+j+1] += res[i+j]/10;
res[i+j] = res[i+j]%10;
}
//转换为char类型的result
for(i=0; i<a_len+b_len; i++)
result[i]=res[i]+'0';
result[i]='\0';
reverse(result);
reverse(a); //我们设定a为输入的R,所以每次乘法颠倒后,应该保证下一次输入的是正序的R
delete [] res;
}
//函数,求R的n次幂,结果放入result中
void factorial(char * s, char * result, int n)
{
char temp[200];
if(n==0)
{
result[0]='1';
result[1]='\0';
}
else if(n==1)
{
strcpy(result, s);
}
else
{
strcpy(temp, s);
for(int i=1; i<=n-1; i++)
{
multiply(s, temp, result);
strcpy(temp, result);
}
}
}
bool is_float(char * s, bool & hasDotandIsInt, int & dotIndex)
{
int len=strlen(s);
hasDotandIsInt = false;
for(int i=0; i<len; i++)
{
if(s[i]=='.' && i==len-1)
{
hasDotandIsInt = true;
dotIndex = i;
return false;
}
else if(s[i]=='.' && i!=len-1)
{
dotIndex = i;
if(atoi(s+i+1)==0)
{
hasDotandIsInt = true;
return false;
}
else
return true;
}
}
return false;
}
int main()
{
char s[7];
int n;
while(cin>>s>>n)
{
if(atof(s) == 0.000000)
{
printf("0\n");
continue;
}
if(n == 0)
{
printf("1\n");
continue;
}
bool isFloat = false, hasDotandIsInt = false;
int dotIndex;
isFloat = is_float(s, hasDotandIsInt, dotIndex);
if(hasDotandIsInt)
strcpy(s+dotIndex, "\0");
//还需要处理输入,比如95.123转换为95123,然后在输入
if(strcmp(s,"0")==0)
{
printf("0\n");
}
else if(isFloat==true)
{
char sd[7]; //经过处理,将小数点去掉后的s
char number[200];
memset(number, '0', sizeof(char)*200);
int i, flo_fla, flo_bits, des_flo_len;
i=flo_fla=flo_bits=0;
//首先将最后的0去掉
i=strlen(s)-1;
while(s[i]=='0') i--;
s[i+1]='\0';
//第二步将小数位去掉,放入sd数组
i=0;
while(s[i]!='.') i++;
flo_fla=i;
s[flo_fla]='\0';
strcpy(sd, s);
strcpy(&sd[flo_fla], &s[flo_fla+1]);
flo_bits=strlen(sd)-flo_fla;
des_flo_len=n*flo_bits;
factorial(sd, result, n);
i=0;
while(result[i]=='0') i++;
int in_len=strlen(&result[i])-des_flo_len;
if( in_len<=0 )
{
number[0]='.';
strcpy(&number[ abs(in_len)+1 ], &result[i]);
}
else
{
number[in_len]='.';
strcpy(&number[in_len+1], &result[i+in_len]);
result[i+in_len]='\0';
strcpy(number, &result[i]);
number[in_len]='.';
}
cout<<number<<endl;
}else
{
factorial(s, result, n);
int i=0;
while(result[i]=='0') i++;
printf("%s\n", &result[i]);
}
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator