侧边栏壁纸
  • 累计撰写 192 篇文章
  • 累计创建 2 个标签
  • 累计收到 87 条评论

【基础算法】高精度 (题解)

Allen Best
2022-10-12 / 0 评论 / 0 点赞 / 17 阅读 / 3,541 字
温馨提示:
本文最后更新于 2023-04-27,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1170:计算2的N次方

任意给定一个正整数N(N<=100),计算2的n次方的值。

#include<bits/stdc++.h>
int a[100000];
int main()
{
	int n=0;
	scanf("%d",&n);
	a[1]=1;
	int k = 1;
	for(int i = 1; i <= n; ++i)
	{
		int x=0;
		for(int j = 1; j  <=k; ++j)
		{
			a[j] = a[j]*2+x;
			x = a[j]/10;
			a[j] = a[j]%10;
			if(x!=0 && j==k) k++;//计算到最高位并且有进位,长度加1 
		}	
	}
	for(int i = k; i >= 1; --i) printf("%d",a[i]); 
	return 0;
}

1172:求10000以内n的阶乘

#include<bits/stdc++.h>
int a[100000];
int main()
{
	int n=0;
	scanf("%d",&n);
	a[1]=1;
	int k = 1;
	for(int i = 1; i <= n; ++i)
	{
		int x=0;
		for(int j = 1; j  <=k; ++j)
		{
			a[j] = a[j]*i+x;
			x = a[j]/10;
			a[j] = a[j]%10;
			if(x!=0 && j==k) k++;//计算到最高位并且有进位,长度加1 
		}	
	}
	for(int i = k; i >= 1; --i) printf("%d",a[i]); 
	return 0;
}

1173:阶乘和

用高精度计算出S=1!+2!+3!+…+n!(n≤100),其中“!”表示阶乘,例如:5!=5×4×3×2×1。
输入正整数n,输出计算结果S。

#include<bits/stdc++.h>
using namespace std;
int s[10000],a[10000],n;
//阶乘n!
void mul(int x){
	memset(a,0,sizeof(a));
	a[1]=1;//1!=1;
	int k=1;//(i-1)!最高位数 
	for(int i=1;i<=x;i++){
		int t=0;//进位 
		for(int j=1;j<=k;j++){
			a[j]=a[j]*i+t;
			t=a[j]/10;
			a[j]%=10;
			if(t!=0 && j==k) k++;
		} 
	}
	a[0]=k;
} 
void add(){
	int w=0;
	if(s[0]<a[0]){
		s[0]=a[0];
	}
	for(int i=1;i<=s[0];i++){
		s[i]+=a[i]+w;
		w=s[i]/10;
		s[i]%=10;
	}
	if(w!=0){
		s[0]++;
		s[s[0]]=w; 
	}
}
void mprint(){
	for(int i=s[0];i>=1;i--){
		cout<<s[i];
	}
	cout<<endl;
}
int main(){
	cin>>n;
	s[0]=1;//起始长度
	s[1]=0;
//	mul(n);
//	mprint();
	for(int i=1;i<=n;i++){
		mul(i);
		add();
	}
	mprint();
	return 0;
}

1171:大整数的因子

【题目描述】
已知正整数k满足2≤k≤9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。

【输入】
一个非负整数c,c的位数≤30。

【输出】
若存在满足 c%k == 0 的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。

【输入样例】
30
【输出样例】
2 3 5 6

#include<iostream>
#include<cstring>
using namespace std;
int a[50],b[50];
char str[50];
int divide(int x)//高精除
{
    int i=a[0],res=0;
    while(i>0)
    {
        res*=10;
        res+=a[i];
        res%=x;
        i--;
    }
    return res;
}
int main()
{
    int len;
    bool flag=false;
    int i;
 
    cin>>str;
    len=strlen(str);
 
    int k=1;
    for(i=len-1;i>=0;i--)//数据处理
    {
        a[k]=str[i]-'0';
        k++;
    }
 
    a[0]=len;
    for(i=2;i<=9;i++)
    {
        if(divide(i)==false)//判断是否能整除,可以就输出
        {
            flag=true;
            cout<<i<<" ";
        }
    }
    if(flag==false)
        cout<<"none"<<endl;
    return 0;
}

1175:除以13

【题目描述】
输入一个大于0的大整数N,长度不超过100位,要求输出其除以13得到的商和余数。

【输入】
一个大于0的大整数,长度不超过100位。

【输出】
两行,分别为整数除法得到的商和余数。

【输入样例】
2132104848488485
【输出样例】
164008065268345
0

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    int a[110];
    char str[110];
    int len;
    int i,k=0,b=0,c;
 
    cin>>str;
    len=strlen(str);
 
    for(i=len-1;i>=0;i--)
        a[++k]=str[i]-'0';
    a[0]=len;
 
    i=a[0];//首项处理
    while(b<13)
    {
        b*=10;
        b+=a[i];
        i--;
    }
    cout<<b/13;
 
    b%=13;
    c=b;
    while(i>=1)//高精除
    {
        b*=10;
        b+=a[i];
        i--;
        cout<<b/13;
        b%=13;
        c=b;
    }
    cout<<endl;
    cout<<c<<endl;
    return 0;
}

求2+22+222+…+222….*2

题目描述
求2+22+222+…+222…*2的和是多少?最后一项有多少2相乘由键盘读入的n决定(1<=n<=100)!

比如:n=3,那么s=2+22+22*2=14!

输入
从键盘读入一个整数n(1<=n<=100)

输出
输出求出的和

样例
输入复制
3
输出复制
14

#include<bits/stdc++.h>
using namespace std;
int a[100]={1};
int r[1000];
int i,j,k=1,n,k2=1,len; 
int main(){
	cin>>n;
	for(i=1;i<=n;i++){
		for(j=0;j<k;j++){
			a[j]=a[j]*2;
		}
		//进位
		for(j=0;j<k;j++){
			if(a[j]>=10){
				a[j+1]+=a[j]/10;
				a[j]=a[j]%10;
			}
		} 
		if(a[k]!=0){
			k++;
		}
		len=k;
		if(k2>k) len=k2;
		for(j=0;j<len;j++){
			r[j]=r[j]+a[j];
			if(r[j]>=10){
				r[j+1]+=r[j]/10;
				r[j]%=10;
			}
		}
		if(r[k2]!=0){
			k2++;
		}
	}
	for(i=k2-1;i>=0;i--){
		cout<<r[i];
	}
	return 0;
}

棋盘里的麦子?

题目描述
传说西塔发明了国际象棋而使国王十分高兴,他决定要重赏西塔,西塔说:“我不要你的重赏 ,陛下,只要你在我的棋盘上赏一些麦子就行了。在棋盘的第1个格子里放1粒,在第2个格子里放2粒,在第3个格子里放4粒,在第4个格子里放8粒,依此类推,以后每一个格子里放的麦粒数都是前一个格子里放的麦粒数的2倍,直到放满第64个格子就行了”。“区区小数,几粒麦子,这有何难,来人”,国王令人如数付给西塔。
计数麦粒的工作开始了,第一格内放1粒,第二格内放2粒第三格内放4粒,…还没有到第二十格,一袋麦子已经空了。一袋又一袋的麦子被扛到国王面前来。但是,麦粒数一格接一格飞快增长着,国王很快就看出,即便拿出全国的粮食,也兑现不了他对西塔的诺言。
请你编程帮助国王计算出,第n个棋盘格子中需要放多少粒麦子?

输入
一个整数N代表第n格棋盘(n<=100)

输出
一个整数,代表第n格棋盘中麦子的总数。

样例
输入复制
3
输出复制
4

0

评论区