实现自己的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;
}