至尊问题「建议收藏」

称号:已知m、n为整数,且满足下列两个条件:① m、n∈1,2,…,K,(1≤K≤10^9)② (n^ 2-mn-m^2)^2=1编一程序,对给定K,求一组满足上述两个条件的m、n,而且使m^2+n^2的值最大。比如,若K=1995,则m=987,n=1597,则m、n满足条件,且可使m^2+n^2的值最大。输入输入仅一行,K的值。输出…

大家好,又见面了,我是你们的朋友全栈君。

称号:

已知m、n为整数,且满足下列两个条件:
① m、n∈1,2,…,K,(1≤K≤10^9)

② (n^ 2-mn-m^2)^2=1
编一程序,对给定K,求一组满足上述两个条件的m、n,而且使m^2+n^2的值最大。比如,若K=1995,则m=987,n=1597,则m、n满足条件,且可使m^2+n^2的值最大。

输入

输入仅一行,K的值。

输出

输出仅一行,m^2+n^2的值。

例子输入

1995

例子输出

3524578

题目字数不多。可是条件2看起来貌似有点复杂。但实际上。它也是个突破口;

由条件2:(n^ 2-mn-m^2)^2=1

故而:      (m^2 + mn- n^2)^2=1

继续化简:m^2+mn-n^2=(m+n)^2-mn-2n^2 

                                                =(m+n)^2-(m+n)n-n^2
即:          (n^2-mn-m^2)^2=[(m+n)^2-(m+n)n-n^2]^2

我们观察上述最后的等式,我们能够发现

n->m+n (第一个平方)

m->n,n->m+n(中间的因式)

m->n(第二个平方)

这时我们发现这是我们熟悉的斐波那契数列。这样。这一题的突破口非常明显了,m、n都是在K(包含K)之内的最大的两个满足斐波那契数列的数;

另外因为1≤K≤10^9可能m、n数字较大,即会发生数字超限,用两个数组进行平方运算以及相加运算。

#include <iostream>using namespace std;void Add(int *arrm, int *arrn, int len)  //大整数相加{    int *arr = new int[len + 1];    for(int i = 0; i < len + 1; i++)        arr[i] = 0;    for(int i = 0; i < len; i++)    {        arr[i] += arrm[i] + arrn[i];        if(arr[i] >= 10)  //进位        {            arr[i + 1] += arr[i] / 10;            arr[i] %= 10;        }    }    int index = len;    while(!arr[index])    {        index--;    }    for(int i = index; i >= 0; i--)        cout << arr[i];    cout << endl;}void Mul(int *arr, int *arr1, int len1)  //大整数相乘{    for(int i = 0; i < len1; i++)    {        for(int j = 0; j < len1; j++)        {            arr[i + j] += arr1[i] * arr1[j];            if(arr[i + j] >= 10)  //进位            {                arr[i + j + 1] += arr[i + j] / 10;                arr[i + j] %= 10;            }        }    }}void BigData(int m, int n){    int num1 = m;    int num2 = n;    int *arr1 = new int[10];    int *arr2 = new int[10];    int len1 = 0, len2 = 0;    while(num1)  //数字数组化    {        arr1[len1++] = num1 % 10;        num1 /= 10;    }    while(num2)    {        arr2[len2++] = num2 % 10;        num2 /= 10;    }    int len;    if(len1 > len2)        len = 2 * len1;    else        len = 2 * len2;    int *arrm = new int[len];    int *arrn = new int[len];    for(int i = 0; i < len; i++)    {        arrm[i] = 0;        arrn[i] = 0;    }    Mul(arrm, arr1, len1);  //大整数相乘    Mul(arrn, arr2, len2);    Add(arrm, arrn, len);  //相加}void Fibo(int K){    if(K < 1)        return;    if(K == 1)    {        cout << 2 << endl;        return;    }    int m = 1, n = 1;    int p = m + n;    while(p <= K)  //寻找满足条件的两个Fibonacci数    {        m = n;        n = p;        p = m + n;    }    if(m < 10000 || n < 10000)        cout << m * m + n * n << endl;    else        BigData(m, n);}int main(){    int K;    cin >> K;    Fibo(K);    return 0;}

至尊问题「建议收藏」

O(∩_∩)O欢迎不吝赐教….

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/129191.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 字面量(笑笑语法)

    字面量(笑笑语法)

    2022年1月23日
    42
  • pycharm安装教程-pycharm安装详细步骤(Mac版)

    pycharm安装教程-pycharm安装详细步骤(Mac版)上期跟大家讲了怎么安装Python,这期跟大家介绍个很好用的编程工具–pycharm。PyCharm是一种PythonIDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。Pycharm分为专业版(Professional)和社区版(Community),专业版功能非常全,需要购买,可以试用,对比之下社区版功能有限,可以免费使用,并且开源。如果大家只是不需要做特别复杂的项目,下载社区版就足够

    2022年8月25日
    7
  • JavaScript将数组拼接成一个字符串[通俗易懂]

    JavaScript将数组拼接成一个字符串[通俗易懂]将数组拼接成字符串,在JavaScript中,有两种方式。一种是Array对象提供的join()方法,另一种是Array对象提供的toString()方法。下面分别来介绍:join()定义和用法:join()方法用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的。用法:把数组中的所有元素放入一个字符串,默认以逗号分隔vararr=[‘sun’,’moon’,’start’]console.log(arr.join())//’sun,moon,start’

    2022年5月3日
    201
  • 机器学习之文本分类(附带训练集+数据集+所有代码)

    机器学习之文本分类(附带训练集+数据集+所有代码)我本次对4类文本进行分类((所有截图代码和数据集最后附带免费下载地址))主要步骤:1.各种读文件,写文件2.使用jieba分词将中文文本切割3.对处理之后的文本开始用TF-IDF算法进行单词权值的计算4.去掉停用词5.贝叶斯预测种类文本预处理:除去噪声,如:格式转换,去掉符号,整体规范化遍历的读取一个文件下的每个文本中文分词…

    2022年6月2日
    24
  • 视频下载插件–Video Downloader for Chrome「建议收藏」

    视频下载插件–Video Downloader for Chrome「建议收藏」视频下载插件–VideoDownloaderforChromeVideoDownloaderforChrome的介绍VideoDownloaderforChrome的功能介绍VideoDownloaderforChrome的用法摘要:我想每一个小可爱在视频网站上在下载视频的时候,都会为了消除缓冲视频或者等待视频时的广告而感到烦恼。所以今天小编为大家带来一款非常好用的chrome视频下载插件–VideoDownloaderforChrome。VideoDownloade

    2022年7月14日
    29
  • 时间复杂度 计算_一个算法的时间复杂度为

    时间复杂度 计算_一个算法的时间复杂度为时间复杂度分析、计算时间复杂度的速度

    2025年7月5日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号