实现自己的pow函数&&打印1到最大的n位数

实现自己的pow函数。貌似很简单,但要完美的实现也不易。

1、浮点数的大小不能由 == 来决定。

2、考虑基数为负数的情况。

3、基数为0而指数为负数会出错。

#include<iostream>
#include<string>
#include<stack>
using namespace std;
bool error;
//浮点数比较
bool equal(double a,double b){
	if( (a-b<0.000001)&& (a-b>-0.000001) )
		return true;
	return false;
}
double getpowvalue(double base,int posexp){
	if(posexp == 0)
		return 1.0;
	if(posexp == 1)
		return base;
	double result = 1.0;
	for(int i =1;i<=posexp;i++)
		result *= base;
	return result;
}
double mypow(double base,int exp){
	error = true;
	//基数为0而exp为负数如果计算则会出错
	if(equal(base,0.0) && exp <0){
		//表示不是由于异常而返回的0
		error = false;
		return 0.0;
	}
	int posexp = abs(exp);
	double result = getpowvalue(base,posexp);
	if(exp < 0)
		result = 1.0/result;
	return result;
}
int main(){
	cout<<mypow(2.0,3)<<endl;
	cout<<mypow(2.0,-3)<<endl;
	cout<<mypow(0.0,-3)<<endl;
	system("PAUSE");
	return 0;
}
打印1到最大的n位数。

要考虑n很大的情况,比如有99位的数,那么long long能不能存都是问题,所以要用字符数组来表示。有两种方法:

1、用字符数组来模拟加法,一直加到超过要求的位数,这样写起来麻烦,但速度快。

2、全排列,开头的'0'不输出。这样简单,但不停的递归调用会慢。

代码见下面:

#include<iostream>
#include<string>
#include<stack>
using namespace std;
//模拟加法
void printalln(int n){
	char *numbers = new char[n+1];
	memset(numbers,'0',sizeof(numbers));
	//表示数的长度
	int sumlen = 1;
	bool overflow = false;
	while(true){
		int result = numbers[0]-'0'+1;
		if(result == 10){
			numbers[0] = '0';
			int len = 2;
			//len表示当前产生的位置要加在那个位上
			while( len<n+1 && numbers[len-1]-'0'+1 == 10 ){
				numbers[len-1] = '0';
				len++;
			}
			if(len >=n+1)
				overflow = true;
			else{
				if(sumlen < len)
					sumlen = len;
				result = numbers[len-1]-'0'+1;
				numbers[len-1] = result+'0';
			}
		}
		else{
			numbers[0] = result+'0';
		}
		if(overflow)
			break;
		else{
			for(int i = sumlen-1;i>=0;i--){
				int d = numbers[i]-'0';
				printf("%d",d);
			}
			printf(" ");
		}
	}
	delete [] numbers;
	printf("\n");
}
//全排列
void print_recurve(int n,char numbers[],int current){
	if(current == n){
		int i = 0;
		while(numbers[i] == '0' && i<=(n-1))
			++i;
		if(i<= n-1){
			for(;i<=n-1;++i){
				int d = numbers[i]-'0';
				printf("%d",d);
			}
			printf(" ");
		}
		return;
	}
	for(int i =0;i<10;i++){
		numbers[current] = i+'0';
		print_recurve(n,numbers,current+1);
	}
}

void printalln2(int n){
	char *numbers = new char[n+1];
	memset(numbers,'0',sizeof(numbers));
	print_recurve(n,numbers,0);
	delete [] numbers;
};

int main(){
	printalln(3);
	printalln2(3);
	system("PAUSE");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值