今天去华为赛门铁克面试被提到的一个问题(JAVA)

majia518 2011-06-11 08:32:48
String str = "5673454322...............323223";
str是一个无穷大的数字,一个long都无法放入,假设一个n值是7。
面试官提问:如何使得这个数字可以被n整除???
...全文
2929 107 打赏 收藏 转发到动态 举报
写回复
用AI写文章
107 条回复
切换为时间正序
请发表友善的回复…
发表回复
剑客2 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 fkyq01 的回复:]

引用 21 楼 litaoye 的回复:
从高位开始逐个读入字符串,然后mod 7,记录余数,读到下一位时将余数*10+当前的值,继续mod 7,记录余数......

String str = "5673454322...............323223";
一下为余数部分
5 0 0 3 6 2 3 6 0 2 1......


这方法不错,容易理解。
Java co……

[/Quote]
+1,我喜欢这个
sixifeng5858 2011-08-29
  • 打赏
  • 举报
回复
package com.sxf;

public class ModTest {

/**
* @param args
*/
public long modCompute(String s,int n){
int len= Integer.toString(n).length();
long remainder = 0;

for(int i = 0;i<s.length();i =i + len){
String stemp =null;
if ( i + len < s.length()){
stemp = s.substring(i, i + len);
}else{
stemp = s.substring(i);
}
remainder =( remainder *Math.round(( Math.pow(10,len))) +Long.parseLong(stemp)) %n;
}
return remainder;
}

public static void main(String[] args) {
// TODO Auto-generated method stub
ModTest t = new ModTest();
System.out.print(t.modCompute("10112154546456454687978979879797979787545457876245487848787875454", 7));

}

}
sixifeng5858 2011-08-29
  • 打赏
  • 举报
回复
package com.sxf;

public class ModTest {

/**
* @param args
*/
public long modCompute(String s,int n){
int len= Integer.toString(n).length();
long remainder = 0;

for(int i = 0;i<s.length();i =i + len){
String stemp =null;
if ( i + len < s.length()){
stemp = s.substring(i, i + len);
}else{
stemp = s.substring(i);
}
remainder =( remainder *Math.round(( Math.pow(10,len))) +Long.parseLong(stemp)) %n;
}
return remainder;
}

public static void main(String[] args) {
// TODO Auto-generated method stub
ModTest t = new ModTest();
System.out.print(t.modCompute("10112154546456454687978979879797979787545457876245487848787875454", 7));

}

}
袁莱 2011-08-29
  • 打赏
  • 举报
