首页 > 软件 > 请问如何在C语言运用循环嵌套,输出如图的1~16矩阵。

请问如何在C语言运用循环嵌套,输出如图的1~16矩阵。

软件 2022-11-08

如何用C语言输出一个1—16 组成的4*4的魔方阵

上面程序必须是奇数,这个不用~~~ #include main() { int a[16][16]={0}; int b,c,d,e,f; printf("请输入魔方阵的阶数:"); scanf("%d",&b); e=b/2; d=0; for(c=1;c<=b*b;c++) { a[d][e]=c; if(a[(d-1+b)%b][(e+1+b)%b]==0) { d=(d-1+b)%b; e=(e+1+b)%b; } else { d=(d+1+b)%b; e=e%b; } } for(d=0;d用c语言求四阶幻方,要求输出所有的由1~16组成的四阶幻方.
#include
#include
#include
#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);
PRINT
}while(getch()!=27);
return0;
}
/*读入数据*/
intread()
{
intmin_size=MIN_SIZE;
intmax_size=MAX_SIZE;
intsize;
do{
printf("请输入幻方阶数n,n∈[%d,%d]\n",min_size,max_size);
scanf("%d",&size);
getchar();
if(size<3||size>MAX_SIZE)printf("非法输入,请重新输入[%d,%d]的正整数\n",min_size,max_size);
elseif(size>SCREEN_SIZE){
printf("大于屏显最大阶数,输出将变形\n");
Sleep(2000);
}
}while(sizeMAX_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;numMagic[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;iMagic[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;numMagic[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/*1、3象限对换*/
for(j=0;jif(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;jk=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;ifor(j=0;jprintf("%4d",Magic[i][j]);
if(j==size-1)putchar('\n');
}
putchar('\n');
}
/*打印各行、各列、各对角线数据之和*/
voidsum_print(intdata[],intsize)
{
inti,j;
/*打印每行数据之和*/
printf("行之和:");
for(i=0;ifor(j=0;jdata[i]+=Magic[i][j]; //行之和
if(j==size-1)printf("%6d",data[i]);
}
putchar('\n');
/*打印每列数据之和*/
printf("列之和:");
for(i=0;ifor(j=0;jdata[size+i]+=Magic[j][i]; //列之和
if(j==size-1)printf("%6d",data[size+i]);
}
putchar('\n');
/*打印主对角线之和*/
for(i=0;idata[2*size]+=Magic[i][i];
printf("主对角线之和:%6d",data[2*size]);
putchar('\n');
/*打印副对角线之和*/
for(i=0;idata[2*size+1]+=Magic[i][size-i-1];
printf("主对角线之和:%6d",data[2*size]);
putchar('\n');
}
/*行列对和数组清零*/
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;iif(data[0]-data[i])flag=1;
if(flag)printf("程序出错,Esc退出,Enter继续\n");
elseprintf("\n恭喜你,获得了一个新的%d阶幻方!\n",size);
putchar('\n');
}

怎样用C语言输出矩阵

定义二维数组作为矩阵,然后用两个for循环打印出每个元素即可。 例如一个10x10的矩阵; #define m 10 #define m 10 int a[m][n]; for(i = 0; i (C语言)用循环嵌套输出图形: 急急急

#include

intmain(void)

{

inti,j,k;

for(i=0;i<=3;i++)//这个是控制要输出几行“*”

{

for(j=0;j<=2-i;j++)//这个控制每行输出几个“空格”,跟i的关系来决定的

printf("");

for(k=0;k<=2*i;k++)//这个控制输出空格之后,需要输出几个“*”号,

printf("*");

printf("\n");//在外层循环内部,内层循环的外部,意思内层循环结束一次后,换行。

}

}

急求!如何用C语言输出如下矩阵(N*N)

题目要求有一个问题,它要求N最小为2,却要求N为奇数,N为奇数应该最小为3或1才对.

按照题目要求编写的C语言矩阵程序如下

#include

int main(){

int i,j,k,N,count=1;

scanf("%d",&N);

if(N<=2 || 15

printf("请输入小于等于15且大于2的奇数");

}else{

int a[N][N];

for(i=N/2;i>=0;i--){

k=N-i-1;

for(j=N-i-2;j>=i;j--){

a[j][k]=count++;

}

for(j=N-i-2;j>=i+1;j--){

a[i][j]=count++;

}

for(j=i;j

a[j][i]=count++;

}

for(j=i+1;j

a[k][j]=count++;

}

}

for(i=0;i

for(j=0;j

printf("%-5d",a[i][j]);

}

printf("\n");

}

}

return 0;

}


标签:CC++ 编程 C(编程语言) 信息技术 编程语言

大明白知识网 Copyright © 2020-2022 www.wangpan131.com. Some Rights Reserved. 京ICP备11019930号-18