小红每次可以把一个字符变成两个字母表中比它小一位的字符。例如,可以把'b'变成两个'a',可以把'z'变成两个'y'。
小红希望最终可以生成 个'a',你能帮小红求出初始的字符串吗?请你输出长度最短的合法字符串,有多解时输出任意即可。
一个正整数,代表最终的'a'的数量。
一个字符串,代表小红操作前的字符串。如果有多个合法解,输出任意一个合法字符串即可。但需要保证输出的是最短字符串。
5
ca
"ca"->"bba"->"aaaaa"输出ac也是可以的
#include <iostream> using namespace std; /* * 注意到这个其实就是把x分解成2的幂级数表示 */ int main() { int x; cin>>x; char ch = 'a'; while(x){ if(x&1) cout<<ch; ch++; x>>=1; } } // 64 位输出请用 printf("%lld")
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); // System.out.println((int) ('z'-'a')); StringBuilder res = new StringBuilder(); int log = (int) (Math.log(n) / Math.log(2)); int yu = n % 2; while (log != 0) { res.append((char) ('a' + log)); n -= (int) Math.pow(2, log); if (n == 0)break; log = (int) (Math.log(n) / Math.log(2)); } if (yu != 0) { res.append('a'); } System.out.println(res); } }
n = int(input()) dic = {1: 'a', 2: 'b', 4: 'c', 8: 'd', 16: 'e', 32: 'f', 64: 'g', 128: 'h', 256: 'i', 512: 'j'} res = '' len_x = len(dic) for i in range(len_x - 1, -1, -1): if 2**i == n: res += dic[2 ** i] break if 2**i < n: res += dic[2 ** i] n = n - 2**i print(res)
# 9a --> 最短 ---> # b --> aa , c --> aaaa, d --> aaaaaaaa # 最终的数目就是在 1 2 4 8 16 组合 # 比如 5 --> 4 + 1 ca init = 'a' num = int(input()) pre = 1 res = [1] out = '' while(pre < 1000): pre = pre * 2 res.append(pre) for i in range(len(res)-1,-1,-1): if res[i] == num: out += chr(ord('a')+i) break if res[i] < num: out += chr(ord('a')+i) num = num - res[i] print(out)