Ⅰ c语言幻方
1.每个自然数只出现一次,没有考虑
2.数组下标从0开始
3.
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(j==i) s1=s1+a[i][j];
if(i+j==n+1) s2=s2+a[i][j];
}
}
这样没必要
for(i=0;i<n;i++)
{
s1+=a[i][i];
s2+=a[i][n-1-i];
}
Ⅱ 组合数学中的“幻方”,用C语言编写程序来进行运算
先判断每行每列以及对角线的和是否相等
再判断所有元素不相等
不难吧,自己做做就出来了
Ⅲ 谁知道用C语言怎么写求幻方的程序
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#define MAX_INDEX 100
void swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
/*快速排序算法*/
void QuickSort(int a[], int l, int r)
{
int i=l; /*从左至右的游标*/
int j=r + 1; /*从右到左的游标*/
int pivot=a[l];
if (l >= r) return;
/*把左侧>= pivot的元素与右侧<= pivot 的元素进行交换*/
while (1)
{
do
{/*在左侧寻找>= pivot 的元素*/
i = i + 1;
} while (a[i] < pivot);
do
{/*在右侧寻找<= pivot 的元素*/
j = j - 1;
} while (a[j] > pivot);
if (i >= j) break; /*未发现交换对象*/
swap(&a[i],&a[j]);
}
/*设置p i v o t*/
a[l] = a[j];
a[j] = pivot;
QuickSort(a, l, j-1); /*对左段排序*/
QuickSort(a, j+1, r); /*对右段排序*/
}
void Huanf(int Array[][MAX_INDEX],int n)
{
int i,j;
int a,b,m;
int tempArray1[MAX_INDEX];
int tempArray2[MAX_INDEX];
a=n/2;
b=a+1;
m=n%4;
switch(m)
{
case 0:
case 2:
/*穿心对调*/
for(i=0;i<n;i++)
for(j=0;j<n/2;j++)
{
if(i<n/2)
{
if(i%2==1&&Array[i][j]%2==0)/*偶行换偶*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j]);
}
else if(i%2==0&&Array[i][j]%2==1)/*奇行换奇*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j]);
}
}
else
{
if(i%2==1&&Array[i][j]%2==1)/*偶行换奇*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j]);
}
else if(i%2==0&&Array[i][j]%2==0)/*奇行换偶*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j]);
}
}
}
/*End穿心对调*/
if(m==2)
{
for(i=0;i<n/2;i++)
{
if((i!=0)&&(i!=a-1)&&(i!=b-1)&&(i!=n-1))
{
swap(&Array[i][a-1],&Array[n-1-i][a-1]);
swap(&Array[b-1][i],&Array[b-1][n-1-i]);
}
}
swap(&Array[0][a-1],&Array[0][b-1]);
swap(&Array[a-1][0],&Array[b-1][0]);
swap(&Array[2][0],&Array[2][n-1]);
swap(&Array[0][2],&Array[n-1][2]);
}
break;
case 1:
case 3:
/*穿心对调*/
for(i=0;i<n;i++)
for(j=0;j<n/2;j++)
{
if(i<n/2)
{
if(i%2==1&&Array[i][j]%2==0) /*偶行换偶*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j]);
}
else if(i%2==0&&Array[i][j]%2==0)/*奇行换奇*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j]);
}
}
else if(i>n/2)
{
if(i%2==1&&Array[i][j]%2==0)/*偶行换偶*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j]);
}
else if(i%2==0&&Array[i][j]%2==0)/*奇行换奇*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j]);
}
}
}
/*End穿心对调*/
/*重排米字*/
for(i=0;i<n;i++)
{
tempArray1[i]=Array[i][i];
tempArray2[i]=Array[a][i];
}
QuickSort(tempArray1,0,n-1);
QuickSort(tempArray2,0,n-1);
for(i=0;i<n;i++)
{
Array[i][i]=tempArray2[i];
Array[a][i]=tempArray1[i];
}
for(i=0;i<n;i++)
{
tempArray1[i]=Array[i][n-1-i];
tempArray2[i]=Array[i][a];
}
QuickSort(tempArray1,0,n-1);
QuickSort(tempArray2,0,n-1);
for(i=0;i<n;i++)
{
Array[i][n-1-i]=tempArray2[i];
Array[i][a]=tempArray1[i];
}
/*End重排米字*/
if(m==3)
{
for(i=0;i<n/2;i++)
{
if((i!=a-1)&&(i!=b-1)&&(i!=a+1))
{
swap(&Array[i][a-1],&Array[n-1-i][a-1]);
swap(&Array[a-1][i],&Array[a-1][n-1-i]);
}
}
swap(&Array[a-1][a-1],&Array[a+1][a+1]);
swap(&Array[a-1][b-1],&Array[a+1][b-1]);
}
break;
default:
break;
}
return;
}
void main()
{
int Ne[MAX_INDEX][MAX_INDEX];
int i,j,n;
while(1)
{
printf("Please Input N (0 quit): ");
scanf("%d",&n);
if(n==0)
break;
/*数组赋初值*/
for(i=0;i<n;i++)
for(j=0;j<n;j++)
Ne[i][j]=i*n+(j+1);
Huanf(Ne,n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printf("%-4d",Ne[i][j]);
if(j==n-1)
printf("\n\n");
}
printf("\n\n");
getch();
}
}
Ⅳ 用C语言编一个简单的程序来判断N×N的矩阵是否为一个幻方。
#include"stdio.h"
#include"math.h"
inta[256][256];
intsum;
intcheck();
voidins(intn);
voidmain(){
inti,j,n,k,t,p,x;
scanf("%d",&n);
sum=(n*n+1)*n/2;
if(n%2==1)//奇数幻方
ins(n);
if(n%4==2){//单偶数幻方
k=n/2;
ins(k);
for(i=0;i<k;i++)
for(j=0;j<k;j++){
a[i][j+k]=a[i][j]+2*k*k;
a[i+k][j]=a[i][j]+3*k*k;
a[i+k][j+k]=a[i][j]+k*k;
}
t=(n-2)/4;
for(i=0;i<k;i++)
for(j=0;j<k;j++){
if((j<t)&&(i<t)){
p=a[i][j];
a[i][j]=a[i+k][j];
a[i+k][j]=p;
}if((j<t)&&(i>k-t-1)){
p=a[i][j];
a[i][j]=a[i+k][j];
a[i+k][j]=p;
}if((i>=t&&i<=k-t-1)&&(j>=t&&j<t*2)){
p=a[i][j];
a[i][j]=a[i+k][j];
a[i+k][j]=p;
}if(j>1&&j<=t){
p=a[i][j+k];
a[i][j+k]=a[i+k][j+k];
a[i+k][j+k]=p;
}
}
}
if(n%4==0){//双偶数幻方
x=1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]=x++;
for(i=0;i<n;i++)
for(j=0;j<n;j++){
if(i%4==0&&abs(i-j)%4==0)
for(k=0;k<4;k++)
a[i+k][j+k]=n*n-a[i+k][j+k]+1;
elseif(i%4==3&&(i+j)%4==3)
for(k=0;k<4;k++)
a[i-k][j+k]=n*n-a[i-k][j+k]+1;
}
}
if(check(n)==1){
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%5d",a[i][j]);
printf(" ");
}
}
}
intcheck(intn){//检验是否是幻方
inti,j,sum1=0,sum2;
for(i=0;i<n;i++){
for(j=0;j<n;j++)
sum1+=a[i][j];
if(sum1!=sum)
return0;
sum1=0;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
sum1+=a[i][j];
if(sum1!=sum)
return0;
sum1=0;
}
for(sum1=0,sum2=0,i=0,j=0;i<n;i++,j++){
sum1+=a[i][j];
sum2+=a[i][n-j-1];
}
if(sum1!=sum)
return0;
if(sum2!=sum)
return0;
else
return1;
}
voidins(intn){//单偶数幻方的输入
intx,y,m;
x=0;
y=n/2;
for(m=1;m<=n*n;m++){
a[x][y]=m;
if(m%n!=0){
x--;
y++;
if(x<0)x=x+n;
if(y==n)y=n-y;
}else{
x++;
if(x==n)x=x-n;
}
}
}
//c++语言实现
//(1)求奇数幻方
#include<iostream.h>
#include<iomanip.h>
intmain(){
intn,x,y,tot=0,i,j,a[100][100]={0};
cout<<"请输入一个奇数"<<endl;
cin>>n;
a[i=n/2][j=0]=++tot;
i--;
j--;
while(tot<=n*n){
i<0?i=n-1:i=i;
j<0?j=n-1:j=j;
if(a[i][j]){
i=x;
j=y+1;
}
a[i][j]=++tot;
x=i;
y=j;
i--;
j--;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
cout<<setw(3)<<a[i][j];
cout<<endl;
}
return0;
}
//(2)求单偶幻方
#include<iostream.h>
#include<iomanip.h>
intmain(){
intn,i=0,j=0,a[100][100],tot=0;
cout<<"请输入4的倍数"<<endl;
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++){
a[i][j]=++tot;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(i%4==j%4||i%4+j%4==3)
a[i][j]=n*n+1-a[i][j];
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
cout<<setw(4)<<a[i][j];
}
cout<<endl;
}
return0;
}
Ⅳ c语言幻方
粗心了哦:)
将
for(i=1;1<=n;i++)
改为:
for(i=1;i<=n;i++)
Ⅵ 怎样用C语言编写幻方
你的这个问题实际上包括两个问题:
1、幻方的算法
2、怎样用C语言实现幻方的算法
这两个问题是大不同的。
关于幻方的算法,或者叫幻方填法,目前有很多种,拉丁正交、马步法等等,针对奇数或者偶数(又分单偶数和双偶数)等有不同的算法,但这些算法只是帮你找到幻方的一个或多个实例(不会是全部),而同阶数的幻方到底有多少个,那只有用穷举法了,比如4阶幻方,基本4阶幻方共7040个,剔除旋转翻转的,即具有独立结构的共880个;4阶完美幻方共84个,具有独立结构的共48个。
对于高阶幻方(比如超过8阶),穷举法实际上是不可行的,因为它的穷举时间将是天文数字(以目前主流PC),所以不要试图用计算机穷举高阶幻方的全部结果,那将是徒劳的。
如果你只是需要1个实例,那么推荐你使用MATLAB语言工具,因为它提供了幻方函数magic(n),不需要编程,直接从命令窗口输入就可以得到答案。
至于第二个问题,当然你首先会C语言,剩下的就是编程技巧问题了,而这个问题是无从回答的。相信你问的是第一个问题。
以上的回答虽然没有明确给出答案,但相信对你会有帮助。
Ⅶ 求一个幻方的C语言程序。。
//给你看看一个: //存在三种情况下的幻方 #include <stdio.h> #include <stdlib.h> #define M 400 //------------------------------------- void _odd(int N){ //N=2n+1 int i, j, key; int square[M+1][M+1] = {0}; i = 0; j = (N+1) / 2; for(key = 1; key <= N*N; key++) { if((key % N) == 1) i++; else { i--; j++; } if(i == 0) i = N; if(j > N) j = 1; square[i][j] = key; } for(i = 1; i <= N; i++) { for(j = 1; j <= N; j++) printf("%2d ", square[i][j]); printf("\n"); } } //--------------------------------------------//4n void _Second(int N) { //4N int i, j; int square[M+1][M+1] = {0}; for(j = 1; j <= N; j++) { for(i = 1; i <= N; i++){ if(j % 4 == i % 4 || (j % 4 + i % 4) == 1) square[i][j] = (N+1-i) * N -j + 1; else square[i][j] = (i - 1) * N + j; } } for(i = 1; i <= N; i++) { for(j = 1; j <= N; j++) printf("%2d ", square[i][j]); printf("\n"); } } //------------------------//2(2n+1) #define SWAP(x,y) {int t; t = x; x = y; y = t;} void magic_o(int square[][M], int n) { int count, row, column; row = 0; column = n / 2; for(count = 1; count <= n*n; count++) { square[row][column] = count; // 填A square[row+n][column+n] = count + n*n; // 填B square[row][column+n] = count + 2*n*n; // 填C square[row+n][column] = count + 3*n*n; // 填D if(count % n == 0) row++; else { row = (row == 0) ? n - 1 : row - 1 ; column = (column == n-1) ? 0 : column + 1; } } } void exchange(int x[][M], int n) { int i, j; int m = n / 4; int m1 = m - 1; for(i = 0; i < n/2; i++) { if(i != m) { for(j = 0; j < m; j++) // 处理规则 1 SWAP(x[i][j], x[n/2+i][j]); for(j = 0; j < m1; j++) // 处理规则 2 SWAP(x[i][n-1-j], x[n/2+i][n-1-j]); } else { // 处理规则 3 for(j = 1; j <= m; j++) SWAP(x[m][j], x[n/2+m][j]); for(j = 0; j < m1; j++) SWAP(x[m][n-1-j], x[n/2+m][n-1-j]); } } } void _Third(int N) { //2(2N+1) int square[M][M] = {0}; int i, j; magic_o(square, N/2); exchange(square, N); for(i = 0; i < N; i++) { for(j = 0; j < N; j++) printf("%2d ", square[i][j]); printf("\n"); } } //-------------------- int main() { int N; while(scanf("%d",&N)!=EOF&&N>2) { if (N%2!=0) { _odd(N); } else if (N%4==0) { _Second(N); } else _Third(N); } return 0; }
Ⅷ 求幻方的C语言算法!
你先看看吧:
3阶幻方:
8 1 6
3 5 7
4 9 2
5阶幻方:
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
#include <stdio.h>
#define N 5
void main()
{
int i,j,k,a[N][N];
for(i=0;i<N;i++)
for(j=0;j<N;j++)
a[i][j]=0; /*初始值为零*/
j=N/2;
a[0][j]=1; /*确定1的位置*/
for(k=2;k<=N*N;k++)
{
i--;
j++;
if(i<0)
i=N-1; /*行出界*/
else if(j>N-1)
j=0; /*列出界*/
if(a[i][j]==0)
a[i][j]=k; /*按规律顺序确定数值位置*/
else
{
i=(i+2)%N;
j=(j-1+N)%N;
a[i][j]=k; /*已有数字时数字的位置*/
}
}
printf("\n\n");
for(i=0;i<N;i++)
{
printf("\t");
for(j=0;j<N;j++)
printf("%4d",a[i][j]); /*显示幻方阵*/
printf("\n\n");
}
return;
}
最好是自己研究下 ,印象比较深刻。
好好学习呀 其实我也只是个初学者
Ⅸ 用c语言求四阶幻方,要求输出所有的由1~16组成的四阶幻方.
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#defineEVEN_DOUBLE_44 //双偶的最基本类型,4阶双偶
#defineSCREEN_SIZE19 //屏幕显示不变形的最大尺寸(主要是因为窗口大小限制)
#defineMIN_SIZE3 //最小阶数为3
#defineMAX_SIZE30
/*原则上是任意阶,算法是相同的,这里就以30为上限吧,
当然如果你愿意,可以修改的更大一些*/
#definePRINTprintf("Esc退出,Enter继续");//打印的宏
#defineCLEARrow=0;column=0;//清零
intMagic[MAX_SIZE][MAX_SIZE]={0}; //全局,幻方数组
introw=0;column=0; //全局,幻方的行列数
intmain(void)
{
intread(); //读取函数
voidodd(intsize,intini_value); //奇数阶幻方生成
voidmean_double_4(intsize); //4阶双偶生成
voidmean_double(intsize); //双偶生成
voidmean_single(intsize); //单偶生成
voidprint_magic(intsize); //打印幻方
voidsum_print(intdata[],intsize); //行、列、对之和打印
voidclear_sum(intdata[]);
voidcheck_magic(intdata[],intsize); //检查所得矩阵是否为幻方阵
intsize; //幻方阶数
intsum[2*MAX_SIZE+2]={0};//行、列、对之和
do{
CLEAR
clear_sum(sum);
size=read();
system("cls");
if(size%2!=0) odd(size,0);
elseif(size%4==0)mean_double(size);
elsemean_single(size);
print_magic(size);
sum_print(sum,size);
check_magic(sum,size);
}while(getch()!=27);
return0;
}
/*读入数据*/
intread()
{
intmin_size=MIN_SIZE;
intmax_size=MAX_SIZE;
intsize;
do{
printf("请输入幻方阶数n,n∈[%d,%d] ",min_size,max_size);
scanf("%d",&size);
getchar();
if(size<3||size>MAX_SIZE)printf("非法输入,请重新输入[%d,%d]的正整数 ",min_size,max_size);
elseif(size>SCREEN_SIZE){
printf("大于屏显最大阶数,输出将变形 ");
Sleep(2000);
}
}while(size<MIN_SIZE||size>MAX_SIZE);
returnsize;
}
/*奇数阶幻方,采用house法*/
voidodd(intsize,intini_value)
{
intnum;//填充数字
intmin_num=1+ini_value;
intmax_num=1+size*size+ini_value; //填充范围
intx=size/2;
inty=0; //初始填充坐标
for(num=min_num;num<max_num;num++){
Magic[y+row][x+column]=num;
if(num%size==0)y++;//跳步
elsex++,y+=2; //马步,其实Horse法和Siamese是完全类似的
x=x%size;
y=y%size;
/*越界反弹,即触碰到边界,从另一边返回*/
}
}
/*双偶数阶幻方,采用对调法*/
/*对调法的基础,4阶双偶。注意要求是将非主副对角线上的元素对调,
其实换个角度,你也可以说就是把祝福对角线中心对调。只不过两种思路得到的矩阵
正好是反着来的*/
/*本函数实现主副对角线互调*/
voidmean_double_4(intsize)
{
inti;
inttotal=size*size+1;
for(i=0;i<EVEN_DOUBLE_4;i++){
Magic[row+i][column+i] =total-Magic[row+i][column+i];
Magic[row+i][EVEN_DOUBLE_4+column-i-1]=
total-Magic[row+i][EVEN_DOUBLE_4+column-i-1];
}
}
/*任意阶双偶*/
voidmean_double(intsize)
{
intnum;//填充数字
intmin_num=1;
intmax_num=1+size*size; //填充范围
inti=0; //循环变量
inttemp;
/*双偶,初始化*/
for(num=min_num;num<max_num;num++){
Magic[row][column]=num;
if((num)%(size)==0){
column=0,row++;
}
elsecolumn++;
}
/*分割为4×4的小矩阵*/
row=0;column=0;
temp=size/EVEN_DOUBLE_4;
for(i=1;i<=temp*temp;i++){
mean_double_4(size);
if(i%temp==0)column=0,row+=4;
elsecolumn=(i%temp)*EVEN_DOUBLE_4;
}
}
/*单偶,用楼梯法*/
voidmean_single(intsize)
{
inti,j,k,m;
inttemp;
/*分象限处理,
14
32
与普通直角坐标系象限区别,说白了,就是个分块的概念
*/
row=0,column=0; //第一象限
odd(size/2,0);
row=size/2,column=size/2; //第二象限
odd(size/2,(size*size)/4*1);
row=0,column=size/2; //第三象限
odd(size/2,(size*size)/4*2);
row=size/2,column=0; //第四象限
odd(size/2,(size*size)/4*3);
m=size/4;
/*对换*/
for(i=0;i<size/2;i++){
/*1、3象限对换*/
for(j=0;j<m;j++){
if(i==m)k=j+m;
elsek=j;
temp=Magic[i][k];
Magic[i][k]=Magic[i+2*size/4][k];
Magic[i+2*size/4][k]=temp;
}
/*2,4对换*/
for(j=0;j<m-1;j++){
k=3*size/4+j;
temp=Magic[i][k];
Magic[i][k]=Magic[i+2*size/4][k];
Magic[i+2*size/4][k]=temp;
}
}
}
/*打印幻方*/
voidprint_magic(intsize)
{
inti,j;
for(i=0;i<size;i++)
for(j=0;j<size;j++){
printf("%4d",Magic[i][j]);
if(j==size-1)putchar(' ');
}
putchar(' ');
}
/*打印各行、各列、各对角线数据之和*/
voidsum_print(intdata[],intsize)
{
inti,j;
/*打印每行数据之和*/
printf("行之和:");
for(i=0;i<size;i++)
for(j=0;j<size;j++){
data[i]+=Magic[i][j]; //行之和
if(j==size-1)printf("%6d",data[i]);
}
putchar(' ');
/*打印每列数据之和*/
printf("列之和:");
for(i=0;i<size;i++)
for(j=0;j<size;j++){
data[size+i]+=Magic[j][i]; //列之和
if(j==size-1)printf("%6d",data[size+i]);
}
putchar(' ');
/*打印主对角线之和*/
for(i=0;i<size;i++)
data[2*size]+=Magic[i][i];
printf("主对角线之和:%6d",data[2*size]);
putchar(' ');
/*打印副对角线之和*/
for(i=0;i<size;i++)
data[2*size+1]+=Magic[i][size-i-1];
printf("主对角线之和:%6d",data[2*size]);
putchar(' ');
}
/*行列对和数组清零*/
voidclear_sum(intdata[])
{
inti;
for(i=0;i<2*MAX_SIZE;i++)
data[i]=0;
}
/*检查程序是否运转正常,所得结果是否是幻方*/
voidcheck_magic(intdata[],intsize)
{
inti;
intflag=0;
for(i=1;i<size+2;i++)
if(data[0]-data[i])flag=1;
if(flag)printf("程序出错,Esc退出,Enter继续 ");
elseprintf(" 恭喜你,获得了一个新的%d阶幻方! ",size);
putchar(' ');
}
Ⅹ C语言中怎么编写n阶幻方
/**
* n阶幻方绦?br> * 完成者:meteor135
* 完成日期:2003.9.8
* 编译环境:VC6.0
*/
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
void showFangzhen(int n);
int main()
{
//输出10组幻方
for(int n = 0; n < 10; n ++)
showFangzhen(2*n+1);
cout<<"Press enter to quit!";
cin.get();
return 0;
}
void showFangzhen(int n)
{
if(!(n%2)) return;
int i,j,**array;
//为指针分配动态内存
array=new int*[n];
for(i=0; i<n; i++)
{
array[i] = new int[n];
}
//初始化数组
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
array[((n-1)/2+i-j+n)%n][(3*n-1+j-2*i)%n]=i*n+j+1;
//or
//array[(n+2*i-j)%n][((n-1)/2+n+j-i)%n]=i*n+j+1;
}
}
//输出n阶幻方
cout<<n<<"阶幻方:"<<endl;
for(i=0; i<n; i++)
{
for(j=0;j<n;j++)
{
cout<<setw(int(log10(n*n))+2)<<array[i][j];
}
cout<<endl;
}
cout<<endl;
//释放动态内存
for(i=0; i<n; i++)
{
delete[] array[i];//原来是 delete array[i];
}
delete[] array;
}
看http://www.programfan.com/club/showtxt.asp?id=17774有更多帮助