标题:素数幻方
只看楼主
q1826050194
Rank: 2
等 级:论坛游民
帖 子:67
专家分:19
注 册:2011-3-7
结帖率:77.78%
已结贴  问题点数:20 回复次数:4 
素数幻方
下面的代码我是照着书本敲的,为什么,它不能输出矩阵的?




#include<stdio.h>
#include<math.h>
int number[210][5]; //用来存储可逆素数和其分解
int select[110]; //放那些可以用在第一行和最后一行的素数下标
int array[4][5]; //临时数组 ,用来存储素数下标和对应下标分解后的各位数字
int count; //可逆素数的数目
int selecount; //可放在第一行和最后一行的数目
int larray[2][200]; //用来存放一行的前两位和前三位的数据
int lcount[2]; // 前两位的数目和前三位的数目
int num(int number); //用来检查是否是可逆素数
int ok(int number); //用来判断是否是素数
void process(int i); //用来分解素数
void copy_num(int i); //用来复制分解后的数字
int comp_num(int i); //用来判断一列下来是否符合可逆素数
int find1(int i); // 用来判断列方向是不是可逆素数
int find2();//用来判断对角线是不是可逆素数
int find0(int num);//用来判断是不是符合的素数
void p_array();//用来输出矩阵

 FILE *fp;
 main()
 {
     int i,k,flag,cc=0,i1,i4;
     if((fp=fopen("data.dat","w+"))==NULL)
     {
         printf("不能找到\n");
        exit(0);     
     }
     printf("它们是满足的数据");
     for(i=1001;i<9999;i+=2)
     {
         k=i/1000;
         if(k%2!=0&&k!=5&&num(i))//求出所有可逆素数并将符合第一第四行的素数下标放在select那里
         {
             number[count][0]=i;
             process(count++);
            if(number[count-1][2]%2!=0&&
               number[count-1][2]%5!=0&&
               number[count-1][3]%5!=0&&
               number[count-1][3]%2!=0
               )  
               select[selecount++]=count-1;
         }
     }
     larray[0][lcount[0]++]=number[0][0]/100;
     larray[0][lcount[1]++]=number[0][0]/10;
     for(i1=0;i1<selecount;i1++)//在第一行内穷举
     {
         array[0][0]=select[i1];//取对应的素数下标
         copy_num(0);//分解对应下标的数字且复制在array中
        for(array[1][0]=0;array[1][0]<count;array[1][0]++)//穷举第二行
        {
            copy_num(1);
            if(!comp_num(2))
                continue;
            for(array[2][0]=0;array[2][0]<count;array[2][0]++)
            {
                copy_num(2);
                if(!comp_num(3))
                continue;
                for(i4=0;i4<selecount;i4++)
                {
                    array[3][0]=select[i4];
                    copy_num(3);
                    for(flag=1,i=1;flag&&i<=4;i++)
                    if(!find1(i)) flag=0;
                        if(flag&&find2())
                    {
                        printf("NO.%d\n",++cc);
                        fprintf(fp,"NO.%d\n",cc);
                        p_array();
                    }   
                }
            }
        }
         
     }
     fclose(fp);
 }
 
 int num(int number)
 {
     int j;
     if(!ok(number)) return 0;
     for(j=0;number>0;number/=10)
     j=j*10+number%10;
     if(!ok(j)) return 0;
     return 1;
 }
 
 int ok(int number)
 {
     int i,j;
     if(number%2==0) return 0;
     j=sqrt((double)number)+1;
     for(i=3;i<=j;i+=2)
      if(number%i==0) return 0;
      return 1;
 }
 
 void process(int i)
 {
     int j,num;
     num=number[i][0];
     for(j=4;j>=1;j--,num/=10)
      number[i][j]=num%10;
 }
 
 void copy_num(int i) //复制分解的数字
 {
     int j;
     for(j=1;j<=4;j++)
    array[i][j]=array[array[i][0]][j];
 }
 
 int comp_num(int n)
 {
     static int ii;
     static int jj;
     int i,num,k,*p;
     int *pcount;
     switch(n)
     {
     case 2:pcount=&lcount[0];p=&ii;break;
     case 3:pcount=&lcount[1];p=&jj;break;   
     }
     for(i=1;i<=4;i++)
     {
         for(num=0,k=0;k<n;k++)
         num=num*10+array[k][i];
          if(num<=larray[n-2][*p])
           for(;*p>=0&&num<larray[n-2][*p];(*p)--);
        else
          for(;*p<count&&num>larray[n-2][*p];(*p)++);
         
          if(*p<0||*p>=count)
        {*p=0;return 0;}
        
        if(num!=larray[n-1][*p])
        return 0;
     }
     return 1;
 }
 
 int find1(int i)//检查列方向是否为可逆素数
 {
     int num,j;
     for(num=0,j=0;j<4;j++)
     num=num*10+array[j][i];
     return find0(num);
 }
 
 int find2()//检查对角线方向是否为满足可逆素数
 {
     int num1,num2,i,j;
     for(num1=0,j=0;j<4;j++)
      num1=num1*10+array[j][j+1];
     for(num2=0,j=0,i=4;j<4;j++,i--)
     num2=num2*10+array[j][i];
    if(find0(num1)) return find0(num2);
    else return 0;
 }
 
 int find0(int num)//检查是否为满足可逆素数
 {
     static int j;
     if(num<number[j][0]) for(;j>=0&&num<number[j][0];j--);
     else for(;j<count&&num>number[j][0];j++);
     if(j<0||j>=count) {j=0;return 0;}
     if(num==number[j][0]) return 1;
     else return 0;
 }
 
 void p_array()
 {
     int i,j;
     for(i=0;i<4;i++)
     {
     for(j=1;j<=4;j++)
     {
         printf("%d ",array[i][j]);
         fprintf(fp,"%d ",array[i][j]);
     }   
     printf("\n");
    fprintf(fp,"\n");
     }
 }
搜索更多相关主题的帖子: 检查 include number count 
2011-08-31 14:50
dreamofgod
Rank: 5Rank: 5
等 级:职业侠客
帖 子:194
专家分:341
注 册:2011-8-16
得分:10 
这么长……我们帮你看的人有压力啊……
你先分步测试一下,具体是哪一部分和预期的不一样了。

一个单片机就让我头疼不已~~~
2011-08-31 21:04
q1826050194
Rank: 2
等 级:论坛游民
帖 子:67
专家分:19
注 册:2011-3-7
得分:0 
回复 2楼 dreamofgod
我调试的时候它不能弹出控制台~~
2011-09-01 13:54
yegoudaozhan
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-9-1
得分:0 
if((fp=fopen("data.dat","w+"))==NULL       这个是干嘛用的呀,以前看到都不懂
2011-09-01 16:38
dreamofgod
Rank: 5Rank: 5
等 级:职业侠客
帖 子:194
专家分:341
注 册:2011-8-16
得分:10 
VC6有两个warning:
1.exit函数要包括stdlib.h
2.j=sqrt((double)number)+1;改为j=(int)sqrt((double)number)+1;。

一个单片机就让我头疼不已~~~
2011-09-01 20:00



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-348792-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022958 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved