质数乘积
题目描述
TWQ每天疯狂的刷题,今天又刷到一道水题,于是赶紧来拿一血吧,给你一个正整数n,求小于n的数中所有质数的乘积,输入有多组测试用例,0为结束标志,所有质数的乘积初始值为0。
输入
正整数n(n<=10000)
输出
小于n的质数的乘积。
样例输入
5
0
样例输出
6
提示
大数乘法
#include<stdio.h>
#include<math.h>
int a[1000000];
int main()
{
int i,j,f=0,k,l1,l2,x,y,z,n,l,b[10010];
//标记10000以内的素数
for(i=0;i<=10000;i++)
b[i]=1;//先把所有数标位1
for(i=2;i<=100;i++)//前100的质数就能筛出来所有质数了
{
if(b[i])//如果b[i]==1则就是素数
{
for(j=i+i;j<=10000;j=j+i)//埃氏筛法,所有是i的倍数全部不是素数,标记为0
b[j]=0;//标记所有不是质数的数
}
}
while(scanf("%d",&n)!=EOF)
{
if(n<=0)
break;
for(i=1;i<1000000;i++)
a[i]=0;//把数组初始化为0方便后面计算因为0*任何数都是0
a[0]=1;//大数乘法首位为1去乘每一位
if(n==1||n==2)//特判
printf("0\n");
else
{
for(i=2;i<n;i++)//遍历n以内的素数
{
if(b[i])//i是素数
{
y=0;
for(j=0;j<7000;j++)//遍历7000简单粗暴
{
x=a[j]*i+y;//每一位*i
a[j]=x%10;//保留个位存入数组a
y=x/10;//计算进位
}
}
}
for(i=5000;i>=0;i--)//首先遍历找出第一个不为0的数即是最高位
if(a[i]!=0)
break;
for(j=i;j>=0;j--)//循环遍历
printf("%d",a[j]);
printf("\n");
}
}
return 0;
}