加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

蓝桥杯-基础练习-大数算法

发布时间:2020-12-14 02:24:55 所属栏目:大数据 来源:网络整理
导读:之前做过很多大数的题目了吧,现在,那么我们来统计下简单的大数问题。 大数加法,大数减法,大数乘除,大数筛选,大数阶层,好了,现在就针对这几种问题贴上简单代码吧(大数加减和乘除就列出加法和乘法,其它的类型差不多) 我们都知道,大数,要用数组来

之前做过很多大数的题目了吧,现在,那么我们来统计下简单的大数问题。
大数加法,大数减法,大数乘除,大数筛选,大数阶层,好了,现在就针对这几种问题贴上简单代码吧(大数加减和乘除就列出加法和乘法,其它的类型差不多)
我们都知道,大数,要用数组来存放,都是简单的进位问题,这些就不多说,贴代码:

大数加法:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
    char a[1001],b[1001];
    int s[1001],d[1001];
    while(cin>>a>>b)
    {
        memset(s,0,1001*sizeof(int));
        memset(d,1001*sizeof(int));
        for(int i=strlen(a)-1,j=0; i>=0; i--)
        {
            s[j++]=a[i]-'0';
        }
        for(int i=strlen(b)-1,j=0; i>=0; i--)
        {
            d[j++]=b[i]-'0';
        }
        for(int i=0; i<1001; i++)
        {
            s[i]+=d[i];
          // cout<<s[i]<<" ";
            if(s[i]>=10)
            {
                s[i]=s[i]-10;
                s[i+1]++;

            }
        }

        int i;
        for( i=1000; i>=0; i--)


            if(s[i])
                break;
                //cout<<"ffffffffffffffffffffff"<<endl;
            for(int j=i;j>=0;j--)
            cout<<s[j];
 cout<<endl;

    }
    return 0;
}

大数乘法

#include<stdio.h>
#include<string.h>
char s[1000];
void mult(char a[],char b[])
{
    int i,j,k=0,alen,blen,sum=0,res[500][500]={0},flag=0;
    char result[500];
    alen=strlen(a);blen=strlen(b); 

    for (i=0;i<alen;i++)
    for (j=0;j<blen;j++) res[i][j]=(a[i]-'0')*(b[j]-'0');

    for (i=alen-1;i>=0;i--)
        {
            for (j=blen-1;j>=0;j--) sum=sum+res[i+blen-j-1][j];
            result[k]=sum;
            k=k+1;
            sum=sum/10;
        }

    for (i=blen-2;i>=0;i--)
        {
            for (j=0;j<=i;j++) sum=sum+res[i-j][j];
            result[k]=sum;
            k=k+1;
            sum=sum/10;
        }
    if (sum!=0) {result[k]=sum;k=k+1;}

    for (i=0;i<k;i++) result[i]+='0';
    for (i=k-1;i>=0;i--) s[i]=result[k-1-i];
    s[k]='';

    while(1)
        {
        if (strlen(s)!=strlen(a)&&s[0]=='0') 
            strcpy(s,s+1);
        else
            break;
        }
}
int main()
{
char str1[1000],str2[1000];
int t,frag,i;
while(scanf("%s%s",str1,str2)!=EOF)
{
mult(str1,str2);
frag=0;
t=strlen(s);
for(i=0;i<t;i++)
{
if(s[i]!='0')
frag=1;
if(frag==1)
printf("%c",s[i]);
}
if(frag==0)
printf("0");
printf("n");
}
return 0;
}

大数阶层

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define base 10001
int f[base];
int main()
{
    int n;
    cin>>n;
    f[0]=1;
    int k=0;
    int c=0;
    for(int i=1; i<=n; i++)
    {
        for( int j=0; j<=k; j++)
        {
            f[j]=f[j]*i+c;
            c=f[j]/10;
            f[j]=f[j]%10;
        }
        while(c)
        {
            f[++k]=c%10;
            c/=10;
        }
    }
    int i;
    for(i=base-1; i>=0; i--)

        if(f[i])
            break;
        for(int j=i; j>=0; j--)
            cout<<f[j];
        cout<<endl;

    return 0;
}

大数筛选

#include <iostream> 
#include <string.h> 
#include <stdio.h> 
#include <bitset> 

using namespace std;  
const int N = 300000005;  

bitset<N> prime;  

void Work(int l,int r)  
{  
    prime.set();  
    for(int i=3; i*i<=r; i+=2)  
    {  
        if(prime[i])  
        {  
            for(int j=i*i; j<=r; j += i<<1)  
                prime[j] = false;  
        }  
    }  
    int cnt = (l <=2 && 2 <= r);  
    for(int i=5; i<=r; i+=4)  
        if(i >= l && prime[i]) cnt++;  
    cout<<cnt<<endl;  
}  

int main()  
{  
    int l,r;  
    cin>>l>>r;  
    Work(l,r);  
    return 0;  
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读