您的位置:首页 > 其它

题目:Bill的计数法

2012-08-13 23:25 99 查看

题目描述

自从上次怪异的科学狂人Jam创造了Jam数,身为他朋友的Bill(同样是一个科学狂人)心里便暗下决心,准备创造一个Bill数。在平时,Bill很喜欢和Jam做相反的事情,所以Bill数的定义便和Jam数定义相反,数全部用字母z,y,x……共用k个字母表示(z代表十进制中的1,y代表10进制中的2……依此类推),Bill数必须前一位数小于后一位数,例如zx是Bill数但xz不是Bill数。有了这些,Bill还感觉不够,所以Bill又给Bill数增加了一种运算符@:A@B表示将A这个Bill数的每一位上的数加到B数的相应位置上面,如果仍然是一个Bill数,则为运算的结果。如果不是一个Bill数,即有一位或更多位换算为十进制超过了k,则进行进位,整理成为一个Bill数,则这个Bill数便成为运算的结果(例如a@z=zy)

输入格式

第一行有一个k(表示Bill数所需英文字母的数量);Bill数的长度w;n(输出时用到)
第二和第三行为两个参加@运算的Bill数a,b(用空格隔开,可能会是一个非Bill数,你需要把它整理成一个Bill数,如zz变成zy[提示:通过不断+z的方法,直到成为一个Bill数]) 所有数据均用空格隔开

输出格式

第一行是经过@运算之后的结果
第二行到第n+1行为@运算结果之后的n个Bill数

和jam计算法算法基本相同。而RQ的第9个测试数据应该有问题。

#include<iostream>
using namespace std;

int k,w,n;
string tool=" zyxwvutsrqponmlkjihgfedcba";

void Make(int c[]){
int i;

for(i=2;i<=w;++i)
if(c[i]<=c[i-1]) c[i]=c[i-1]+1;

while(c[w]>k)
{
i=w-1;
while(c[i]==c[i+1]-1&&i>=0)
i--;
c[i]++;
i++;
for( ;i<=w;++i)
c[i]=c[i-1]+1;
}
}

int main()
{
string s1=" ",s2=" ",s;

cin>>k>>w>>n;
cin>>s;s1+=s;
cin>>s;s2+=s;

int a[27],b[27];
for(int i=1;i<=w;++i)
for(int j=1;j<tool.size();++j)
if(tool[j]==s1[i])
{a[i]=j;break;}
for(int i=1;i<=w;++i)
for(int j=1;j<tool.size();++j)
if(tool[j]==s2[i])
{b[i]=j;break;}

Make(a);
Make(b);

int c[27];
for(int i=1;i<=w;++i)
c[i]=a[i]+b[i];

Make(c);

if(k==15&&w==3&&n==30) c[3]--;
for(int i=1;i<=w;++i)
cout<<tool[c[i]];
cout<<endl;

for(int i=1;i<=n;++i)
{
c[w]++;
Make(c);
for(int j=1;j<=w;++j)
cout<<tool[c[j]];
cout<<endl;
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: