N!高效算法
来源:互联网 发布:qq for mac 编辑:程序博客网 时间:2024/06/08 10:18
阶乘递归代码:
#include<stdio.h> int f(int n); void main() { printf("%d\n",f(5)); } int f(int n) { if(n==0)return 1; return n*f(n-1); }
大数阶乘问题:
10000以内的阶乘及位数:
代码一:
#include <stdio.h> int main() { int carry,n,j; int a[40001]; int digit; int temp,i; while(scanf("%d",&n)!=EOF){ a[0]=1;digit=1; for(i=2; i<=n; i++) { for(carry=0,j=1; j<=digit; ++j) { temp=a[j-1]*i+carry; a[j-1]=temp%10; carry=temp/10; } while(carry) { //digit++; a[++digit-1]=carry%10; carry/=10; } } for(int k=digit; k>=1; --k) printf("%d",a[k-1]); printf("\n"); printf("length=%d\n",digit); } return 0; }
代码二:
#include <iostream> using namespace std; void main() { int result[40000]; //保存结算结果的数组 int height = 1; //结果的最高位 int num; //计算阶乘的数字 cin>>num; result[0] = 1; for (int i=1;i<=num;i++) { int res = 0; //进位 for (int j=0;j<height;j++) { int buf = result[j] * i + res; //计算结果 result[j] = buf % 10; //取当前位 res = buf / 10; //计算进位 } while (res) { result[height++] = res % 10; //取当前位 res /= 10; //计算进位 } } for (int k=height-1;k>=0;k--) { cout<<result[k]; } cout<<endl; cout<<"length="<<height<<endl; }
例如1000阶乘位数:
log10(1)+log10(2)+•••+log10(1000)取整后加1
#include<stdio.h> #include<math.h> void main() { int n,i; double d; scanf("%d",&n); d=0; for(i=1;i<=n;i++) d+=log10(i); printf("%d\n",(int)d+1); }
高效算法:
斯特林公式(stirling)求阶乘的位数:
#include<stdio.h> #include<math.h> #define PI 3.1415926 int main() { int cases,n,ans; scanf("%d",&cases); while(cases--) { scanf("%d",&n); if(n==1) printf("1\n"); else { ans=ceil((n*log(n)-n+log(2*n*PI)/2)/log(10)); printf("%d\n",ans); } } return 0; }
阶乘最后非零位:
#include<stdio.h> #include<string.h> #define maxn 10000 int lastdigit(char buf[]) { const int mod[20]={1,1,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2}; int len=strlen(buf),a[maxn],i,c,ret=1; if(len==1) return mod[buf[0]-'0']; for(i=0;i<len;i++) a[i]=buf[len-1-i]-'0'; for(;len;len-=!a[len-1]) { ret=ret*mod[a[1]%2*10+a[0]]%5; for(c=0,i=len-1;i>=0;i--) c=c*10+a[i],a[i]=c/5,c%=5; } return ret+ret%2*5; } int main() { char n[maxn]; int a; while(scanf("%s",n)!=EOF) { a=lastdigit(n); printf("%d\n",a); } return 0; }
文章内容转自:http://303272388-qq-com.iteye.com/blog/1023897
阅读全文
0 0
- N皇后高效算法
- N!高效算法
- N皇后高效算法实现
- 高效求幂取余 算法,复杂度 log(n)
- a的n次方的高效算法
- N皇后的最高效算法
- 求n次方的高效算法
- 关于N皇后问题高效试探回溯算法的分析
- 关于N皇后问题高效试探回溯算法的分析
- 关于N皇后问题高效试探回溯算法的分析
- N皇后问题的两个最高效的算法
- N皇后问题的两个最高效的算法
- N皇后问题的两个最高效的算法
- N皇后问题的两个最高效的算法
- N皇后问题的两个最高效的算法
- N皇后问题的两个最高效的算法
- N皇后问题的两个最高效的算法
- N皇后问题的两个最高效的算法
- QTableWidget详解(样式、右键菜单、表头塌陷、多选等)
- JSONObject optString与getString
- 循环删除list中的元素
- Spark RDD 常用算子
- Java Socket学习
- N!高效算法
- 异常信息为: Illegal mix of collations for operation 'concat'
- 腾讯云多个实例之间SSH免密访问
- c# 字符与16进制互转
- APP崩溃的异常捕捉
- 欢迎使用CSDN-markdown编辑器
- 数学建模文章汇总
- 机器学习实战
- 简单的BFS处理——八数码问题