/********************************************************
** 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;
}
** 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');
}
}
#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;
}
** 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]]
----------------解决方案--------------------------------------------------------