鱼C论坛

 找回密码
 立即注册
查看: 945|回复: 1

罗伯法解奇数阶幻方

[复制链接]
发表于 2024-9-3 06:16:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
不知道问题在哪
  1. #include<stdio.h>

  2. int main()
  3. {
  4.         int n,num = 1,lon,wei;
  5.        
  6.         printf("n = ");
  7.         scanf("%d", &n);
  8.        
  9.         int a[n+1][n+1] = {0};
  10.         lon = 1;
  11.         wei = (n-1)/2;
  12.        
  13.         while(num <= n*n)
  14.         {
  15.                 a[lon][wei]=num;
  16.                 lon--;
  17.                 wei++;       
  18.                
  19.                 if(a[lon][wei] != 0||(lon == 0&&wei == n))
  20.                 {
  21.                         lon = lon+2;
  22.                         wei--;
  23.                 }


  24.                
  25.                 if(wei == n)
  26.                 {
  27.                         wei = 0;
  28.                 }
  29.                 if(lon == 0)
  30.                 {
  31.                         lon = n;
  32.                 }
  33.                
  34.                 num++;
  35.         }
  36.         for(int lon = 1;lon <= n;lon++)
  37.         {
  38.                 for(int wei = 0;wei < n;wei++)
  39.                 {
  40.                         printf("%d     ",a[lon][wei]);
  41.                 }
  42.                 printf("\n");
  43.         }       
  44.        
  45.         return 0;
  46. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-9-3 06:16:17 | 显示全部楼层
看起来你正在尝试用C语言实现罗伯法(又称“幻方法”)来生成奇数阶幻方。不过你的代码在某些地方有问题,下面是一些需要修正的点:

1. **包含头文件**:确保`#include <stdio.h>`在代码开头,因为你使用了输入输出函数。

2. **二维数组声明**:定义二维数组时,你应该用正确的语法声明,并指定大小。
   
3. **初始化数组**:声明数组时不能用`int a = {0};`,因为这只是一个不完整的初始化。应该声明`int a[n][n];`并初始化。

4. **填充逻辑**:你提到的代码只展示了一部分,可以根据罗伯法的规则进行填充。

以下是更完整的代码示例:

  1. #include <stdio.h>

  2. int main() {
  3.     int n, num = 1, lon, wei;
  4.    
  5.     printf("n = ");
  6.     scanf("%d", &n);
  7.    
  8.     int a[n][n]; // 声明一个n x n的二维数组
  9.     for(int i = 0; i < n; i++) {
  10.         for(int j = 0; j < n; j++) {
  11.             a[i][j] = 0; // 初始化所有元素为0
  12.         }
  13.     }

  14.     lon = 0;
  15.     wei = n / 2;

  16.     while(num <= n * n) {
  17.         a[lon][wei] = num;
  18.         num++;
  19.         
  20.         int new_lon = (lon - 1 + n) % n;
  21.         int new_wei = (wei + 1) % n;

  22.         if(a[new_lon][new_wei] != 0) {
  23.             lon = (lon + 1) % n;
  24.         } else {
  25.             lon = new_lon;
  26.             wei = new_wei;
  27.         }
  28.     }
  29.    
  30.     // 打印出幻方
  31.     for(int i = 0; i < n; i++) {
  32.         for(int j = 0; j < n; j++) {
  33.             printf("%4d", a[i][j]);
  34.         }
  35.         printf("\n");
  36.     }
  37.    
  38.     return 0;
  39. }
复制代码


**解释:**
- **当前位置原则**:从矩阵的最上行中间一列开始。
- **移动位置**:将数字按顺序填入当前位置,然后向右上方移动。如果移动的位置已经被占用或出界,则向下移动一格。
- 确保每次移动时,使用`% n`操作符处理数组边界,使其循环。

这个方法仅适用于奇数阶的幻方。希望这能帮助你理解并解决问题!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 09:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表