每日一题(14)——找到符合要求的整数

问题描述:

任意给定一个正整数N,求一个最小的整数M(M>1),使得M*N的十进制结果只含有1和0;

问题解答:

1.穷举法

for( M=2; ; M++)

{

if ( hasOnlyZeroAndOne(M*N))

{ cout; break;}

}

一旦N较大,比如N=99,M=1122334455667789,M*N=111,111,111,111,111

 

2.问题转换:

原问题可以转化为:求一个只含有1与0正整数,能被N整除;

观察X的取值:1,10, 11, 100, 101, 110, 111,1000……

再引入一个变量 j=X%N, 直接遍历X,

 

通过一个队列存储值和余数j,当j出现过时,乘以10,乘以10加1,跟余数相同的前面那个数效果一样,所以可以不计算。

 

  1. #include <iostream>  
  2. #include <queue>  
  3. using namespace std;  
  4. struct QNode  
  5. {  
  6.     int v,r;//v is value, r is remainder  
  7.     QNode(int vv, int rr): v(vv), r(rr){}  
  8.     QNode():v(0),r(0){}  
  9. };  
  10.   
  11. int main()  
  12. {  
  13.     int N;  
  14.     while(cin>>N)  
  15.     {  
  16.         queue<QNode> q;  
  17.         q.push(QNode(1,1));  
  18.         while(!q.empty())  
  19.         {  
  20.             vector<bool> bN(N,false);  
  21.             int s = q.size();  
  22.             while(s--)  
  23.             {  
  24.                 QNode t = q.front();  
  25.                 if(t.r==0)  
  26.                 {  
  27.                     cout<<"N:"<<N<<"  M:"<<t.v/N<<"  n*m:"<<t.v<<endl;  
  28.                     goto ok;  
  29.                 }  
  30.                 q.pop();  
  31.                 if(!bN[t.r*10 % N])  
  32.                 {  
  33.                     bN[t.r*10 % N] = true;  
  34.                     q.push(QNode(t.v*10, t.r*10 % N));  
  35.                 }  
  36.                 if(!bN[(t.r*10+1)%N])  
  37.                 {  
  38.                     bN[(t.r*10+1)%N] = true;  
  39.                     q.push(QNode((t.v*10+1), (t.r*10+1) % N));  
  40.                 }  
  41.             }  
  42.         }  
  43.         ok:;  
  44.     }  
  45.     return 0;  
  46. }  


 

问题描述:

是否能从数组中迅速找出两个数字使得这两个数字的和为一个给定的数字Sum。

问题解答:

1.穷举;

O(n^2)

 

2.对于每个数字a[i], 查找Sum-a[i]是否在数组中,已经变为一个查找问题:

可以先排序(只需一次),然后二分,O(N*logN)

 

或者hash映射,查找另一个数字是否在数组中,time:O(1), space:O(n)

 

