- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我道歉。这个问题是编程作业的一部分。我们被要求实现一种以 P 位精度将 分数 f 从基数 A 更改为基数 B 的方法。函数有签名
baseChanger(int[] f, int A, int B, int P)
。
例如,小数 3.14159 的小数为 0.14159,表示为数组:
int[] frac = {1,4,1,5,9};
16 进制的分数 -- 0.3BA07 -- 会被写成
int[] frac = {3,11,10,0,7};
二进制小数 0.01 转换为十进制小数是 0.25,测试转换函数如下所示:
int[] from = {0,1};
int[] to = {2,5};
@Test
assertArrayEquals(to, baseChanger(from, 2, 10, 2));
这是我们被要求实现的算法:
/*
* for (i < P) {
* 1. Keep a carry, initialize to 0.
* 2. From right to left:
* a. x = multiply the ith digit by B and add the carry
* b. the new ith digit is x % A
* c. carry = x / A
* 3. output[i] = carry
*
* @param f The input array to translate. This array is not mutated.
* @param A The base that the input array is expressed in.
* @param B The base to translate into.
* @param P The number of digits of precision the output should
* have.
* @return An array of size P expressing digits in B.
*/
所以对于上面的“from”和“to”,这意味着执行以下操作:
创建一个可以容纳 P 个数字的数组:
int[] output = new int[P];//输出 = {0, 0}
取“from”最右边的数字:
{0, 1 <== }
将该数字乘以 B(此处为 10)并加上进位(当前为零),然后分配给 x:
x <-- 1 x 10 + 0 = 10
将最右边的数字(当前为 1)替换为 x mod A(此处为 2):
{0, 0 <== }
计算进位,即 x/A:
携带 <-- 10/2 = 5
将进位分配给输出中的第 0 个槽:
输出[0] <--进位
输出:{5 <==, 0}
这个过程再重复一次,现在输出
output: {2,5}
但是请注意,数字的顺序是错误的,并且是从least significant 到most significant 输出的!
此外,(更重要的是)将小数(如 0.3)转换为二进制会怎样做?假设您想要 12 位精度。当然,没有精确的二进制表示法,所以您会在这里做什么,特别是因为最低有效数字先出现?
from = {3}
我不确定从哪里开始,希望得到一些建议。请记住,这些数字是分数,而不是整数,并且算法必须在线性 时间内完成。
最佳答案
免责声明:我认为它在O(N) 时间内完成。我已经增加了算法的多功能性。此外,负基数是不切实际的
以下方法将十进制数转换为 radix
中提到的数:
/**
* This method returns an array with <code>precs</code> elements conating the
* required fractional part in the base <code>radix</code>
*
* @param frac A <code>float</code> that contains the fractional part
* (and fractional part only!!) in decimal number system.
* @param radix The base to which it has to be converted (must be (+) ve).
* @param precs The number of digits required i.e. precision.
*
* @return A <code>int[]</code> that contains the digits(eqivalent).
*/
public static int[] toRadix(float frac, int radix, int precs)
{
if(radix < 2) return null;
//Only fractional part is accepted here.
frac = frac - (long)frac; //Precautionary measure :-)
int i, j;
int[] res = new int[precs]; //For storing result.
for(i = 0; i < precs && frac != 0; i++)
{
frac *= radix;
res[i] = (int)frac;
if((long)frac >= 1)
frac = frac - (long)frac;
}
if(flag)
return copy(res, i);
return res;
}
将基数 radix
中的数字转换为十进制的方法 -- 返回 float
。
/**
* This method returns a <code>float</code> that contains the equivalent of the
* fraction in the other base in the parameter array, in decimal.
*
* @param frac An <code>int[]</code> conatining only the fractional part.
* @param radix The base of the fraction entered (must be (+) ve).
*
* @return The equivalent decimal fraction as a <code>float</code>.
*/
public static float toDecimal(int[] frac, int radix)
{
if(radix < 2) return null;
float res = 0, fac = 1.0f/radix;
int i, p = frac.length;
for(i = 0; i < p; i++)
{
res += frac[i] * fac; //or (float)Math.pow(radix, -i);
fac/=radix; //would be fine as well.
}
return res;
}
public static int[] baseChanger(int[] f, int A, int B, int P)
{
if(A < 2) return null;
if(B < 2) return null;
return toRadix(toDecimal(f, A), B, P);
}
和复制
方法:
private static int[] copy(int[] a, int index)
{
index = index < a.length ? index : a.length;
int b[] = new int[index];
for(int i = 0; i < index; i++)
b[i] = a[i];
return b;
}
我已获得所需的泛化水平。结果:
实际(正确)输出:
以上编写代码的输出:
所以,我想这就解决了!顺便说一句,这里有一些提示:
使用数组而不是 String
会导致几个并发症。对于初学者来说,float
的组成部分进去很难对付。这个方法ok对于小数部分,因为我们知道循环应该在哪里停止。
使用 String
排除了复制的需要。
但是您的方法有一个优势:radix
的上限是Integer.MAX_VALUE
而 String
方法只有 36(0 到 9 和一个到z)(虽然这不是一个非常重要的优势,因为它没有实际应用)。
更改数字基数的最实用方法是首先转换为十进制和然后,将其转换为其他基数。
使用 double
会比使用 float
更好,因为它可以提高准确性。
关于java - 在 O(N) 时间内更改小数的基数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21058476/
在使用 requests 库中的状态代码时,我遇到了一些奇怪的事情。每个 HTTP 状态代码都有一个常量,有些具有别名(例如,包括 200 的复选标记): url = 'https://httpbin
这是我得到的代码,但我不知道这两行是什么意思: o[arr[i]] = o[arr[i]] || {}; o = o[arr[i]]; 完整代码: var GLOBAL={}; GLOBAL.name
所以这个问题的答案What is the difference between Θ(n) and O(n)? 指出“基本上,当我们说算法是 O(n) 时,它也是 O(n2)、O(n1000000)、O
这是一个快速的想法;有人会说 O(∞) 实际上是 O(1) 吗? 我的意思是它不依赖于输入大小? 所以在某种程度上它是恒定的,尽管它是无限的。 或者是唯一“正确”的表达方式 O(∞)? 最佳答案 无穷
这是真的: log(A) + log(B) = log(A * B) [0] 这也是真的吗? O(log(A)) + O(log(B)) = O(log(A * B)) [1] 据我了解 O(f
我正在解决面试练习的问题,但我似乎无法找出以下问题的时间和空间复杂度的答案: Given two sorted Linked Lists, merge them into a third list i
我了解 Big-Oh 表示法。但是我该如何解释 O(O(f(n))) 是什么意思呢?是指增长率的增长率吗? 最佳答案 x = O(n)基本上意味着 x <= kn对于一些常量 k . 因此 x = O
我正在编写一个函数,该函数需要一个对象和一个投影来了解它必须在哪个字段上工作。 我想知道是否应该使用这样的字符串: const o = { a: 'Hello There' }; funct
直觉上,我认为这三个表达式是等价的。 例如,如果一个算法在 O(nlogn) + O(n) 或 O(nlogn + n) 中运行(我很困惑),我可以假设这是一个O(nlogn) 算法? 什么是真相?
根据 O'Reilly 的 Python in a Nutshell 中的 Alex Martelli,复杂度类 O(n) + O(n) = O(n)。所以我相信。但是我很困惑。他解释说:“N 的两个
O(n^2)有什么区别和 O(n.log(n)) ? 最佳答案 n^2 的复杂性增长得更快。 关于big-o - 大 O 符号 : differences between O(n^2) and O(n
每当我收到来自 MS outlook 的电子邮件时,我都会收到此标记 & nbsp ; (没有空格)哪个显示为?在 <>. 当我将其更改为 ISO-8859-1 时,浏览器页面字符集编码为 UTF-8
我很难理解 Algorithms by S. Dasgupta, C.H. Papadimitriou, and U.V. Vazirani - page 24 中的以下陈述它们将 O(n) 的总和表
我在面试蛋糕上练习了一些问题,并在问题 2给出的解决方案使用两个单独的 for 循环(非嵌套),解决方案提供者声称他/她在 O(n) 时间内解决了它。据我了解,这将是 O(2n) 时间。是我想错了吗,
关于 Java 语法的幼稚问题。什么 T accept(ObjectVisitorEx visitor); 是什么意思? C# 的等价物是什么? 最佳答案 在 C# 中它可能是: O Accept(
假设我有一个长度为 n 的数组,我使用时间为 nlogn 的排序算法对它进行了排序。得到这个排序后的数组后,我遍历它以找到任何具有线性时间的重复元素。我的理解是,由于操作是分开发生的,所以时间是 O(
总和 O(1)+O(2)+ .... +O(n) 的计算结果是什么? 我在某处看到它的解决方案: O(n(n+1) / 2) = O(n^2) 但我对此并不满意,因为 O(1) = O(2) = co
这个问题在这里已经有了答案: 11 年前关闭。 Possible Duplicate: Plain english explanation of Big O 我想这可能是类里面教的东西,但作为一个自学
假设我有两种算法: for (int i = 0; i 2)更长的时间给定的一些n - 其中n这种情况的发生实际上取决于所涉及的算法 - 对于您的具体示例, n 2)分别时间,您可能会看到: Θ(n)
这个问题在这里已经有了答案: Example of a factorial time algorithm O( n! ) (4 个回答) 6年前关闭。 我见过表示为 O(X!) 的 big-o 示例但
我是一名优秀的程序员,十分优秀!