高精度进阶
Posted liuziwen0224
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度进阶相关的知识,希望对你有一定的参考价值。
目录
- 计算(2^N)
- 大整数因子
- 计算(n!)
- 阶乘和
1
OPJ1.6.12 计算(2^N)
描述
任意给定一个正整数(N(Nle 100)),计算2的n次方的值。
输入
输入一个正整数(N)。
输出
输出(2^N)的值。
样例输入
5
样例输出
32
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iomanip>
using namespace std;
int ans[1005]={0};
void db2(int c[]){
for(int i=1;i<=c[0];i++){
c[i]*=2;
}
for(int i=1;i<=c[0];i++){
if(c[i]>=10){
c[i+1]+=(c[i]/10);
c[i]%=10;
}
}
if(c[c[0]+1]) c[0]++;
}
void prta(int c[]){
for(int i=c[0];i>=1;i--){
printf("%d",c[i]);
}
}
int main( ){
ans[1]=1;
ans[0]=1;
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
db2(ans);
}
prta(ans);
return 0;
}
2
OPJ1.6.13:大整数的因子
描述
已知正整数(k)满足(2le kle 9),现给出长度最大为30位的十进制非负整数(c),求所有能整除(c)的(k)。
输入
一个非负整数(c),(P_c)表示(c)的位数,(P_cle 30)。
输出
若存在满足 (c%k=0) 的(k),从小到大输出所有这样的(k),相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。
样例输入
30
样例输出
2 3 5 6
#include<bits/stdc++.h>
using namespace std;
char str[32];
int len,k;
bool isTrue(int k){
int num1 = 0, num2=0;
for(int i=0;i<len;i++){
num1=str[i]-'0'+num2*10;
num2=num1%k;
}
return num2 == 0;
}
int main(){
scanf("%s",str);
len = strlen(str);
bool ok = false,first = true;
for(k=2;k<=9;k++){
if(isTrue(k)){
ok=true;
if(first){
printf("%d",k);
first = false;
}else{
printf(" %d",k);
}
}
}
if(!ok) puts("none");
else putchar('
');
return 0;
}
3
1.6.14:(n!)
描述
求(10000)以内(n)的阶乘。
输入
只有一行输入,整数(n(0le nle 10000))。
输出
一行,即(n!)的值。
样例输入
100
样例输出
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
#include<bits/stdc++.h>
using namespace std;
int n,a,fac[50000],ans[50000]={1,1};
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=ans[0];j++){
ans[j]=ans[j]*i+fac[j];
fac[j]=0;
if(ans[j]>=10){
fac[j+1]+=ans[j]/10;
ans[j]%=10;
if(j==ans[0]) ++ans[0];
}
}
}
for(int i=ans[0];i>0;i--) printf("%d",ans[i]);
putchar('
');
return 0;
}
4
OPJ1.6.15 阶乘和
描述
用高精度计算出(S=1!+2!+3!+…+n!(nle 50))
其中“!”表示阶乘,例如:(5!=5 imes 4 imes 3 imes 2 imes 1)。
输入正整数(N),输出计算结果(S)。
输入
一个正整数(N)。
输出
计算结果(S)。
样例输入
5
样例输出
153
来源
NOIP1998复赛 普及组 第二题
#include<bits/stdc++.h>
using namespace std;
int a[10001]={1};
int ans[100001]={0};
char n[1001];
int en[1001];
int lans=1;
int la=1;
int x;
int main()
{
int n;
cin>>n;
int x=0;
for(int i=1;i<=n;i++)
{
memset(a,0,sizeof(a));
a[0]=1;
for(int k=1;k<=i;k++)
{
for(int j=0;j<la;j++)
{
a[j]=a[j]*k+x;
x=a[j]/10;
if(x>0&&j==la-1)
la++;
a[j]=a[j]%10;
}
}
int l=0;
x=0;
while(l<=la||l<=lans) {
ans[l]=ans[l]+a[l]+x;
x=ans[l]/10;
if(x>0)lans++;
ans[l]=ans[l]%10;
l++;
}
}
int flag=0;
for(int i=lans;i>=0;i--){
if(ans[i]==0&&flag==0) continue;
else flag=1;
cout<<ans[i];
}
return 0;
}
以上是关于高精度进阶的主要内容,如果未能解决你的问题,请参考以下文章
我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段
我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段