数据连续化处理

这里先举个简单的例子,很多朋友以前一定写过类似这样的例子:求编写一函数,输入年月日,求出该日是该年的第几天.

好的,现在大家代码会怎么写呢?我的第一次代码大概是这样的:

   

int  GetDay( int  year, int  month, int  day)
{
   int s=0;
   switch(month-1)
    {
    case 1:
        s=31; break;
    case 2:
        s=31+28; break;
    case 3:
        s=31+28+31; break;
    case 4:
        s=31+28+31+30; break;
      ...
    }
    //最后在下是否闰年
}

今天在fy网站上看了连续化处理后,感悟颇深.对上面的代码做了连续化处理:

 

ExpandedBlockStart.gif 代码
// 返回这天是那一年的第几天
int  GetDay( int  year,  int  month,  int  day)
{
    
int  sum = day;
    
int  m[ 12 ] = { 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 };

    
if (year % 400 == 0   ||  (year % 100   &&  year % 4 == 0 ))   // 判断闰年
    {
        
++ m[ 1 ]; 
    }

    
for ( int  i = 0 ; i < month - 1 ;i ++ )
    {
        sum 
+=  m[i];
    }
    
return  sum;
}

怎么样?简浩很多吧.

这里在举个蛇形矩正输出的例子:

输入有多组数据,每组只有一行,包含x,y(1 <= x,y <= 30)和t,输出x*y螺旋方阵,如果t=0,就输出逆时针螺旋方阵,否则输出顺时针的

样例输入:
3 5 0
4 4 1

样例输出(每个数字要占四个格子,输出完一组就接着输出一个空行):
   1  12  11
   2  13  10
   3  14   9
   4  15   8
   5   6   7

   1   2   3   4
  12  13  14   5
  11  16  15   6
  10   9   8   7

连续化处理后的代码:

ExpandedBlockStart.gif 代码
#define  SET_XY(x,y,d) x=sym[d][0], y=sym[d][1]
int  main()
{
    
int  m, n, t;
    
int  sym[ 4 ][ 2 ] = {{ 0 , - 1 }, { 1 , 0 }, { 0 , 1 }, { - 1 , 0 }};  // 连续化处理的关键
     while (scanf( " %d%d%d " & m,  & n,  & t)  !=  EOF)
    {
        
int  map[ 32 ][ 32 =  { 0 };  // 初始化数据
         int  x, y, dx, dy, d, nStep  =   2 ;
        
for (x  =   1 , y  =  m  +   1 ; x  <=  n; x ++ // 设置上下边界
            map[x][ 0 =  map[x][y]  =   - 1 ;
        
for (x  =   1 , y  =  n  +   1 ; x  <=  m; x ++ // 设置左右边界
            map[ 0 ][x]  =  map[y][x]  =   - 1 ;
        x 
=  y  =   1 ; d  =   1   +  (t  ==   0 );
        SET_XY(dx, dy, d);
        
if (map[y + dy][x + dx])  // 设置起始方向
        {
            d 
=  (d + 1 + ((t == 0 ) << 1 )) % 4 // d就是方向
            SET_XY(dx, dy, d);
        }
        
for (map[ 1 ][ 1 =   1 ;;nStep ++ // 螺旋遍历
        {
            x 
+=  dx , y  +=  dy;
            map[y][x] 
=  nStep;
            
if (map[y + dy][x + dx])  // 碰到边界或者有数的地方
            {
                d
=  (d + 1 + ((t  ==   0 ) << 1 )) % 4 // 改变方向
                SET_XY(dx, dy, d);
                
if (map[y + dy][x + dx]) break // 无处可走,退出
            }
        }
        
for (y  =   1 ; y  <=  n; y ++ // 输出结果
        {
            
for (x  =   1 ; x  <=  m; x ++ )
                printf(
" %4d " ,map[y][x]);
            printf(
" \n " );
        }
        printf(
" \n " );
    }
    system(
" pause " );
    
return   0 ;
}

 

文章来源:http://yzfy.org/dis/listpost.php?tid=629

转载于:https://www.cnblogs.com/tqlin/archive/2010/04/22/1717877.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值