| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 363 人关注过本帖
标题:[分享]写之前奇数阶幻方想法
只看楼主 加入收藏
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:3 
[分享]写之前奇数阶幻方想法
所谓幻方(最基本的那种),就是横,竖,对角线上的数的和等于一个常数的数字方阵
4 3 8
9 5 1
2 7 6
#include<stdio.h>
int main()
{
    int i;
    const int N=5;

for(i=1;i<2*N;i++)
  {
   printf("%d ",(N+(i>N ?2*N-i:i-N?i:0)*(i%N>N/2 ?1 :-1)));
   if(!(i%3))
       putchar('\n');
   }
   scanf("%d",i);
}

(N+(i>N ?2*N-i:i-N?i:0)*(i%N>N/2 ?1 :-1))怎样得出
4 3 8
9 5 1
2 7 6

将矩阵展开并要要求结果:
         4 3 8 9 5 1 2 7 6

通过下面的关系,想办法合成上面的数列
i 会生成 1 2 3 4 5 6 7 8 9      

想办法生成
         1 2 3 4 5 4 3 2 1       //  i>N ?2*N-i:  (i-N?i:0) 这个特别处理一个5

 i>N ?2*N-i:  (i-N?i:0)    //用大括号目的就是省得麻烦,不用考虑优先级如何
等价:
    if( (i-N) != 0 )
     temp = i        //可以理解系统建一个临时变量参与运算,在程序中不可见
         else
     temp = 0
    if( (i>N) != 0)
       temp_1 = 2*n - i;  //可以理解系统建一个临时变量参与运算,在程序中不可见
    else
       temp_1 = temp;
 然后同这个5结合
         5 5 5 5 5 5 5 5 5   
  
大家从中看作什以规律出来
        (5-1) (5-2) (5+3) (5+4) (中间特别处理) (5-4) (5-3) (5+2) (5+1)

关键处理符号问题
          -    -      +    +       ?            -      -     +      +

 这里有什么办法生成这个这些符号关系,就利用+/-1去解决
        -1   -1       1    1       ?           -1      -1    1       1

再同    1     2       3     4      5           4        3    2       1     //上下两者相乘

得出   -1     -2      -3     -4     5           -4      -3    2       1     // (i%N>N/2 ?1 :-1)));

(i%N>N/2 ?1 :-1)));
等价:
       if( i%N > N/2)
       temp_3 = 1;              //可以理解系统建一个临时变量参与运算,在程序中不可见   
       else
       temp_3 = -1;

  得出    4 3 8 9 ? 1 2 7 6        // i>N ?2*N-i:  (i-N?i:0) 这个特别处理一个5

最后生成
          4 3 8 9 5 1 2 7 6      

PS: 建意建草稿,将你的想法写草构上,想办法如何去实现,草稿最好工整,不然那些规律就不出来。

有什么不明白地方可以提问!




[ 本帖最后由 点线面 于 2011-1-9 22:28 编辑 ]
搜索更多相关主题的帖子: 对角线 办法 
2011-01-09 21:48
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:5 
有一个问题是,你还是把三目运算符展开成if else吧,
这样清楚很多,说明一下每部分的结果怎么样影响的最终结果,和规律的哪个部分相接这样
现在这样看的人会有点晕的

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2011-01-09 21:55
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
程序代码:
#include<stdio.h>
int main()
{
    int i,temp,temp_1,temp_2;
    const int N=5;


    for(i=1; i < 2*N ;i++)
  {
                    
     if( (i-N) != 0 )         
        temp = i;             //temp可以理解系统建一个参与运算的临时变量,在程序中不可见
     else
        temp = 0;

     if( (i>N) != 0)
       temp_1 = 2*N - i;      //temp_1可以理解系统建一个参与运算的临时变量,在程序中不可见
     else
       temp_1 = temp;

     if( i%N > N/2)
       temp_2 = 1;            //temp_3可以理解系统建一个参与运算的临时变量,在程序中不可见   
      else
       temp_2 = -1;

      printf("%d",  N + temp_1 * temp_2   );

     if(i%3)
        putchar('\n');           //换行

   }
      scanf("%d",i);       //编译后还了暂停窗口,方便观察

      return 0;
}
为了分便大家理解程序结构我只好把它拆,记住 temp,temp_1,temp_2只为大家方便而假设

小代码,大智慧
2011-01-09 22:39
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
程序代码:
#include<stdio.h>
int main()
{
    int i,temp,temp_1,temp_2;
    const int N=5;


    for(i=1; i < 2*N ;i++)
  {
                    
     if( (i-N) != 0 )         //  这里目的就是处理一个中间的数字5     
        temp = i;             //temp可以理解系统建一个参与运算的临时变量,在程序中不可见
     else
        temp = 0;
     /*
         上面不是有一段这样介绍
         4 3 8 9 ? 1 2 7 6     如果是5,接受一个零, if()只判断是不是零,对其它的数字不要求    
     */
     if( (i>N) )
       temp_1 = 2*N - i;      //temp_1可以理解系统建一个参与运算的临时变量,在程序中不可见
     else
       temp_1 = temp;
     /*
          (i>N) != 0
          i > 6 7 8 9
          temp_1 = 2*N - i
          变形为 4 3 2 1
          没有被处理部分就是i的数列前部分
          1 2 3 4 5
          最后的生成 1 2 3 4 5 4 3 2 1
     */

     if( i%N > N/2)
       temp_2 = 1;            //temp_3可以理解系统建一个参与运算的临时变量,在程序中不可见   
      else
       temp_2 = -1;

      /*
          i%N生成
          1 2 3 4 0 1 2 3 4
          N/2生成 2
          即是说大于2取正号,小于取负号
          这里生成 -1 -1 1 1 0 -1 -1 1 1效果 
      */
      printf("%d ",  N + temp_1 * temp_2   );
      /*
         ( -1 -2 3 4 0 -4 -3 2 1)+(5,5,5,5,5,5,5,5,5)
         最后,嫁鸡随鸡,嫁狗随狗     输出 4 3 8 9 5 1 2 7 6
      */
     
     if(!(i%3))
        putchar('\n');           

   }
      scanf("%d",i);       //编译后还了暂停窗口,方便观察

      return 0;
}
PS:今次应该明白吧

[ 本帖最后由 点线面 于 2011-1-9 23:33 编辑 ]

小代码,大智慧
2011-01-09 23:26
快速回复:[分享]写之前奇数阶幻方想法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018759 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved