蓝桥杯-基础练习题-大数算法
蓝桥杯-基础练习-大数算法
之前做过很多大数的题目了吧,现在,那么我们来统计下简单的大数问题。
大数加法,大数减法,大数乘除,大数筛选,大数阶层,好了,现在就针对这几种问题贴上简单代码吧(大数加减和乘除就列出加法和乘法,其它的类型差不多)
我们都知道,大数,要用数组来存放,都是简单的进位问题,这些就不多说,贴代码:
大数加法:
#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,0,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]='\0';
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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。