- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我努力改进我的算法很长一段时间,但没有任何进展。
我需要一个可重用的函数来计算 x*3+y*5=n
。
约束:
|x-y|
这是我编写的控制台应用程序草稿,它可以编译并运行,但如您所见,在处理大量数据时效率很低。
我想我缺乏数学知识来改进代码:
static void Main(string[] args)
{
GetWarAfterMath(5000000);
Console.ReadLine();
}
const int FIRST = 3;
const int SECOND = 5;
static void GetWarAfterMath(int n)
{
int x = 0;
int y = 0;
int delta = 0;
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if ((i * FIRST) + (j * SECOND) == n)
{
// Console.WriteLine(i + "*" + FIRST + "+" + j + "*" + SECOND + "=" + n);
if (Math.Abs(i - j) < delta)
{
x = i;
y = j;
delta = Math.Abs(x - y);
}
break;
}
else if ((j * FIRST) + (i * SECOND) == n)
{
// Console.WriteLine(j + "*" + FIRST + "+" + i + "*" + SECOND + "=" + n);
if (j - i < delta)
{
x = j;
y = i;
delta = Math.Abs(x - y);
}
break;
}
}
}
Console.WriteLine("THE WINNERS ARE:" + x + "*" + FIRST + "+" + y + "*" + SECOND + "=" + n);
}
编辑:
最后结合@Yves Daoust、@user3386109 和@Hasson 的回答。
时间复杂度急剧下降,
数字 8000000 的执行时间:127 毫秒!
这是最终的算法:
static void Main(string[] args)
{
GetMatch(34);
Console.ReadLine();
}
const double FIRST = 3;
const double SECOND = 5;
static void GetMatch(double n)
{
int x = 0;
int y = 0;
int finalX = 0;
int finalY = int.MaxValue;
for (int i = 0; i < n / FIRST; i++)
{
if (((n - FIRST * i) / SECOND) % 1 == 0)
{
y = Convert.ToInt32(((n - FIRST * i) / SECOND));
x = i;
if(Math.Abs(x-y) < Math.Abs(finalX-finalY))
{
finalX = x;
finalY = y;
}
}
}
Console.WriteLine("THE WINNERS ARE:" + finalX + "*" + FIRST + "+" + finalY + "*" + SECOND + "=" + n + " Calc: " + (finalX * FIRST + finalY * SECOND));
}
请注意,正如@Yves Daoust 在他的第一个答案中所写,也可以使用欧几里德算法通过线性丢番图方程求解此问题,但您需要反转欧几里德算法,我更愿意保持简单。如果有人感兴趣,这里有一个关于该主题的精彩视频和解决方案:数论:Diophantine Equation: ax+by=gcd(a,b)
非常感谢您的帮助。
最佳答案
ax+by = c
问题在数论中非常有名(它是一个线性丢番图方程)。
只有 gcd(3,5)|n
才有解,这当然永远为真。
然后,如果您知道 3x°+5y°=n
的一些解,所有解的形式都是 x=x°-5k
,y =y°+3k
.
很容易找到解决方案,因为n
、n-5
、n-10
中的一个肯定是以下的倍数3
。
剩下的就是在约束x°-5k>0
、y°+下最小化
。最小值将通过最接近 |x°-5k-y°-3k|
3k>0x°-y°
的 8k
值或使约束之一饱和的值来实现。
例如,对于n=173000
,x°=57665
和y°=1
是一个解。然后 k=(57665-1)/8=7208
产生 |x-y|=0
。该解决方案是可以接受的,因为满足了约束条件。
我没有提供案例研究的全部细节,但主要的教训是:不需要循环!
关于c# - |x-y|之间差值最小的改进方程算法ax+by=c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47590370/
在我的一门类(class)中,我接到了一项家庭作业,要求我们在谷歌上搜索 Metapost 语言并找到该语言中方程求解功能的用途。 在浏览了 Metapost 用户手册的前十多页后,我发现只有一个原因
你能帮我在 this page 上的谷歌图表上隐藏趋势线上的工具提示(方程)吗? ? 谢谢 以下是我正在使用的图表选项: var options = { title: 'Weight
我正在尝试将 TeXWorks 编辑器配置为使用与 TeXMaker 相同的语法着色。但是,TexWorks 使用正则表达式来指定应该着色的内容。不幸的是,它没有数学的默认设置。 我想匹配 $ 之间的
我刚开始玩 GHCi。我看到列表生成器基本上解决了给定集合中的方程式: Prelude> [x | x [0.01,0.2..2.0] [1.0e-2,0.2,0.39,0.580000000000
是否有可以使用的图形表达式生成器或方程编辑器的 Java 开源实现? 最好有在线演示,或者至少有屏幕截图。 最佳答案 取决于方程的类型。 如果您正在考虑简单的多项式,您可以尝试 Java Expres
我有四个文本输入字段,在用户输入相关值后,我必须进行 JavaScript 计算以将它们全部相加 我使用: var total = Number(value1) + Number(value2) +
为什么这段代码有两个不同的输出(GCC 4.5.1)(我已经评论了重要的行): int main() { bool a = 1; bool b = 1; bool c = 1;
如果标题含糊不清,我深表歉意,但我不知道如何为我的情况命名。我正在为使用 GPS 的 iPhone 编写一个应用程序。在 didUpdateLocations: 方法中,我针对任意大小的变量测试位置的
我正在尝试计算表中学生的 BMI,四舍五入到三位数: +-------+--------+--------+ | fname | weight | height | +-------+--------
我们可以使用 deSolve R 中的常微分方程 (ODE) 包,但是,我找不到解决两个嵌套 ODE 方程的方法,假设` b'(t) = beta - k*b(t); a'(t) = alpha -b
我有一个 boolean 方程,想简化它。帮忙解决一下。 bool needLoad = isA || (!isA && !isB); 之后我使用 if (needLoad){ if (
我很感兴趣,建模工具(在我的例子中是 OpenModelica 和 Dymola - 建模语言 Modelica)如何求解方程组(线性和/或非线性)。这些工具专为求解微分代数方程而设计。我知道一点将微
Julia:当我有绘图时如何找到最佳拟合曲线/方程?我有一个用 map 绘制的图,但我需要找到一个适合它的二次方程? 最佳答案 正如评论中所说,有一个情节在这里并不真正相关;只有数据本身是。您可以使用
我一直在尝试将像 100, 45 这样的输入放入文本框中,并通过单击按钮通过我的方程式运行它,但我不知道该怎么做。单击按钮后,它应该发布答案作为警报。请帮忙。谢谢。 function Rad(a, b
Julia:当我有绘图时如何找到最佳拟合曲线/方程?我有一个用 map 绘制的图,但我需要找到一个适合它的二次方程? 最佳答案 正如评论中所说,有一个情节在这里并不真正相关;只有数据本身是。您可以使用
有人可以向我解释为什么下面的代码会打印字符“u”吗? int p = 9; int q = 5; int r = p - q; double x = p; double y = q; St
我想以某种方式缩短我的 ODE 方程,因为否则代码会变得困惑。我尝试过使用辅助函数,例如这里的 fe() ,但这不起作用。下面的代码只是一个例子,欢迎任何建议!谢谢! # Import the req
我无法创建正确的文件。程序中的方程不会迭代,它只会根据请求的数量写入相同的总和。 for 循环。 #include #include #include #define LEN 256 int m
我有 2 个指向一些 Point 结构的指针。我想计算两点之间的距离(我不需要计算它的根)所以我有这个: w[0]=X[l]; w[1]=X[l+1]; d=m(w[0]->x
我有一个具有 CSV 上传功能的网站,它将 CSV 中的所有内容推送到临时表,然后分成较小的表。 目前,我有一个显示页面,在 HTML 表格中显示所有这些信息。然而,有些部分需要有公式化的表示。换句话
我是一名优秀的程序员,十分优秀!