POJ 1023--The Fun Number System

本文介绍了一种数值转换算法,该算法能够将一个特定值通过逆推方式转化为由0和1组成的字符串,满足特定数学表达式的约束条件。文章通过示例详细解释了算法的工作原理,并提供了一段C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

这题比较简单,就是给出一个值val和一个字符串str[n],要求出一个由0,1组成的数串num[n],满足
F(0)*num[0]*2^0+F(1)*num[1]*2^1+…+F(n)*num[n]*2^n = val,str[n]若为p,F(n)为1,反之为-1.

比如说第二个样本,10和ppnn,可求得1*2^3 + 1*2^2 - 1*2^1 - 0*2^0 = 10,所以所求数串为1110.

分析

我们可以通过逆推的方式来求这个数。比如10(1010)=1*2^3 + 1*2^2 - 1*2^1 - 0*2^0,
10 - 1*2^3 - 1*2^2 + 1*2^1 + 0*2^0 = 0.
从0位开始,每确定一位,便右移一位。

  • (1010),原数0位为0
    系数-1,10(1010) + 0*2^0 = 10(1010)
  • (1010),原数1位为1
    系数-1,10(101)+ 1*2^1 = 12(1100)
  • (1100),原数2位为1
    系数1,3(1100) - 1*2^2 = 8(1000)
  • (1000),原数3位为1
    系数1,8(1000) - 1*2^3 = 0

求得原数为12(1110)

代码如下:
Memory: 240K Time: 0MS Length:27LINES

#include<iostream>
using namespace std;
int main()
{
    long long number;
    int cases, length;
    char letter[65]; //先装系数字符串,再装结果。
    cin >> cases;
    while (cases--)
    {
        cin >> length >> letter >> number;
        unsigned long long num = number > 0 ? number : (~number) + 1;//注意负数
        for (int i = length - 1; i >= 0; --i, num >>= 1)
        {
            char ch = letter[i];
            letter[i] = (num & 1) + 48;
            if (num & 1)
            {
                if (number > 0) num += ch == 'n' ? 1 : -1;
                else    num += ch == 'p' ? 1 : -1;
            }
        }
        if (num == 0)   cout << letter << endl;
        else    cout << "Impossible" << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值