高精度进阶

目录

  1. 计算\(2^N\)
  2. 大整数因子
  3. 计算\(n!\)
  4. 阶乘和

1

OPJ1.6.12 计算\(2^N\)

描述

任意给定一个正整数\(N(N\le 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\)满足\(2\le k\le 9\),现给出长度最大为30位的十进制非负整数\(c\),求所有能整除\(c\)\(k\)

输入

一个非负整数\(c\)\(P_c\)表示\(c\)的位数,\(P_c\le 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('\n');
	return 0;
}

3

1.6.14:\(n!\)

描述

\(10000\)以内\(n\)的阶乘。

输入

只有一行输入,整数\(n(0\le n\le 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('\n');
	return 0;
}

4

OPJ1.6.15 阶乘和

描述

用高精度计算出\(S=1!+2!+3!+…+n!(n\le 50)\)

其中“!”表示阶乘,例如:\(5!=5\times 4\times 3\times 2\times 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;
}
posted @ 2019-12-07 08:39  刘子闻  阅读(130)  评论(0编辑  收藏  举报