本帖最后由 yh1205 于 2010-01-11 14:19:48 编辑

解决方案 »

  1.   

    这个不用数学,你把m(i)怎么对应到n(i)讲出来,程序自然就知道怎么写了。
      

  2.   

    这个你得先告诉我们“规则”是怎样的,如果只考虑你给出的这几个数字,那么规则可能不只一种,但是不一定符合你可能还有的数字。
     所以你得告诉我们映射的规则。其实有了这个规则,就是写程序的逻辑结构了。
     比如你给的这几个数。规则如下:
     1.m(j)只有0和1组成。
     2.n(j)与m(j)一一对应。
     3.0对应于0;
     4.以0为分割线,n(j)中开始计数,第一次遇见1时改为1,第二次遇见1时改为2.
       你只要在n(j)中做一个计数,看目前出现了几个分割符(一个或几个0)。
      

  3.   

    规则如下: 
    1.m(j)只有0和1组成。 
    2.n(j)与m(j)一一对应。 
    3.0对应于0; 
    4.以0为分割线,n(j)中开始计数,第一次遇见1时改为1,第二次遇见1时改为2. 
      你只要在n(j)中做一个计数,看目前出现了几个分割符(一个或几个0)。哈哈,和daredjever说的一样,那么知道怎么搞嘛 
    我现在是这么搞的  if(m(i-1,j)==0 
                n(i,j)=++count;
    else
                n(i,j)=m(i-1,j);        得出来的数据是
    m(j)    n(j) 
    0        0 
    0        0 
    0        0 
    1        1 
    1        2 
    1        3 
    0        0 
    0        0 
    0        0 
    1        4 
    1        5 
    0        0 
    0        0 
    0        0 
    1        7 
    1        8 
    1        9 
    0        0 
    0        0 
    1        10我感到不解!! 
    0        0
      

  4.   

    规律是m(j)中第一块区域出现1的,n(j)标记对应增加  设置全局记数器,判断时对j循环,如果m[j]为1,且m[j-1]或m[j+1]也为1,那么n[j]设置为记数器的值。
      

  5.   

    第一次出现1,将n(j)的值置为1,第二次出现1,将n(j)的值置为2
    第n次出现1,将n(j)的值置为n;int n=1;
    int n = 1;
    int i = 0;
    BOOL s = FALSE;
    int len = sizeof(m)/sizeof(type);
    for(i = 0; i < len; i++)
    {
    if(m[i] == 0)
    {
    n[i] = m[i];
    if(s)
    {
    s = !s;
    n++;
    }
    }
    else
    {
    n[i] = n;
    if(!s)
    s = !s;
    }
    }
      

  6.   

    上面的程序已测试通过,建议将int n = 1;改一下,因为和n[i]的定义冲突.
      

  7.   

    3楼正解,只需依次检测原序列,事先设置一计数器 Count=0,检测原序列时,“0”均不作改变,第一次碰到非零(也就是原序列中的“1”)时,令Count=1(Count++即可),此时对于原序列中下一个“0”之前的非零(“1”),其在新序列中的值就变作Count,注意:在碰到下一个“0”之前不要改变Count的值,继续下去,在第二次碰到非零时(即下一个零之后的首个“1”),令Count=2(同样做Count++即可),如上,此时对于原序列中下一个“0”之前的非零(“1”),其在新序列中的值就变作Count,如此,断续下去,直至整个序列处理完毕。
      

  8.   

    三楼说的对,只是有个小问题要处理一下
    就是设置一个标志flag来记录由0转1和1转0的位置
    只有当读取的数值由0转向1时,flag置true,计数器count++;其他情况flag都置为false
    判断读取的数值如果非0,则置为count;
    判断flag为false切读取数值为0,则为置0。
      

  9.   

    设m()中的连续的1是一个个独立的块,由n()的含义是m()中的块的计数
    算法很简单,
    定义一个变量A = 0
    左侧列差分 x = m(j+1)-m(j),如果x>0,累加到A
    定义第二个变量 B =  m(j) * A,即可得到对应的 n(j)的值 。
      

  10.   

    int g_nCurValue=1;
    int g_mPrevValue=0;int CalcN(int m)
    {
        if(m==0 || m==g_mPrevValue) return (g_mPrevValue=0);
        g_mPrevValue=m;
        return g_nCurValue++;
    }
      

  11.   

    int g_nCurValue=1; 
    int g_mPrevValue=0; int CalcN(int m) 

        if(m==0) return (g_mPrevValue=0); 
        if(m==g_mPrevValue) return g_nCurValue;
        g_mPrevValue=m; 
        return g_nCurValue++;