hdu1063

做了一天多,想死。。。

第一个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;
}

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值