这个题目很麻烦,楼主的做法一上来就是错的。 你的value是int类型,在win32环境下,一个int能表示的最大的数只有21亿,用十进制表示就是一个十位数。 也就是说在你的for循环里,当i>10以后,就会数据溢出。所以这么找,肯定找不到正确答案。 我的思路是这样:首先把2013分解质因数:2013=3*11*61。 也就是说我们的目标结果,必须同时是3、11、61这三个质数的整数倍。 (1)要保证是3的整数倍,需要结果的数位数是3的整倍数。 (2)要保证是11的整数倍,需要结果的数位数是2的整倍数。 综合(1)、(2)两点,我们需要结果数位数是6的整倍数。 接下来也是最复杂的,我们需要找到多少个由1组成的数,才能是61的整倍数。 前面说过,int最大能表示到21亿,我用计算器算了下,在这个范围内还是没有找到由1组成且为61的整倍数的数。我们还需要做一些数学运算。 我们假设a除以x商的整数部分是m,余数是n(a、x、m、n都是正整数,且n<x) b除以x商的整数部分是k,余数是l(b、k、l都是正整数,且l<x) 那么a=mx+n,b=kx+l。 (a+b) mod x (mod表示取余运算,相当于C++的%) =[(m+k)x+(n+l)] mod x =(n+l) mod x (因为(m+k)x这一项包含因子x,所以如果产生余数也只是(n+l) mod x 这一项出现余数) 同理(a·b) mod x = (n·l) mod x。 所以我们可以得出两条结论: 两数之和(或乘积)对第三个数去余数,就是把前两个数对第三个数分别取余,然后把余数加和(或相乘)后再对第三个数取余数。 这个结论对于数据溢出的取余运算非常有帮助。 除此之外,解这个题目还需要用到抽屉定理:对于任意(n+1)个整数,其中必定存在至少两个,它们对n取余的结果是相同的(n是正整数)。 在我们这个题目里就是:对于1、11、111、1111、11111、......、111...11(62个1),这62个不相等的、且是由若干1组成的正整数、其中必定存在两个,对61取余数是结果相同的。那么这两个整数之差,必定是61的整倍数。 假设这两个整数分别是第i个和第j个(i>j)。 i个1 - j个1 = 1111...111000...00(i-j个1、j个0) =10^j * 111...111(i-j个1) 由于 ( i个1 - j个1 ) mod 61 = 0。 而10^j 不包含因子61,那么111...111(i-j个1)必定是61的整倍数。 而(0≤j<i≤62),所以写程序时候,只需要找62次就可以。 具体代码是这样的: int arr1[62] = { 0 }; /* arr1的第i项,表示10^i对61的余数。 即arr[0]=1%61 = 1; arr[1] = 10 % 61 = (arr[0] * 10) % 61 =10; arr[2] = 100 % 61 = (arr[1] * 10) % 61 =39; arr[3] = 1000 % 61 = (arr[2] * 10) % 61 = 24; ...后面的代码楼主自己写,总之大概就是这么个思路。 */ 接下来还需要第二个数组: int arr2[62] = { 0 }; /* arr2的第i项,表示111...111(i个1)^i对61的余数。 arr2[0] = 1 % 61 = (arr1[0]) % 61 = 1; arr2[1] = 11 % 61 = (arr1[0] + arr1[1]) % 61 = 11; arr2[2] = 111 % 61 = (arr1[0] + arr1[1] + arr1[2]) %61 = 50; arr2[3] = 1111 % 61 = (arr1[0] + arr1[1] + arr1[2] + arr1[3]) % 61 = 13; ...后面的代码楼主还是自己去写,逻辑也基本上就是这样了 */ 再然后,在arr2这个数组里找到任意两个相同的项就可以了。 arr2中相同项的下标之差个1,就是61的整倍数。 最后,别忘了这个题目要求算的结果:是2013的整倍数,而非61的整倍数。 之前说过,我们需要结果数位数是6的整倍数。所以算完了下标之差,还需要和6取一下最小公倍数,才是最后结果。 纯手打,求给分
33,311
社区成员
41,784
社区内容
加载中
试试用AI创作助手写篇文章吧