解题思路:
在做这道题的时候我也是思考了很久,一直没有头绪,在查看了很多人的解法后,我觉得暴力求解最适合我,这里也将自己的理解分享给大家,我认为暴力求解是不走任何捷径的,从一开始依次去验证到末尾,直到得出答案(个人理解),在这个题中,它要求得是最大不能组合的数,对于这个最大,常规的想肯定是很难的,不然各位小伙伴也不会到解题区寻求思路,我就假设这个数在100000之内(范围足够大),后台测试数据中的最大不能组成值应该都在这个范围内,我定义一个数组a[101000],初值均为0,之所以多加1000,那是因为输入的两个数范围都不超过1000,所以在循环100000次中,a[i+m],a[i+n],(m,n为两个输入的数)才不会导致数组越界,以至于报错,输入的两个数m,n,最小的数以下的数都是不能都由m,n组合的,所以循环从i=最小的开始循环,由于m,n本身符合可以由他们组成,所以循环开始时,a[m]=a[n]=1,(1代表可以组成的数,0代表不能组成)在循环体中,如果a[i]==1,那么a[i+m]和a[i+n]也是可以由他们组合而成的,所以都为1,如果a[i]!=1,那就将i赋给不能合成的数imax,从最小输入数一直循环到100000,最后一次赋给imax的数,就是最大不能合成的数,输出即可。
图形:便于参考理解(图形借鉴他人)
参考代码:
#include<iostream> using namespace std; int main() { int m,n,imax,i,a[101000]={0}; cin>>m>>n; a[m]=a[n]=1; if(m>n) { i=m; m=n; n=i; } for(i=m;i<100000;i++) { if(a[i]==1) a[i+m]=a[i+n]=1; else imax=i; } cout<<imax<<endl; return 0; }
0.0分
29 人评分
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:541 |
简单的a+b (C语言代码)浏览:661 |
C语言程序设计教程(第三版)课后习题8.8 (C语言代码)浏览:672 |
完数 (C语言代码)浏览:757 |
用筛法求之N内的素数。 (C语言代码)浏览:595 |
杨辉三角 (C语言代码)浏览:734 |
A+B for Input-Output Practice (II) (C语言代码)浏览:622 |
简单的a+b (C语言代码)浏览:497 |
C语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:506 |
C语言程序设计教程(第三版)课后习题8.7 (C语言代码)浏览:538 |