实现自己的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
- 实现自己的pow函数&&打印1到最大的n位数
- 写函数实现打印出1到最大的n位数,形参为n位数
- 打印1到最大的n位数(Java实现)
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的N位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- spring+ibatis实现DB的动态切换2(AbstractRoutingDataSource的原理)
- 把每一位上的数 打印出来
- 网络状态2
- Hive 中 Map Join 的适用场景:非等值连接<转>
- Android QQ第三方登录
- 实现自己的pow函数&&打印1到最大的n位数
- 通过输入 边长 和 形状 来绘制矩形
- vector类
- .net缓存应用与分析 .
- 每个学Java的人都应该搞懂
- .Net静态页面
- 如何判断一点在三角形内
- 谈一下怎样判断网页是静态的还是伪静态的? .
- 【转】一定要搞死GetMemory()