⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 素数方阵原代码.c

📁 素数方阵系统,找出所有符合条件的素数方阵
💻 C
📖 第 1 页 / 共 2 页
字号:
/*我真诚的保证:
  我自己独立的完成了整个程序的分析.设计到编码的所有工作.
  如果在上述过程中,我遇到了什么困难求教于人,那么我将在程序设计报告
  中详细地列举我所遇到的问题,以及别人给我的提示.
  在此,我感谢王老师对我的启发和帮助.下面的报告中,我还会具体提到他在
  各个方面对我的帮助.
  我的程序里凡是引用其它程序或文档之处,例如教材.课堂笔记.网上原代码
  以及其它参考书上的代码段,我都已经在程序的注释里很清楚的注明了引用
  的出处.
  我从未抄袭过别人的程序,也没有盗用别人的程序,不管是修改方式的抄袭
  还是原封不动地抄袭.
  我编写这个程序,从来没有想过要去破坏或防碍其它计算机系统的正常运转
  姓名:唐淑娟;学号:2004182534;班级:计算机科学与技术2班*/
#include "stdio.h"
#include "math.h"
#include<conio.h>
int flag=0;/*找到符合要求的方阵的记数及标志*/
int r;/*方阵的第一个元素,由用户从键盘输入*/
int s;/*方阵的各行列及对角线之和,由用户从键盘输入*/
int a=0;/*用来统计筛选出来的所有的素数的个数*/
int b =0;/*用来统计只含有1,3,7,9的素数个数*/
int c=0;/*用来统计不含有0的5位素数*/
static int A[5][5]={0};/*存放找到的方阵*/
static unsigned long int aa[1000]={0};/*用来存放筛选出来的所有素数*/
static unsigned long int bb[200]={0};/*用来存放只含1,3,7,9的素数*/
static unsigned long int cc[500]={0};/*用来保存不含0的5位素数*/
/*-----------------------------------------------------------*/
/*函数名称:Judge0()
  创建者:唐淑娟
  创建时间:2006年4月10日
  最后的修改时间:2006年4月20日
  函数的功能描叙:判断整数x中是否含有0
  返回值:如果x中不含有0数,返回1;否则,返回0
  输入参数:x
  函数的抽象算法:采用取余比较的方法判断一个数的每一位是否含有0,
  如果各位都不含0返回1,否则返回0.*/
int Judge0(unsigned long int x)/*判断整数x中是否含有0*/
{
 if(((x%10000)>1000)&&((x%1000)>100)&&((x%100)>10)&&((x%10)>1))  
    return(1);
 else
    return(0);
 }
/*-----------------------------------------------------------*/
/*函数名称:prime()
  创建者:唐淑娟
  创建时间:2006年4月12日
  最后的修改时间:2006年4月15日
  函数的功能描叙:判断整数 x是否为素数
  返回值:如果x是素数,返回1;否则,返回0
  输入参数:x
  函数的抽象算法:利用素数只能被1和自身整除的特点,用循环验证法判断
  一个数是否是素数,是返回1,不是返回0
  备注:该程序参考了谭浩强编的教材<<C语言程序设计教程>>及其上课时
  郑老师讲的筛选法求素数.在这个地方我遇到了一个大麻烦,最后的结果
  老是出现sqrt:DOMAIN error,后来通过王老师的教导,我把它解决掉了,
  在此我特意表示感谢!*/
int prime( unsigned long int x)/*判断正整数 x是否为素数*/
{ 
 int  i;/*循环变量*/
 if(x%2==0||x%3==0)
   return(0);
 for(i=2;i<(int)sqrt(x);i=i+1)
  {
     if(x%i==0)
       return 0;/*若x不是素数,则退出并返回0*/
  }
 return 1;/*若x是素数,则退出并返回1*/
 }
/*------------------------------------------------------------*/
/*函数名称:func()
  创建者:唐淑娟
  创建时间:2006年4月18日
  最后的修改时间:2006年4月20日
  函数的功能描叙:分解num的各位数字,返回其和 
  返回值:num的各位数字之和sum
  输入参数:num
  函数的抽象算法:利用取余的方法求得数字的各位之和并累加,并且
  返回其和sum*/        
int func(unsigned long int num)/*分解num的各位数字,返回其和*/
{
 int sum=0;
 do
  {
   sum+=num%10;/*累计各位数字之和*/
   num/=10;/*求下一数值位*/
  }while(num);
  return(sum);
 }
/*------------------------------------------------------------*/
/*函数名称:Re11(long), Re12(long),Re13(long),Re14(long),Re15(long)
  创建者:唐淑娟
  创建时间:2006年4月10日
  最后的修改时间:2006年4月20日
  函数的功能描叙:分别把一个数x的第1,2,3,4,5位返回
  函数的输入参数:x
  函数的抽象算法:采用取余相除的方法,获得一个数字的各位*/   
int Re11(unsigned long int x)/*返回一个数字x的第1位*/
{
 return(x/10000);
 }
int Re12(unsigned long int x)/*返回一个数字x的第2位*/
{
   return((x%10000)/1000);
}
int Re13(unsigned long int x)/*返回一个数字x的第3位*/
{
   return((x%1000)/100);
}
int Re14(unsigned long int x)/*返回一个数字x的第4位*/
{
   return((x%100)/10);
}
int Re15(unsigned long int x)/*返回一个数字x的第5位*/
{
   return(x%10);
}
/*------------------------------------------------------------------*/
/*函数名称: JJX()
  创建者:唐淑娟
  创建时间:20006年4月21日
  最后的修改时间:2006年4月21日
  函数功能的描述:判断一个数的最后4位是否是1,3,7,9中的数
  返回值:如果该数的各位符合条件,返回1;否则,返回0
  函数的抽象算法:根据一个素数的最后一位只能是1,3,7,9中的数中的一个值,调用
  Re11(long),Re12(long),Re13(long),Re14(long),Re15(long)来判断是否符合.*/