回复
ublic class Test {  

/**
* 求一个由数字组成的任意长度的字符串能否被N整除
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "54354358093245892583457839730957349857394857367935384895";
int n= 7;
checkModN(str, n);

}
private static void checkModN(String str, int n) {
String temp = str;
int e = 0;
for(int i=0;i<temp.length();i++) {
int h = Integer.parseInt(temp.substring(i,i+1));
e = (e*10 + h)%n;
}
System.out.println("e = "+ e);
if(0==e) {
System.out.println("This number can be mod by "+n);
}else {
System.out.println("This number cann't be mod by "+n);
System.out.println("You can add "+(n-e)+" or sub "+ e);
}
}
}
leonhd 2011-08-28
  • 打赏
  • 举报
回复
还有一种做法:
nt divider = 7;
char * str = "103942034203948029384029384029348";
int str_len = strlen(str);

int remainder = 0;
int unit_remainder = 1;
for (int i = str_len - 1; i > -1; --i)
{
remainder += str[i] * unit_remainder;
remainder %= divider;

unit_remainder *= 10;
unit_remainder %= divider;
}

if (remainder == 0)
printf("can be divided\n");
leonhd 2011-08-28
  • 打赏
  • 举报
回复
不会Java,用C作一个吧

int divider = 7;
char * str = "103942034203948029384029384029348";
int remainder = 0;
int str_len = strlen(str);
for (int i = 0; i < str_len; ++i)
{
remainder *= 10;
remainder += str[i];
remainder %= divider;
}

if (remainder == 0)
printf("can be divided\n");
Firebirds 2011-08-28
  • 打赏
  • 举报
回复
果然思路才是王道啊。。
m安然 2011-08-28
  • 打赏
  • 举报
回复
	public static void main(String[] args) {

String str = "5673454322654648748998323211231231231231231231231231232145668127348612734128637423123";

int remainder = 0;

for (int i = 0; i < str.length(); i += 8) {
String temp;
if (i + 8 < str.length()) {
temp = str.substring(i, i + 8);
} else {
temp = str.substring(i);
}
remainder = Integer.parseInt(remainder + temp) % 7;
}

System.out.println(str);
System.out.println("除以7的余数为" + remainder);

}
Jan丶X 2011-08-26
  • 打赏
  • 举报
回复
题目都没读懂的光速飞过~~
clementxr 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 litaoye 的回复:]

从高位开始逐个读入字符串,然后mod 7,记录余数,读到下一位时将余数*10+当前的值,继续mod 7,记录余数......

String str = "5673454322...............323223";
一下为余数部分
5 0 0 3 6 2 3 6 0 2 1......
[/Quote]

String s = "13566413132641313134154631313454645654456513546496";
int n = 7;
int tmp = 0;
for(int i = 0; i < s.length(); i++){

tmp = (tmp * 10 + Integer.parseInt(s.substring(i, i + 1))) % n;
}
System.out.println("余数为:" + tmp);
淡定的峰哥 2011-08-26
  • 打赏
  • 举报
回复
这个问题很简单的嘛,思想跟上面的童鞋一样,但不用一位一位的去循环

public class BigMode {
public static void main(String[] args) {
String s = "123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789839999999999999999999999456789032512847890120347141049814708971625489371245379999994729748743945389024808078";
int j = 0;
int k = 0;
while (true) {
if (s.length() > 9) {
int i = Integer.parseInt(s.substring(0, 9));
s = s.substring(9);//此处9位表示最大可以是9亿,因为int最大是20多亿,如果用long,可以再长点
j = i % 7;
if (j != 0) {
s = j + s;
}
} else {
int i = Integer.parseInt(s);
j = i % 7;
break;
}
}
System.out.println("s是否能被7整除" + (j == 0)+",余数:"+j);
}
}

hadisi_20 2011-08-26
  • 打赏
  • 举报
回复
又学会新的东西了,呵呵
paneyjiang 2011-08-26
  • 打赏
  • 举报
回复
大家去看看大胡子发的文章吧,这个有说明
singlark 2011-08-26
  • 打赏
  • 举报
回复
题本身就不严谨,什么叫如何使得,我把数改了不就使得了么。
奥数那些破题,当代数学界都毫不感兴趣的一些代数技巧三角函数翻来覆去的整,有毛病。人家中学生都深刻掌握微积分思想了,咱们大学生大部分连续性一致连续性都讲不清吧。
dalianwang74 2011-08-25
  • 打赏
  • 举报
回复
研究同余定理中 。。
不二Se 2011-08-25
  • 打赏
  • 举报
回复
用一个数组去装这个数的每一个元素,用最后两位去减一个两位数(7的倍数),目的是最后一位是0,比如140是7倍数,14肯定也是7倍数,如果减的结果小于0的话,加个70,依次类推,就可以判断是不是7的倍数
da1da2_2011 2011-08-25
  • 打赏
  • 举报
回复
唉,学习了,自己还是差的好远
hq333 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 87 楼 chw_csdn_chw 的回复:]
不管字符串长度是多少,每次至多取出前两位进行mod 7,因此也不用什么biginteger,用个short都足够了。

算法的时间 N次mod 7 运算, N=字符串长度。
刚开始被误导了,寻思了半天。大家都想复杂了。
再试一个:4127200
4127200
627200
67200
4200
000 ==0 特殊情况就不再举例,重点突出解决问题的思路。[/Quote]
这个易理解,就是做竖式除法的算法,自然简单。
yan465942872 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 fkyq01 的回复:]

引用 21 楼 litaoye 的回复:
从高位开始逐个读入字符串,然后mod 7,记录余数,读到下一位时将余数*10+当前的值,继续mod 7,记录余数......

String str = "5673454322...............323223";
一下为余数部分
5 0 0 3 6 2 3 6 0 2 1......


这方法不错,容易理解。
Java co……
[/Quote]

这个方法不对吧,如果我的数每个位置上的数都比7小那就死循环去吧,例如:12121212121212132323232323223323232……3434
qybao 2011-08-25
  • 打赏
  • 举报
回复
求余规律
(a*b)%c = (a*(b%c))%c = ((a%c)*(b%c))%c
(a+b)%c = (a%c + b%c)%c
一个数,可以写成 a*10^n + b (其中b是n位数)
比如2位数 52 = 5*10 + 2; (n=1)
3位数 572 = 5*100 + 72 (n=2) = 57*10 + 2 (n=1)
4位数 5872 = 5*1000 + 873 (n=3) = 58*100 + 72 (n=2) = 587*10 + 2 (n=1)

所以,利用上面的定理,可以得到
(a*10^n + b)%c
= ((a*10^n)%c + b%c)%c
= (((a%c)*10^n)%c + b%c)%c

如果一个数,从左到右来取,那么把 a%c 看作第一次取数求余的结果,那么完整的结果就是下一次求余结果
于是可得
result = ((result%c)*10^n + b%c)%c

public int Mod(String data, int num) { //data是任意长度的字符串
int result = 0;
for (char c : data.toCharArray()) { //这里是按一位一位取,也可以用substring按多位取,转为int或long范围内的数据计算
result = ((result%num)*10 + ((int)(c-'0'))%num) % num;
}
return result;
}

如果一个数,从右往左取,那么把 b%c 看作第一次取数求余的结果,,那么完整的结果就是下一次求余结果
于是可得
result = ((a%c)*10^n + result)%c

public int Mod(String data, int num) { //data是任意长度的字符串
int result = 0;
char[] ca = data.toCharArray();
for (int i=ca.length-1; i>=0; i--) {
result = ((((int)(c[i]-'0'))%num)*10 + result%num) % num;
}
return result;
}
加载更多回复(86)

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