3.先排序 time:O(N*logN);(排序算法总结

令i=0,j=n-1,看a[i]+a[j]是否等于Sum;

若大于Sum,j往前移j--, 若小于Sum,i往后移i++.

 

扩展问题:

1.若是“三个数字”呢?

对于“三个数字”其实就是对于数组中的每个数字array[i]判断数组中的其他数字是否存在两个数字的和为sum-array[i],以此递归下去。

2.若找不到满足条件的一对数字,问怎样找到最优解?

2. 如果找不到结果,可以保存做差的结果,找出差值最小的解

 

总结:

不论原序列是有序还是无序,解决这类题有以下三种办法:

1二分(若无序,先排序后二分),时间复杂度总为O(n*logn),空间复杂度为O(1);

2扫描一遍X-S[i] 映射到一个数组或构造hash表,时间复杂度为O(n),空间复杂度为O(n);

3两个指针两端扫描(若无序,先排序后扫描),时间复杂度最后为:有序O(n),无序O(n*logn+n)=O(n*logn),空间复杂度都为O(1)。所以,要想达到时间O(N),空间O(1)的目标,除非原数组是有序的(指针扫描法),不然,当数组无序的话,就只能先排序,后指针扫描法或二分(时间n*logn,空间O(1)),或映射或hash(时间O(n),空间O(n))。时间或空间,必须牺牲一个,自个权衡吧。

 综上,若是数组有序的情况下,优先考虑两个指针两端扫描法,以达到最佳的时(ON)),空(O1))效应。否则,如果要排序的话,时间复杂度最快当然是只能达到N*logN,空间O1.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用循环来实现计算整数因子和的函。具体步骤如下: 1. 定义一个,接收一个整数作为参。 2. 初始化一个变量sum,用于存储因子和。 3. 使用for循环遍历1到该整数的所有可能因子。 4. 如果该整数能被当前遍历的整除,则将该加入sum中。 5. 循环结束后,返回sum。 示例代码如下: ```python def factor_sum(num): sum = for i in range(1, num+1): if num % i == : sum += i return sum ``` 调用该函,可以得到一个整数的因子和。例如: ```python print(factor_sum(12)) # 输出28,因为12的因子有1、2、3、4、6、12,它们的和为28。 ``` ### 回答2: 计算整数因子和是学上的一种基本运算,可以应用到很多领域。在编程中,实现计算整数因子和的简单函可以便于快速计算一个整数的所有因子之和,这在一些算法中比较常用。 要实现计算整数因子和的简单函需要先了解什么是因子。因子是指一个整数可以被另一个整数整除,而且余为零的整数,例如6的因子是1、2、3、6。如果要计算一个整数的因子和,就需要找出这个整数的所有因子,然后将它们加起来,最终得到结果。 下面是一个简单的Python函,实现计算整数因子和的功能: ``` def factor_sum(n): factors = [] for i in range(1, n+1): if n % i == 0: factors.append(i) return sum(factors) ``` 这个函接收一个整数n作为参,首先创建一个空列表factors用于存储所有的因子。然后使用for循环从1到n遍历,对于每个i,如果n能整除i,即n % i == 0,就把i加入factors列表中。最后使用sum函对factors列表进行求和,得到所有因子的和,返回结果。 例如,如果要计算100的因子和,可以调用这个函: ``` result = factor_sum(100) print(result) ``` 运行结果为:217 因为100的所有因子是1、2、4、5、10、20、25、50、100,它们的和为217。 以上是一个简单的实现方法,当然也可以使用其他更优化的算法进行计算。这种求和因子的方法可以自己动手写代码算一下100000以内的因子和,来检验自己的代码水平。 ### 回答3: 计算整数因子和是一个常见的学问题,因为有些应用需要分解整数并计算其因子的总和。例如,一个质因分解器需要计算一个整数的所有因子,以确定它是否为质。 实现一个计算整数因子和的简单函可以帮助我们解决这个问题。我们可以通过分解整数并计算它的因子来实现这个函。 首先,我们可以考虑使用循环来分解整数,从2开始依次尝试除去该的因子。如果一个能够被整除,则将其除以该因子,继续向下除,直到该不再能够被除尽为止。这样,我们就可以分解出该整数的因子。 然后,我们需要将这些因子相加,并返回它们的总和。对于一个n,它的因子总和S可以表示为: S = (1 + f1) + (1 + f2) + ... + (1 + fk), 其中f1, f2, ... fk是n的所有因子。 因此,我们可以用循环来计算每个因子,并将它们相加得到计算结果。 最终,我们可以将以上分解和相加方法封装到一个中,这样就可以方便地调用该函计算任意整数的因子总和了。对于一些特殊情况,例如输入的为负或0,我们可以根据具体情况进行错误处理,并返回相应的结果。 总之,实现一个计算整数因子和的简单函,可以帮助我们更好地理解和运用学知识,并解决实际问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值