Alternative Scale of Notation(大数java)

90 篇文章 0 订阅
73 篇文章 0 订阅

Link:http://poj.org/problem?id=1894

Problem:

Alternative Scale of Notation
Time Limit: 1000MS Memory Limit: 30000K
Total Submissions: 2003 Accepted: 730

Description

One may define a map of strings over an alphabet Σ B = { C1, C2, . . . C B } of size B to non-negative integer numbers, using characters as digits C1 = 0, C2 = 1, . . . , C B = B - 1 and interpreting the string as the representation of some number in a scale of notation with base B. Let us denote this map by U B , for a string α[ 1...n ] of length n we put 
UB(α)=Σ0<=i<=n-1α[n-i]*Bi

For example, U3(1001) = 1*27 + 0*9 + 0*3 + 1*1 = 28. 

However, this correspondence has one major drawback: it is not ont-to-one. For example, 
28 = U3(1001) = U3(01001) = U3(001001) = ... , 
infinitely many strings map to the number 28. 

In mathematical logic and computer science this may be unacceptable. To overcome this problem, the alternative interpretation is used. Let us interpret characters as digits, but in a slightly different way: C1 = 1, C2 = 2, . . . , C B = B . Note that now we do not have 0 digit, but rather we have a rudiment B digit. Now we define the map V B in a similar way, for each string α[ 1...n ] of length n we put 
VB(α)=Σ0<=i<=n-1α[n-i]*Bi

For an empty string ε we put V B(ε) = 0. 

This map looks very much like U B , however, the set of digits is now different. So, for example, we have V3(1313) = 1*27 + 3*9 + 1*3 + 3*1 = 60. 

It can be easily proved that the correspondence defined by this map is one-to-one and onto. Such a map is called bijective, and it is well known that every bijective map has an inverse. Your task in this problem is to compute the inverse for the map V B . That is, for a given integer number x you have to find the string α, such that V B(α) = x. 

Input

The first line contains B (2 <= B <= 9) and the second line contains an integer number x given in a usual decimal scale of notation, 0 <= x <= 10 100.

Output

Output in one line such string α, consisting only of digits from the set { 1, 2, . . . , B }, that V B(α) = x . 

Sample Input

3
60

Sample Output

1313

Source

其实思路很简单:

对于U串[Un, Un-1, Un-2, ..., U1]其对应的V串是[Un + 1, Un-1 + 1, Un-2 + 1,..., U1 + 1]即在每一个U串元素的基础上+1

那么U串的X值和V串的X值是什么关系呢? xV = Bn * (Un + 1) + Bn-1 * (Un-1 + 1) + Bn-2 * (Un-2 + 1) +... + B1 * (U1 + 1)

其中Bn = base ^ (n - 1). 则xV = xU + Bn + Bn-1 + Bn-2 +  ... + B1,所以可以基于以下步骤通过间接求U串来求解V串:

1)将输入x迭代减去bi,当bi > x时退出,此时剩下的x为U的x值,并记录下迭代的步骤len,len即为V串的长度

2)利用10进制转base进制的方法在1)中x的基础上求U串

3)2)中出的U串的长度l很可能小于Len,则在U串前面补齐Len - l个0

4)一次输出U串元素+1即为V串


java1:

import java.util.*;

import java.io.*;
import java.math.*;
import java.text.*;


public class not {
public static void main(String args[])
{
BigInteger b,x,t,tt;
int len,i,k;
Scanner cin=new Scanner(System.in);
while(cin.hasNext())
{
b=cin.nextBigInteger();
x=cin.nextBigInteger();
t=BigInteger.valueOf(1);
len=0;
while(x.compareTo(t)>=0)
{
len++;
x=x.subtract(t);
t=t.multiply(b);
}
String s="";
while(x.compareTo(BigInteger.valueOf(0))!=0)
{
tt=x.mod(b);
x=x.divide(b);
s=tt.toString()+s;
}
k=s.length();
while(k<len)
{
s="0"+s;
k++;
}
for(i=0;i<len;i++)
{
System.out.print((char)(s.charAt(i)+1));
}
System.out.println();
}
}


}


java2:


import java.util.*;
import java.io.*;
import java.math.*;
import java.text.*;


public class Main{
public static void main(String args[])
{
BigInteger b,x,t,tt;
int len,i,k;
Scanner cin=new Scanner(System.in);
while(cin.hasNext())
{
b=cin.nextBigInteger();
x=cin.nextBigInteger();
t=BigInteger.valueOf(1);
len=0;
while(x.compareTo(t)>=0)
{
len++;
x=x.subtract(t);
t=t.multiply(b);
}
String s;
s=x.toString(b.intValue());
k=s.length();
while(k<len)
{
s="0"+s;
k++;
}
for(i=0;i<len;i++)
{
System.out.print((char)(s.charAt(i)+1));
}
System.out.println();
}
}


}

总结:s="0"+s;与s=s+“0”效果不一样!!!s=tt.toString()+s;与s=s+tt.toString()效果不一样!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林下的码路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值