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

来源:互联网 发布:linux 电池电量 编辑:程序博客网 时间:2024/06/07 02:25

实现自己的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){//表示不是由于异常而返回的0error = 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;}


0 0
原创粉丝点击