在1~500这500个整数中,找出连续相加等于500的数?
2011-03-05 09:16
393 查看
昨天碰到有人问起一个题目:在1~500这500个整数中,找出连续相加等于500的数?
其实这是一道很简单的面试题。为什么有人偏偏不喜欢自己解决呢?我想,最重要的是很多人不喜欢动脑动手。得罪很多人了啊。呵呵。
简要分析:int[] X={1,2,i,…………499}
条件是:i+(i+1)+ ……+(i+k)=500 (1式)
运用等差数列求和公式:(k+1)*i+(k+1)*k/2=500 (2式)
其中i和k还有一个隐藏关系i*k<500 (3式)
于是很自然得到如下解法:
得出结果:
xi=8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32
xi=59;60;61;62;63;64;65;66
xi=98;99;100;101;102
eaglet提出,该算法性能不佳,参照他的算法,修改如下:
另外根据条件,
(k+1)k<2*maxInt,可以得出(k+1)(k+1)<2*maxInt (4式)
可以提出连续的最多整数为32,故也可以得如下算法:
其实这是一道很简单的面试题。为什么有人偏偏不喜欢自己解决呢?我想,最重要的是很多人不喜欢动脑动手。得罪很多人了啊。呵呵。
简要分析:int[] X={1,2,i,…………499}
条件是:i+(i+1)+ ……+(i+k)=500 (1式)
运用等差数列求和公式:(k+1)*i+(k+1)*k/2=500 (2式)
其中i和k还有一个隐藏关系i*k<500 (3式)
于是很自然得到如下解法:
private static void GetSomeInt(int maxInt) { for (int i = 1; i < (maxInt - 1); i++) { for (int k = 1; k < (maxInt / i); k++) { if (((k + 1) * i + k * (k + 1) / 2) == maxInt) { /*******************输出结果集*********************/ string result = "xi="; for (int s = 0; s < (k + 1); s++) { result += (i + s).ToString() + ";"; } result = result.TrimEnd(';'); Console.WriteLine(result); /************************************************/ } } } }
得出结果:
xi=8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32
xi=59;60;61;62;63;64;65;66
xi=98;99;100;101;102
eaglet提出,该算法性能不佳,参照他的算法,修改如下:
private static void GetSomeIntStep(int maxInt) { int num = 0; int fnum = 0;// Convert.ToInt32(System.Math.Sqrt(maxInt)); int tmp = maxInt - fnum * (fnum + 1) / 2; while ((tmp > 0)) { if (tmp % (fnum + 1) == 0)//源自((k+1) * i + k * (k + 1) / 2) == maxInt { /*******************输出结果集*********************/ string result = "xi="; int nn = tmp / (fnum + 1); for (int s = nn; s < (nn + (fnum + 1)); s++) { result += (s).ToString() + ";"; } result = result.TrimEnd(';'); Console.WriteLine(result); /************************************************/ num++; } fnum++; tmp = maxInt - fnum * (fnum + 1) / 2; } Console.WriteLine("循环次数:{0}", fnum.ToString()); }
另外根据条件,
(k+1)k<2*maxInt,可以得出(k+1)(k+1)<2*maxInt (4式)
可以提出连续的最多整数为32,故也可以得如下算法:
private static void GetSomeIntThird(int maxInt) { int num = 0; int maxnum = Convert.ToInt32(System.Math.Sqrt(2 * maxInt));//(k+1)平方<maxInt的2倍 for (int k = 1; k <= maxnum; k++) { int tmp = maxInt - k * (k + 1) / 2; if (tmp > 0 && tmp % (k+1) == 0)//源自((k+1) * x+ k * (k + 1) / 2) == maxInt { /*******************输出结果集*********************/ string result = "xi="; int x = tmp / (k+1); for (int s = x; s < (x + k+1); s++) { result += (s).ToString() + ";"; } result = result.TrimEnd(';'); Console.WriteLine(result); /************************************************/ } num++; } Console.WriteLine("循环次数:{0}", num.ToString()); }
相关文章推荐
- 在1~500这500个整数中,找出连续相加等于500的数?
- 找出500以内相加等于500的连续整数
- 对于任意正整数都可以找出至少一串连续奇数,它们的和等于该整数的立方。以下程序验证[2,20]之间的数满足这一性质。
- 两数之和:给定一个整数数组,找出其中两个数相加等于目标值
- Java算法给定一个整数数组,找出其中两个数相加等于目标值
- 找出一定范围内多个连续整数,使其立方之和恰好等于另一个整数的立方
- 一串连续奇数,它们的和等于该整数的立方。找出[2,20]之间的数满足这一性质。
- leetcode-java.T001_TwoSum 给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字
- 对于任意正整数都可以找出至少一串连续奇数,它们的和等于该整数的立方。以下程序验证[2,20]之间的数满足这一性质
- 对于任意正整数都可以找出至少一串连续奇数,它们的和等于该整数的立方
- 对于任意正整数都可以找出至少一串连续奇数,它们的和等于该整数的立方。以下程序验证[2,20]之间的数满足这一性质。
- 找出整数数组中两两相加等于key的整数对
- 迅速找出数组a中是否存在相加后等于整数x的两个元素
- Java算法给定一个整数数组,找出其中两个数相加等于目标值
- 对于任意正整数都可以找出至少一串连续奇数,它们的和等于该整数的立方。以下程序验证[2,20]之间的数满足这一性质。
- 对于任意正整数都可以找出至少一串连续奇数,它们的和等于该整数的立方,验证2-20是否满足。
- 对于任意正整数,都可以找出至少一串连续奇数,他们的和等于该整数的立方,验证【2,20】
- 输出100以内连续整数相加和等于100的所有组合数
- n个整数中找出连续m个数加和是最大Java版
- 华为机试题:输入一组大于等于0的整数,从小到大排序输出,输出有连续数时,只输出连续数的最小和最大值