c语言求超级素数

#include <stdio.h>
void main()
{
int i,j,k,m,n;
for(i=100;i<=9999;i++)
{
for(j=2;j<i;j++)
if(i%j==0)
break;
if(j==i)
{if(i<=999)
{ for(k=0;k<3;k++)
{ m=i ;
m=m/10;
for(n=2;n<m;n++)
if(m%n==0)
break;}
if(n==m)
printf("%d\t",i);
}
if(i>999)
{ for(k=0;k<4;k++)
{m=i;
m=m/10;
for(n=2;n<m;n++)
if(m%n==0)
break;}
if(n==m)
printf("%d\t",i);}
}
}
}请问这个函数哪里错了?

逻辑乱得有点厉害,如

for(n=2;n<m;n++)
    if(m%n==0)
break;

这里的break;只结束for(n=2;...这个循环,还在前一个for(k=0;k<3;k++)循环中;可是break;就意味着m已经不是素数了,那么整个m所在的3位数就不是超级素数,还有什么必要继续做for(k=0;k<3;k++)这个循环?这种题比较好的结构是弄一个素数判断函数,不断用原数和它不断除以10的数调用,都返回“真”的就是超级素数,否则不是。代码如下——

#include "stdio.h"
int prime(int n){//素数
int i;
if(n>2 && !(n&1) || n<2)
return 0;
for(i=3;i*i<=n;i+=2)
if(!(n%i))
return 0;
return 1;
}
int main(int argc,char *argv[]){
int i,j,k;
for(k=0,i=101;i<=9999;i+=2){
for(j=i;j>0;j/=10)
if(!prime(j))
break;
if(!j)
printf(++k%10 ? "%5d" : "%5d\n",i);
}
if(k%10)
printf("\n");
return 0;
}

运行结果:

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-06-18

你的求超级素数的C语言程序,我帮你改好了,你看看吧,运行结果没有问题(因为运行结果太长,我就不在这里贴出来了,你自己运行一下就行了.)

#include <stdio.h>
int main()
{
int i,j,k,m,n,flag=1;
for(i=100;i<=9999;i++)
{
 for(j=2;j<i;j++)
   if(i%j==0)
    break;
 if(j==i) 
 {
  if(i<=999)
  { 
   flag=1;
    m=i;
   for(k=0;k<2;k++)
   { 
    m=m/10;
    for(n=2;n<m;n++)
      if(m%n==0)
      break;
    if(n==m){
    }else flag=0;
   }
    if(flag==1)
    printf("%d\t",i);
  }
  if(i>999)
  {
   flag=1;
    m=i;
    for(k=0;k<3;k++)
   {
    m=m/10;
    for(n=2;n<m;n++)
     if(m%n==0)
      break;
    if(n==m){
    }else flag=0;
    }
    if(flag==1)
    printf("%d\t",i);
  }
 }
}
return 0;
}

本回答被提问者采纳