c++-求7的整数倍和(大数算法)

问题描述

求7的整数倍和(大数算法) 3C
求(1-10^18)内的整数,满足各位数字之和为7的整数倍的所有数的和,例如:25,86,106,1115各位相加都是7的整数倍。要求:1-2秒内完成

解决方案

你想高效的解决办法,就先贴出你写的认为不高效的代码,然后让大家帮你优化下

解决方案二:
我问了下大师,亚洲算法大赛银奖获得者,他说不可能办得到,你不用想了 楼主!

解决方案三:
你把每一位数取余相加就可以了。

解决方案四:
这个问题用string去接收,然后遍历,相加除7(相加一定要是BigInteger类型)!也没有什么办法优化了,因为至少要遍历一遍

解决方案五:
错了是找出所有啊!!等等我想想

解决方案六:
7,16,25,34,43,52,61,70,77,86。。。。这些数可能存在什么规律

解决方案七:
也就是7进制嘛。
找一个进位制转化的工具方法然后做一个7进制数生成器生成的值得规律是
解决方案八:

发现了一个误区,10^18这么大一个数的循环,至少也得循环10^18/7次,因为会有这么多数字满足条件,因此,1.2秒内不完成不了的,你觉得呢

解决方案九:
裴波那契数列递推公式:F(n+2) = F(n+1) + F(n)
F(1)=F(2)=1.
它的通项求解如下:
F(n+2) = F(n+1) + F(n) => F(n+2) - F(n+1) - F(n) = 0
令 F(n+2) - aF(n+1) = b(F(n+1) - aF(n))
展开 F(n+2) - (a+b)F(n+1) + abF(n) = 0
显然 a+b=1 ab=-1
由韦达定理知 a、b为二次方程 x^2 - x - 1 = 0 的两个根
解得 a = (1 + √5)/2b = (1 -√5)/2 或 a = (1 -√5)/2b = (1 + √5)/2
令G(n) = F(n+1) - aF(n)则G(n+1) = bG(n)且G(1) = F(2) - aF(1) = 1 - a = b因此G(n)为等比数列G(n) = b^n 即
F(n+1) - aF(n) = G(n) = b^n --------(1)
在(1)式中分别将上述 a b的两组解代入由于对称性不妨设x = (1 + √5)/2y = (1 -√5)/2得到:
F(n+1) - xF(n) = y^n
F(n+1) - yF(n) = x^n
以上两式相减得:
(x-y)F(n) = x^n - y^n
F(n) = (x^n - y^n)/(x-y) = {[(1+√5)/2]^n-[(1-√5)/2]^n}/√5

解决方案十:
(1-10^18)之间的10^18,各位相加是1,肯定不是,那就是 17位,用字符串输入,一位的只有7,
剩下的就是2-17位的,第一位是1-92-17位是0-9,前面的i-1为都是可以取任何组合,
然后把前面的i-1位加起来,取余7,只有最后一位需要判断一下。
如果刚刚求得的余数是0,则最后一位是0或7;
如果刚刚求得的余数是1234,则最后一位是7减去所求余数;
如果刚刚求得的余数是56,则最后一位是7或14减去所求余数;

时间: 2024-11-02 04:10:54

c++-求7的整数倍和(大数算法)的相关文章

大整数四则运算-求java大整数的四则运算解题思路,把具体用什么知识点讲解出来

问题描述 求java大整数的四则运算解题思路,把具体用什么知识点讲解出来 package org.suanfa.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Test1 { private boolean isPositive=true; private String number="0"; public Te

C#图片处理之:旋转图片90度的整数倍

原文:C#图片处理之:旋转图片90度的整数倍   旋转图片90的整数倍那真是太简单了.         public static Bitmap KiRotate90(Bitmap img)        ...{            try            ...{                                img.RotateFlip(RotateFlipType.Rotate90FlipNone);                return img;     

c++-编写程序,求两个整数集合的并集。。。

问题描述 编写程序,求两个整数集合的并集... 编写程序,求两个整数集合的并集...能不能把下面这个修改一下??如果可以,再写一个完整的程序也可以 解决方案 这是按照你的思路写的(假设a b两个数组内没有重复的数字) #include <iostream> #include <stdlib.h> using namespace std; void arrunion(int a[], int b[], int r[], int an, int bn, int * n) { *n =

《剑指offer》写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

弱菜刷题还是刷中文题好了,没必要和英文过不去,现在的重点是基本代码能力的恢复. [题目] 剑指offer 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 直觉想到用二进制的位运算.最后写出来是一个迭代的过程. 每次迭代先计算x和y的和但不处理进位,那么相当于做异或,得到res1 然后处理进位问题,相当于计算与运算,得到res2 那么res2左移1位,再加到res1上,则整个运算的最终结果转化为res1+(res2<<1) 因为res2做左移,总会减小到

要求时间复杂度为O(n)的求两个位置之间最大值的算法

问题描述 要求时间复杂度为O(n)的求两个位置之间最大值的算法 把一串数(32位int型)放到Num中,求begin和end位置使得begin与end之间的是数字和最大,要求时间复杂度是O(n). 注:不可以先排序,这串数字的位置不能改变. 最好有源码,思路也可以. 解决方案 #include #include int getmax(int first, int second) { return first > second ? first : second; } int main() { in

java求一个如何切分多个时间段算法

问题描述 java求一个如何切分多个时间段算法 例如现在有时间 5.13-10.1 5.3-6.1 6.1-6.2 怎么能变成 5.3-5.13 5.13-6.1 6.1-6.2 解决方案 先按照 杠 把所有日期拆分出来,然后按照你的规则排序,然后从第二个开始,到倒数第二个,每个和它前面及后面的组成一组

求Single-pass聚类算法和K-means聚类算法源码!

问题描述 求Single-pass聚类算法和K-means聚类算法源码! 本人最近在学习舆情热点分析,能力有限,刚起步,求Single-pass聚类算法和K-means聚类算法源码!最好是Java写的,万分感谢! 解决方案 我也是在找single-pass的源码,楼主找到了吗?K-means算法在Weka-3-7weka-srcsrcmainjavawekaclusterersSimpleKMeans中有实现,可以看看 解决方案二: 没有找到single-pass,同求!

求一个类似Excel单元格计算算法

问题描述 求一个类似Excel单元格计算算法,请大家帮帮忙.给加分 解决方案 解决方案二:求一个类似Excel单元格计算算法,请大家帮帮忙.给加分解决方案三: 解决方案四:二维数组实现解决方案五:用一个二维数组,或者一个泛型列表,泛型列表中每一个元素为一行,元素中的每一个属性为一个单元格这样就简化了,变成数组的算法及列表的算法解决方案六:课程表模式...解决方案七:建议你使用ComponentOneStudio.NET控件

link中对整数压缩加密的算法怎么实现呢,要求能够尽可能高效实用

问题描述 link中对整数压缩加密的算法怎么实现呢,要求能够尽可能高效实用 link中对整数压缩加密的算法怎么实现呢,要求能够尽可能高效实用 解决方案 任何压缩算法都是基于这样一种原理:原始数据的各种编码出现的概率不是相等的,用短码表示高频数据,用长码表示低频数据,虽然整体编码没有缩短,但是在实际中它的长度变短了,这就是压缩的原理.