2013-11-09 实验之买不到的糖果数目(递推思维+思维逻辑题)

来源:互联网 发布:时时彩组号软件 编辑:程序博客网 时间:2024/05/17 03:06

题目:标题:买不到的数目
    小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
    小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
    你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
    本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入:
两个正整数,表示每种包装中糖的颗数(都不多于1000)
要求输出:
一个正整数,表示最大不能买到的糖数
不需要考虑无解的情况
例如:
用户输入:
4 7
程序应该输出:
17
再例如:
用户输入:
3 5
程序应该输出:
7
资源约定:
峰值内存消耗 < 64M
CPU消耗  < 3000ms


思想:递推法,找到最后一个不能表示的数,先依次找到前面的不能表示数,组成队列,然后依次递推,即加上表示的数的最大值,计算能表示的数至不能表示数+最大值的数,是不是都能表示数队列中可以表示,若都可表示,程序结束,否则再抽取不能表示数队列的最大数,再递推,重复上述操作。


注意事项:unsinged char 最大值为255,超过,就溢出;程序再选取极不合理值,会无法表示,比如6,8或6, 9等组合,我知道总能找到一个数不能表示,所以程序会溢出。


程序实现:

#include<stdlib.h>#include<stdio.h>unsigned int countLose = 0;unsigned int countWin= 0;unsigned int loseArray [4000];unsigned int winArray [4000];int  num1, num2;int flag = 1;int cheack_in_win_array(unsigned int x){unsigned int  i;for(i = 0; i  < countWin; i++){if(winArray[i] == x){return 1;}}return 0;}int cheack_in_lose_array(unsigned int x){unsigned int  i;for(i = 0; i  < countLose; i++){//printf("%d",loseArray[i] );if(loseArray[i] == x){//printf(" \nin lose %d\n",x);return 1;}}return 0;}void exec_check(unsigned int maxLose){unsigned int i;unsigned int maxWin  =0;//printf("\nvalue %d\n", maxLose);if(countWin > 0){maxWin = winArray[countWin -1];}//printf("last value %d\n", maxLose);//printf("last win %d\n", winArray[countWin -1]);//printf("last lose %d\n",loseArray[countLose - 1] );for(i = maxWin + 1; i  <= maxLose; i++){if(cheack_in_win_array(i - num1) ||cheack_in_win_array(i -num2) ){winArray[countWin++] = i;}else{ if(cheack_in_lose_array(i)==0){loseArray[countLose++] = i;flag = 1;//printf("lose %d\n", i); }}}}void search_max_value(){unsigned int i;for(i = 1; i < num1; i++){loseArray[countLose++] = i;} winArray[countWin++] = num1;for(i = num1+1; i < num2; i++){if(i % num1 ){loseArray[countLose++] = i;}else{winArray[countWin++] = i;}}winArray[countWin++] = num2;while(flag > 0){flag = 0;exec_check(loseArray[countLose -1] + num2);/*for(i = 0; i  < countLose; i++){printf("%d ", loseArray[i]);}printf("\n\n");for(i = 0; i  < countWin; i++){printf("%d ", winArray[i]);}printf("\n\n");printf("%d\n", x);*/}printf("%d\n", loseArray[countLose -1]);}int main(void){scanf("%d %d", &num1, &num2);if(num1 >  num2){unsigned int  t = num2;num2 = num1;num1 = t;}if(num2 == num1 ){printf("can not find\n");return 1;}if(num2 == 1 || num1 == 1){printf("all can translte\n");return 1;}search_max_value();return 0;}