«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告

本站技术贴除标明为“原创”的之外,其余均为网上转载,文中我会尽量保留原作者姓名,若有侵权请与我联系,我将第一时间做出修改。谢谢!

             ——既瑜


天气预报(南京)


我的分类(专题)

首页(183)
【趣味文摘】(22)
【五子连珠】(13)
【技术文档】(136)
【电脑技术】(6)
【疑难问题】(1)
【我的心情】(5)


最新日志
花语(中英文对照版)
各种花的花语
NTFS格式的7个精彩问答(pconli
童言无忌,有趣得一蹋
给MM修电脑的三个步骤[转载]
J2EE 面试题综合
JAVA编程规则
[转] P2P之UDP穿透NAT的原理与
[转]词法分析器
文件加密技术
一个让人发狂的PI求解C程序
[转]直线生成算法之DDA
[转]利用内核对象----互斥量实现应用
[转]如何正确的计算文件收发进度
双机调试VC程序
[转]分治法优化大整数乘法 C++实现
浮点数值的内存结构
[转]双链表实现大整数的加法与乘法[VC
拜占廷将军问题[转]
某人的挂QQ的程序源代码,虽然没用了,拿

最新回复
回复:vc中的CString的操作
回复:[转]分治法优化大整数乘法 C++
回复:[转]分治法优化大整数乘法 C++
回复:花语(中英文对照版)
回复:基本排序算法比较与选择[转载]
回复:c++中强制类型转换操作符小结
回复:c++中强制类型转换操作符小结
何必那么执着于是大头猫还是愤怒的小鸟,淡
回复:浮点数值的内存结构
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:32位位图到24位位图的转换
dren, ages 16 and 20
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:各种花的花语

留言板
签写新留言

不是0-1背包喔
桂花的花语``
谢谢
提议
提议

统计
blog名称:★既瑜★
日志总数:183
评论数量:636
留言数量:-25
访问次数:1406072
建立时间:2005年3月12日

链接


http://www.nju.edu.cn
http://bbs.nju.edu.cn 
http://www.t7-online.com
http://www.csdn.net
http://www.91f.net
http://www.crsky.com
我的MSN BLOG 

联系我

  OICQ:215768265
  njucs2001@hotmail.com
  erichoo1982@gmail.com

 

W3CHINA Blog首页    管理页面    写新日志    退出


[【技术文档】]微软面试题之数字谜题 (starfish)
既瑜(224499) 发表于 2005/4/15 20:13:31

设有两个自然数m,n,2〈=m<=99。 S先生知道这两数的和s,P先生知道这两数的积p。他们两人进行了如下的对话:S:我知道你不知道这两个数是什么,但我也不知道。P:现在我知道这两个数了。S:现在我也知道这两个数了。由这些条件,试确定m,n。 因为S知道两数之和,却由此推断P不知道两个数,所以说两数之和s一定不能拆分成两个素数的和,即m,n不可能都是素数,且m,n中不会有大于50的素数,否则的话m*n可以唯一分解,P知道了m,n的积就一定可以知道m,n了。 P从S的言语中能够判断出的信息是:1。m,n不会全是素数;2。m,n中不会有大于50的素数;3。m,n之和不能拆成两个素数的和;4。因为S自己也不知道这两个数是什么,所以这两个数的和一定小于99+98,否则S就可以知道这两个数是什么了。 满足以上条件的 s=m+n有以下的可能: 111723272935374147196 然后P根据自己掌握的p=m*n立即算出m,n,这说明p=m*n是具有以下性质的特殊数字: 根据这个特殊的p,当s取上面的那些值的时候,只有一种s的取值使得方程m+n=s,m*n=p在[2,99]内有唯一的整数解。 根据这个性质计算出的p有以下的情况(不妨设m<=n): p = 18, s= 11, m = 2, n = 9p = 24, s= 11, m = 3, n = 8p = 28, s= 11, m = 4, n = 7p = 50, s= 27, m = 2, n = 25p = 52, s= 17, m = 4, n = 13p = 54, s= 29, m = 2, n = 27p = 76, s= 23, m = 4, n = 19p = 92, s= 27, m = 4, n = 23p = 96, s= 35, m = 3, n = 32p = 100, s= 29, m = 4, n = 25p = 110, s= 27, m = 5, n = 22p = 112, s= 23, m = 7, n = 16p = 114, s= 41, m = 3, n = 38p = 124, s= 35, m = 4, n = 31p = 130, s= 23, m = 10, n = 13p = 138, s= 29, m = 6, n = 23p = 140, s= 27, m = 7, n = 20p = 148, s= 41, m = 4, n = 37p = 150, s= 35, m = 5, n = 30p = 152, s= 27, m = 8, n = 19p = 154, s= 29, m = 7, n = 22p = 160, s= 37, m = 5, n = 32p = 162, s= 27, m = 9, n = 18p = 168, s= 29, m = 8, n = 21p = 170, s= 27, m = 10, n = 17p = 172, s= 47, m = 4, n = 43p = 174, s= 35, m = 6, n = 29p = 176, s= 27, m = 11, n = 16p = 182, s= 27, m = 13, n = 14p = 186, s= 37, m = 6, n = 31p = 190, s= 29, m = 10, n = 19p = 196, s= 35, m = 7, n = 28p = 198, s= 29, m = 11, n = 18p = 204, s= 29, m = 12, n = 17p = 208, s= 29, m = 13, n = 16p = 216, s= 35, m = 8, n = 27p = 232, s= 37, m = 8, n = 29p = 234, s= 35, m = 9, n = 26p = 238, s= 41, m = 7, n = 34p = 246, s= 47, m = 6, n = 41p = 250, s= 35, m = 10, n = 25p = 252, s= 37, m = 9, n = 28p = 270, s= 37, m = 10, n = 27p = 276, s= 35, m = 12, n = 23p = 280, s= 47, m = 7, n = 40p = 288, s= 41, m = 9, n = 32p = 294, s= 35, m = 14, n = 21p = 304, s= 35, m = 16, n = 19p = 306, s= 35, m = 17, n = 18p = 310, s= 41, m = 10, n = 31p = 322, s= 37, m = 14, n = 23p = 336, s= 37, m = 16, n = 21p = 340, s= 37, m = 17, n = 20p = 348, s= 41, m = 12, n = 29p = 364, s= 41, m = 13, n = 28p = 370, s= 47, m = 10, n = 37p = 378, s= 41, m = 14, n = 27p = 390, s= 41, m = 15, n = 26p = 396, s= 47, m = 11, n = 36p = 400, s= 41, m = 16, n = 25p = 408, s= 41, m = 17, n = 24p = 414, s= 41, m = 18, n = 23p = 418, s= 41, m = 19, n = 22p = 442, s= 47, m = 13, n = 34p = 462, s= 47, m = 14, n = 33p = 480, s= 47, m = 15, n = 32p = 496, s= 47, m = 16, n = 31p = 510, s= 47, m = 17, n = 30p = 522, s= 47, m = 18, n = 29p = 532, s= 47, m = 19, n = 28p = 540, s= 47, m = 20, n = 27p = 546, s= 47, m = 21, n = 26p = 550, s= 47, m = 22, n = 25p = 552, s= 47, m = 23, n = 24p = 9604, s= 196, m = 98, n = 98 最后P说出自己已经知道m,n以后,S也说自己知道了m,n,这说明S根据自己手中的两数之和可以推断出唯一的m,n来。 因此还要去除上面的情况中重复用到s的情况,得到下面的情况:p = 52, s = 17, m = 4, n = 13p = 9604, s = 196, m = 98, n = 98 如果规定了m<>n,则最后的解答就是 m=4 , n=13 下面是程序: #include <iostream.h>#include <fstream.h>#include <string.h> const int MAX_N = 99;const char* OUTPUT_FILE = "result.txt"; int s[MAX_N*2];int p[MAX_N*MAX_N];int prim[MAX_N];int primCounter =0; ofstream fout( OUTPUT_FILE ); // 计算素数void calPrim(){ bool used[MAX_N]; int i, p=2; bool found = true;  prim[primCounter++] = 2; memset( used, false, sizeof( used ) );  while( found ) {  for( i = p; i < MAX_N; i++ )   if( i % p == 0 )    used[i] = true;         found = false;   for( i = p; i < MAX_N; i++ )   if( ! used[i] ) {    p = i;    prim[primCounter++] = p;    found = true;    break;   } }} // 根据条件1过滤void useCon_1(){ int i,j; memset(s, 0, sizeof(s));   for( i = 0; i < 4; i++ ) s[i] =-1;  calPrim();  // S可以肯定P不知道这两个数是什么  for( i = 0; i < primCounter; i++ )   for( j = i; j < primCounter; j++ ) {   if( prim[i] + prim[j] < MAX_N * 2 )     s[ prim[i] + prim[j] ] = -1;  }  for( i = 0; i < primCounter; i++ )   if( prim[i] > MAX_N / 2 ) break;  for( i--; i < primCounter; i++ )   for( j = 2; j < MAX_N; j++ )    s[ prim[i] + j ] = -1;  // 因为S自己也不知道这两个数是什么 for( i = 98 + 99; i < MAX_N + MAX_N; i++ )  s[i] = -1;  fout << "满足S第一句话的两数之和" << endl; for( i = 0; i < MAX_N * 2; i++ )  if( s[i] == 0 )    fout << i << endl;} // 根据条件2过滤void useCon_2(){ int i, m, n; memset( p, 0, sizeof( p ) );  for( m = 2; m < MAX_N; m++ )  for( n = 2; n < MAX_N; n++ ) {   if( s[m+n] >= 0 ) {    p[m*n]++;   }  }  fout << "满足P第一句话的两数之积:" << endl;  for( i = 0; i < MAX_N * MAX_N; i++ )  if( p[i] == 1 || p[i] == 2 ) {   for( m = 2; m < MAX_N; m++ )    for( n = m; n < MAX_N; n++ )      if( m * n == i && s[m + n] >= 0 ) {      fout << "p = " << i       << ", s= " << m + n        << ", m = " << m       << ", n = " << n << endl;      s[m+n]++;     }     } } void useCon_3(){ int i, m, n; fout << "满足S第二句话的结果:" << endl;  for( i = 0; i < MAX_N * MAX_N; i++ )  if( p[i] == 1 || p[i] == 2 ) {   for( m = 2; m < MAX_N; m++ )    for( n = m; n < MAX_N; n++ )      if( m * n == i && s[m + n] == 1 ) {      fout << "p = " << i       << ", s = " << m + n       << ", m = " << m       << ", n = " << n << endl;     }     }} void main(){  useCon_1(); useCon_2(); useCon_3(); }

阅读全文(2608) | 回复(1) | 编辑 | 精华

回复:微软面试题之数字谜题 (starfish)
红糖蓝盐(游客)发表评论于2009/7/12 15:53:37

m=4 ,n=1 也是个答案

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.219 second(s), page refreshed 144757212 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号