Ⅰ 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有更多幫助