C语言编程题:超级素数。

一个素数,依次从低位去掉一位,二位,……,若所得的各数仍都是素数,则称超级素数。
例如:7331是个4位超级素数,因为7,73,733,7331均为素数.
试求1000~n之内(1000<n<9999):
(1)超级素数的个数
(2)所有超级素数之和
(3)最大的超级素数。
输入一个整数n(n<9999)
输出三个整数,分别为超级素数的个数,所有超级素数之和,最大的超级素数;
例如:输入9999,
输出
16
68910
7393
#include<stdio.h>
int len(int n)
{
if(n/1000!=0)
return 4;
else if(n/100!=0)
return 3;
else if(n/10!=0)
return 2;
else
return 1;
}
void main()
{
int n,t=1,m=0,i,j,k=0,max=0,sum=0,l=0,s[10000]={0};
scanf("%d",&n);
for(j=n;j>1000;j--)
{
for(i=2;i<j;i++)
{if(j%i!=0)
t++;
else
break;
if(t==j-1)
m=j;}
t=1;
k=0;
while(m)
{

for(i=2;i<m;i++)
if(m%i!=0)
t++;
if(t==m-1)
k++;
m/=10;
}
t=1;
if(k==len(j))
s[j]=j;
}
for(i=0;i<10000;i++)
if(s[i]!=0)
{
sum+=s[i];
l++;
if(max<s[i])
max=s[i];
}
printf("%d\n%d\n%d",l+1,sum,max);
}
不知哪里错了。。。求改

/**************************************
大体的思路:先求出1000-9999之间的素数,然后在这些素数中
找出前1、2、3、4位都是素数的数即为超级素数,每次找到一个
超级素数都与之前的超级素数加和,并且记录超级素数个数的变量加1,
并与之前找到的超级素数比较,记录最大的超级素数。
最后输出就可以了。
************************************/
#include <stdio.h>
#define MAX 10000

int prime[MAX] ; //prime数组记录1到9999每个数是否为素数,例如prime[9999]==1表示9999是素数

//searchPrime是找出1到9999之间的所有素数,并保存到prime数组
void searchPrime()
{

int i, j ;

for(i = 0; i < MAX; i++)
prime[i] = 1 ; //所有元素初始化为1,即假定都是素数
prime[0] = 0 ;//0不是素数
prime[1] = 0 ;//1不是素数
//下面开始筛选素数
for(i = 2; i*i < MAX; i++)
{
if(prime[i]) //如果i是素数,把它的倍数都筛掉
for(j = 2*i; j < MAX; j+=i)
{
prime[j] = 0 ; //j是i的倍数,因此j最起码有一个因子是i,所以不可能是素数
}
}
}

int main()
{
int sum ; //sum记录超级素数的和
int i ;
int count ; //count记录超级素数的个数
int max ; //max记录最大的超级素数
int n ;

scanf("%d", &n) ;
searchPrime() ; //初始化Prime数组
count = 0 ;
sum = 0 ;
max = 0 ;
for(i = 1001; i <= n; i++)
{
if(prime[i] && prime[i/1000]
&& prime[i/100] && prime[i/10]) //说明i是超级素数
{
sum += i ;
count++ ;
if(max < i)
max = i ;
}
}
printf("%d\n%d\n%d\n", count, sum, max) ;
return 0 ;
}

//写的仓促,只验证了9999,其他的数字并未验证,有问题再反馈吧。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-03
你错的地方给你注释了
#include<stdio.h>
int len(int n)
{
if(n/1000!=0)
return 4;
else if(n/100!=0)
return 3;
else if(n/10!=0)
return 2;
else
return 1;
}
void main()
{
int n,t=1,m=0,i,j,k=0,max=0,sum=0,l=0,s[10000]={0};
scanf("%d",&n);
for(j=n;j>1000;j--)
{
for(i=2;i<j;i++)
{if(j%i!=0)
t++;
else
break;
if(t==j-1)
m=j;}
t=1;
k=0;
while(m)
{

for(i=2;i<m;i++)
if(m%i!=0)
t++;
if(t==m-1)
k++;
m/=10;
t=1; /*这里少了t=1*/
}
t=1;
if(k==len(j))
s[j]=j;
}
for(i=0;i<10000;i++)
if(s[i]!=0)
{
sum+=s[i];
l++;
if(max<s[i])
max=s[i];
}
printf("%d\n%d\n%d\n",l,sum,max);//printf("%d\n%d\n%d",l+1,sum,max);数目应该是l
}本回答被提问者采纳
第2个回答  2014-12-16
#include<stdio.h>

int isprime( int j ) //判断素数
{
int i;
if ( j<2 )
return 0;
for(i=2;i<j;i++)
if(j%i==0)
return 0;
return 1;
}
void main()
{
    int n,j,max=0,sum=0,l=0;
    scanf("%d",&n);
    for(j=1000;j<n;j++)
    {
int m=j;
        while(m) //检查该数及子数是否全是素数
        {
if ( !isprime(m) )
break;
            m/=10;
        }
if ( !m ) //如果是,则m会变成0
{
sum += j ;
max = j;
l++ ;
}
    }

    printf("%d\n%d\n%d\n",l,sum,max);
}

第3个回答  2014-12-16

int isprime(int x){
int i; 
while (x){
if (x < 2) return 0;
for (i = 2; i < x ; i++)
{
if (x%i == 0)
return 0;
}
x = x / 10;
}
return 1;
}
void main()
{
int n=9999, t = 0, m = 0, i, j , sum = 0, l = 0, s[10000] = { 0 };
/*scanf("%d", &n);*/
for (j = n; j > 1000; j--)
{
if (isprime(j) )
{
s[t++] = j;
sum += j;
}
}
i = 0; j = 0;
for (; i<t; i++) {
printf("%d ", s[i]);
j++;
if (i % 10 == 0) printf("\n");
}
printf("%d\n%d\n%d", t, sum, s[0]);
}

相似回答