
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <conio.h>
#define N 30
int used[N]={0};
int num=0;
int prime(int x)//判断x是否是四位数的质数
{
int i,m;
m=(int)sqrt((double)x);
// printf("\n%d\n",m);
for(i=2;i<=m;i++)
{
if(!(x%i))
{
return 0;
}
}
return 1;
}
int arrange(int *t,int n)
{
int i,j,flag;
for(i=n;i>=1;i--)
t[i]=t[i-1];
for(i=1;i<n;i++)
{
flag=0;
for(j=n-1;j>=i;j--)
if(t[j+1]<t[j])
{
t[0]=t[j+1];
t[j+1]=t[j];
t[j]=t[0];
flag=1;
}
if(!flag)
{
for(i=0;i<n;i++)
t[i]=t[i+1];
return 0;
}
}
return 1;
}
int examp(int a[],int x,int n)//二分法查找
{
int low,high,mid;
low=0;high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==x)
return 1;
if(a[mid]>x)
high=mid-1;
else
low=mid+1;
}
return 0;
}
int arithmetic(int *t,int n)
{
int i,j,k,k2,m=0;
for(i=0;i<n;i++)
{
for(j=1;t[i]+j*2<=t[n-1];j++)
{
for(k=0;;k++)
{
if(!examp(t,t[i]+k*j,n))//使用二分法查找t[i]+k*j是否在数组中
break;
}
if(k>2)
{
m=1;
printf("结果已找到:\n\t");
for(k2=0;k2<k;k2++)
{
printf("%d ",t[i]+k2*j);
}
printf(",公差%d",j);
printf("\n\t");
}
}
}
if (!m)
{
printf("结果未找到。\n");
}
else
getch();
return 0;
}
int judge (int a,int b,int c,int d)
{
int arr[4]={a,b,c,d};
int prim[24];
int i,j,k,s,ret,count=0;
prim[0]=a*1000+b*100+c*10+d;
printf("\n\t已找到");
for (i=0;i<4;i++)
{
if (0==arr[i])//同下
continue;//试试注释掉这两句!!!!!
for (j=0;j<4;j++)
{
if (i==j)
continue;
for (k=0;k<4;k++)
{
if (i==k||j==k)
continue;
if (i==0&&j==1&&k==2)
continue;
s=1000*arr[i]+100*arr[j]+10*arr[k]+arr[6-i-j-k];
ret=prime(s);
if (ret)
{
prim[++count]=s;
printf("%d,",s,count);
}
}
}
}
count++;
if (count<4)
{
printf("\b是质数,\n\t总共有%d个满足质数条件,少于四个,不满足主条件,继续查找下一个\n",count);
return 0;
}
printf("\b是质数,\n\t总共有%d个满足质数条件,正在排序...\n\t",count);
arrange(prim,count);
for (i=0;i<count;i++)
printf("%d ",prim[i]);
for (i=0;i<count;i++)
if (prim[i]>1000)
break;
if (prim[i]<(a*1000+b*100+c*10+d))
{
printf("\n\t%d所包含的序列已在%d中检索,停止重复检索!\n",a*1000+b*100+c*10+d,prim[i]);
return 0;
}
printf("\n\t排序完成,正在检索等差数列...\n\t");
arithmetic(prim,count);
return 0;
}
int main()
{
printf("说明:\n数列 1487, 4817, 8147 是一个等差数列,它在两方面非常特殊:\n\
1. 各项为质数\n\
2. 各项都能够通过将其他项的各位数字重新排列得到\n\
不存在由 3 个一位数、两位数或三位数组成的这样的数列,但是存在另一个由 3 个四位数组成的这样的数列。\n\
请找出这个数列。\n************任意键开始搜索!****************\n");
getch();
int a,b,c,d;
int s=0,ret;
for (a=1;a<=9;a++)
{
for (b=0;b<=9;b++)
{
if (a==b)
continue;
for (c=0;c<=9;c++)
{
if (a==c||b==c)
continue;
for (d=0;d<=9;d++)
{
if (a==d||b==d||c==d)
continue;
s=a*1000+b*100+c*10+d;
ret=prime(s);
if (ret)
{
printf("%d",s);
printf("是质数,正在查找匹配项...");
judge(a,b,c,d);
//getch();
printf("\n");
}
}
}
}
}
getch();
return 0;
}
提示性语句有点多,所以写了200多行,但运行还是很快的,给大家分享一下~~~~