解题思路:
注意事项:
参考代码:
#include<iostream> #include<algorithm> using namespace std; int check(int n,int c,int d) { while(n>0) //不能写成 while(n)(当n<0时也会成立) { if(n%c==0||n%d==0) return 1; if((n-c)%d==0||(n-d)%c==0) return 1; n-=c+d; } return 0; } int main() { int a,b; while(cin>>a>>b) { int c=min(a,b); int d=max(a,b); int ok=0,ans=0; for(int i=d;;i++) //虽然c和d之间的数目也有买不到的数目,但却不是最大的,故不用考虑 { if(ok==c) break; // ok表示可以连续买到的数目,c表示两包糖中较少的那包的糖的数目 // 如果连续 c个糖果数可以买到,那么之后的所有糖果数都可以买到 // 假设从糖果数i可以买到,且连续 c 个糖果数都可以买到,即i,i+1,i+2,i+3,...,i+c-1,都可以买到 // 那么糖果数为 i+c 就可以用 糖果数i 加上c 组合成,以此类推,i+c+1=(i+1)+c,... // 因此从糖果数 i及以后的数目都可以买到,故 i-1 买不到的最大数目 // 当然这里是有公式的:a,b为两个质数,则不能用a,b表示的最大的数为: a*b-(a+b) if(check(i,c,d)) { if(ok==0) { ans=i; } ok++; } else { ok=0; } } cout<<ans-1<<endl; } return 0; }
0.0分
83 人评分