当前位置: 代码迷 >> C语言 >> 关于动态分配+算法
  详细解决方案

关于动态分配+算法

热度:523   发布时间:2008-05-05 18:58:29.0
/********************************************************
** Highlight software by yzfy(雨中飞燕) http://yzfy.org *
*********************************************************/
#include <stdio.h>
#include <string.h>

int main(void)
{
    char c;
    while (scanf(" %c", &c)!=EOF
            
&& (c>='A'&&c<='Z'|| c>='a'&&c<='z') )
    {
        int str[30]={1};
        int n=c-'a',d=0;
        if (c<='Z')n=c-'A';
        while (d<=n)
        {
            putchar('A'+d);
            ++str[0];
            for (d=0; str[d]>1; ++d)
            {
                ++str[d+1];
                str[d] = 0;
            }
        }
        putchar('\n');
    }
    return 0;
}


这是其中一种,其实还有一种看似比较变态的方法,BT的二进制

[color=white]

[[it] 本帖最后由 雨中秣燕 于 2008-5-5 19:02 编辑 [/it]]
----------------解决方案--------------------------------------------------------
还是有规律的``

>A字母```的排列都是:  前一个字母的  当前字母  前一个字母的

有对称性的``
----------------解决方案--------------------------------------------------------
for (d=0; str[d]>1; ++d)
{
      ++str[d+1];
      str[d] = 0;
}
这个很巧妙啊
----------------解决方案--------------------------------------------------------
#include <stdio.h>
#include <ctype.h>
#include <math.h>

int main()
{
    char ch;
    while (scanf(" %c",&ch)!=EOF && isalpha(ch))
    {
        long m,em=1<<(toupper(ch)-'A'+1);
        for (m=1;m<em;m++)
            putchar((char)('A'+(float)log(m&-m)/log(2)));
        putchar('\n');
    }
}


看看这个……

[[it] 本帖最后由 StarWing83 于 2008-5-5 19:50 编辑 [/it]]
----------------解决方案--------------------------------------------------------
哈哈哈,刚刚写出来的,特有成就感的说………………
----------------解决方案--------------------------------------------------------
你这样写会比直接循环还要慢。。。。

[color=white]
----------------解决方案--------------------------------------------------------
/********************************************************
** Highlight software by yzfy(雨中飞燕) http://yzfy.org *
*********************************************************/
#include <stdio.h>
#include <string.h>
int BinSearch(int n)
{
    int nl=1,nr=32,nm=16;
    if (n&1)return 0;
    for (;nl<nr;nm=(nl+nr+1)>>1)
    {
        if (n&((1<<nm)-1))
            nr=nm-1;
        else
            
nl=nm;
    }
    return nl;
}
int main(void)
{
    char c;
    while (scanf(" %c", &c)!=EOF
            
&& (c>='A'&&c<='Z'|| c>='a'&&c<='z') )
    {
        int n=c-'a',d=0,e;
        if (c<='Z')n=c-'A'; //toupper
        e = 2<<n;
        for (d=1;d<e;++d)
        {
            putchar('A'+BinSearch(d));
        }
        putchar('\n');
    }
    return 0;
}


来一个二分

[color=white]
----------------解决方案--------------------------------------------------------
慢是因为2^n求n的过程。这个怎么快速求呢?
----------------解决方案--------------------------------------------------------
二分就很快了

[color=white]
----------------解决方案--------------------------------------------------------
要命的程序,刚才死机了
#include <stdio.h>
#include <ctype.h>
#include<math.h>
void p(char c)
{   int inc=1;
    double re=pow(2,(c-'A'+1));
       while(re>inc)
    {
        int j=inc++;
        int i=0;
        while(!(j&1)){j=j>>1;i++;};
        putchar('A'+i);
    };
       
}
int main()
{
    char ch=getchar();
    if(!isupper(ch))
        printf("error.");
    else
        p(ch);
    putchar('\n');
    return 0;
}

[[it] 本帖最后由 sunkaidong 于 2008-5-5 21:01 编辑 [/it]]
----------------解决方案--------------------------------------------------------