做了一天多,想死。。。
第一个bug:
超内存了!!开始在main函数里面没有超内存,但是在调用的函数里面有定义了很大的数组,就超内存了,导致程序崩溃。以前还没有遇到过这种情况。(看不懂汇编语言),自己一点一点去推测的。
第二个bug:
没有对temp清空,第一次输入"12345\0",第二次输入"as\0",因为想让输入的都是小数形式,如果第二次输入的是整数,就在后面补".0\0"这就出错了。
给大家几个刁钻的例子
00.001 3
0010 3
001.00 3
010.00 3
0.010 3
00000 3
.00001 3
.010 3
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f
const int maxn=1e3;//神tm的bug,找了两天,因为上午做的一道题目是也出现超出内存的情况,真的是。。。
char v[maxn];
void cal(char a[],char b[])
{
int i,j,k;
char c[maxn];
memset(c,0,sizeof(c));
int len1=strlen(a),len2=strlen(b);
for(i=0;i<len1;i++){
// printf("%s\n",c);
for(j=0,k=i;j<len2;j++,k++){
int t=(a[i]-'0')*(b[j]-'0');
if(t>50){
if('\0'==c[k+1]) c[k+1]=t/10+'0';
else c[k+1]+=t/10;
t=t%10;
}
if('\0'==c[k]) c[k]=t+'0';
else c[k]+=t;
if(c[k]-'0'>9){
if('\0'==c[k+1]) c[k+1]=(c[k]-'0')/10+'0';
else c[k+1]+=(c[k]-'0')/10;
c[k]=(c[k]-'0')%10+'0';
}
}
}
strcpy(a,c);
}
void slove(int n)
{
char temp[maxn];
strcpy(temp,v);
memset(v,0,sizeof(v));
v[0]=1+'0';
int i,j,k,t;
while(n)
{
if(n&1){//v*=temp;
cal(v,temp);//运算的结果保留在v里面;
}
char temp1[maxn];
strcpy(temp1,temp);
cal(temp,temp1);
n=n>>1;
}
}
int main()
{
char temp[10];
int n;
while(EOF!=scanf("%s%d",temp,&n))
{
memset(v,0,sizeof(v));
int i,j,k,t,cnt1=0,val=0,cnt2=0,pos=-1;//cnt1记录的是小数后面有几位,最后不为0
//先判断是不是小数,不是小数就转化成小数
int flag=0,len=strlen(temp);
for(i=0;i<len;i++){
if('.'==temp[i]){
flag=1;
break;
}
}
if(!flag){
temp[len]='.';
temp[len+1]='0';
}
//转换小数结束
for(i=strlen(temp)-1;'0'==temp[i];i--);
if('.'==temp[i]) i--;
int pos_begin,pos_point=-inf,pos_end=i;
int iszero=1;
for(i=0;i<=pos_end;i++){
if('0'!=temp[i] && '.'!=temp[i]){
iszero=0;
}
}
if(iszero){//单独处理0的情况
if(0==n) printf("1\n");
else printf("0\n");
continue;
}
//n=0
if(0==n){
printf("1\n");
continue;
}
flag=0;
for(i=0;i<strlen(temp);i++){
if('.'==temp[i]){
pos_point=i;
}
else if(0==flag&&'0'!=temp[i]){
pos_begin=i;
flag=1;
}
}
for(i=pos_end,k=0;i>=pos_begin;i--,k++){
if('.'==temp[i]){
i--;
}
v[k]=temp[i];
}
slove(n);
if(-inf==pos_point||pos_point>=pos_end){//只有整数
for(i=strlen(v)-1;i>=0;i--)
printf("%c",v[i]);
}else if(pos_begin>pos_point){//只有小数
printf(".");
int num=(pos_end-pos_point)*n;//小数的位数
for(i=0;i<num-strlen(v);i++)
printf("0");
for(i=strlen(v)-1;i>=0;i--)
printf("%c",v[i]);
}else{//有小数和整数
int num=(pos_end-pos_point)*n;//小数的位数
for(i=strlen(v)-1;i>=0;i--){
if(i!=num-1) printf("%c",v[i]);
else{
printf(".");
printf("%c",v[i]);
}
}
}
printf("\n");
memset(temp,0,sizeof(temp));//因为我在前面擅修改将整数变成小数。。。。
}
return 0;
}