int JJX(unsigned long int x)/*判断一个数的最后各位是否是1,3,7,9中的数*/
{
 int flag0=0,flag1=0,flag2=0,flag3=0,flag4=0;/*各位是否符合条件的标志变量*/
 if(Re11(x)==1||Re11(x)==3||Re11(x)==7||Re11(x)==9)
     flag0=1;
 if(Re12(x)==1||Re12(x)==3||Re12(x)==7||Re12(x)==9)
     flag1=1;
 if(Re13(x)==1||Re13(x)==3||Re13(x)==7||Re13(x)==9)
     flag2=1;
 if(Re14(x)==1||Re14(x)==3||Re14(x)==7||Re14(x)==9)
     flag3=1;
 if(Re15(x)==1||Re15(x)==3||Re15(x)==7||Re15(x)==9)
     flag4=1;
 if(flag0==1&&flag1==1&&flag2==1&&flag3==1&&flag4==1)
     return(1);
 else
     return(0);
}
/*-------------------------------------------------------------*/
/*函数名称:Saving()
  创建者:唐淑娟
  创建时间:2006年4月16日
  最后的修改时间:2006年4月20日
  函数的功能描叙:把符合条件的素数保存与各数组
  函数调用前的预备条件:prime(x)和func(x) 函数
  函数的抽象算法:采用辅助数组,把和为从键盘上输入的值s的5位素数保存于aa[1000]
  中,把以1,3,7,9作为元素的5位素数保存于数组bb[200]中,把不含0的5位素数保存于数
  组cc[500]中,在该函数中调用了函数prime(unsigned long)和func(long)*/      
int Saving()/*把符合要求的素数保存于数组*/
{unsigned long int i;/*做筛选各素数的循环变量*/
   for(i=10000;i<=99999;i++)
  { if(prime(i)==1&&func(i)==s)
   { a++;
     aa[a]=i;
     if(JJX(i)==1)
     { b++;
       bb[b]=i;
      }
     if(Judge0(i)==1)
     { c++;
       cc[c]=i;
     }
    }
  }
}
/*-------------------------------------------------------------*/
/*函数名称:Row1()
  创建者:唐淑娟
  创建时间:2006年4月17
  最后的修改时间:2006年4月20
  函数功能的描叙:获得方阵的第一行的元数
  函数调用前的预备条件:Saving()函数
  函数的抽象算法:采用穷举法,因为素数不以0开头,所以根据r确定从前面的数组cc[500]
  中取数,并调用Re11(long),Re12(long),Re13(long),Re14(long),Re15(long)将其返回
  值赋予第一行的各个元数,后调用Low5()处理第5列.
  备注:我的想法是确定第一行后,根据第一行的各元素再确定其它行,最后通过一个判断
  函数来判断,符合的话,打印出结果,但是那种方法耗时太多,对于个人机而言,不太理想
  所以对于各行列的先后顺序,我参考了网上的资源*/
int Row1()/*处理获得方阵的第一行的元素*/
{int i;/*循环变量*/
 if(c>0)
 {for(i=1;i<=c;i++)
  {if(r==Re11(cc[i]))
   {A[1][1]=r;
    A[1][2]=Re12(cc[i]);
    A[1][3]=Re13(cc[i]);
    A[1][4]=Re14(cc[i]);
    A[1][5]=Re15(cc[i]);
    Low5();
   }
  }
 }
}
/*-------------------------------------------------------------*/
/*函数名称:Low5()
  创建者:唐淑娟
  创建时间:2006年4月17
  最后的修改时间:2006年4月20
  函数功能的描叙:获得方阵的第5列的元素
  函数调用前的预备条件:Saving()函数
  函数的抽象算法:采用穷举法,因为素数一定以1,3,7,9结尾,所以从前面的bb[200]
  中取数,并调用Re11(long),Re12(long),Re13(long),Re14(long),Re15(long)将其
  返回值赋予第5列的各个元数,后调用Diagonal1()处理主对角线*/
int Low5()/*处理获得方阵的第5列的元素*/
{int i;/*循环变量*/
 if(b>0)
 {for(i=1;i<=b;i++)
  {if(A[1][5]==Re11(bb[i]))
   {
    A[2][5]=Re12(bb[i]);
    A[3][5]=Re13(bb[i]);
    A[4][5]=Re14(bb[i]);
    A[5][5]=Re15(bb[i]);
    Diagonal1();
   }
  }
 }
}
/*-------------------------------------------------------------*/
/*函数名称:Diagonal1()
  创建者:唐淑娟
  创建时间:2006年4月17
  最后的修改时间:2006年4月20
  函数功能的描叙:获得方阵主对角线的元素
  函数调用前的预备条件:Saving()函数
  函数的抽象算法:采用穷举法,从前面的辅助数组中取数并调用Re11(long),
  Re12(long),Re13(long),Re14(long),Re15(long)将其返回值赋予主对角
  线,同时调用函数Row5()处理第五行的元素.*/
Diagonal1()/*处理方阵的主对角线*/
{
 int i;/*循环变量*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -