您的位置:首页 > 其它

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

2013-11-09 16:04 232 查看
题目:标题:买不到的数目

    小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。

    小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。

    你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。

    本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

输入:

两个正整数,表示每种包装中糖的颗数(都不多于1000)

要求输出:

一个正整数,表示最大不能买到的糖数

不需要考虑无解的情况

例如:

用户输入:

4 7

程序应该输出:

17

再例如:

用户输入:

3 5

程序应该输出:

7

资源约定:

峰值内存消耗 < 64M

CPU消耗  < 3000ms



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



注意事项: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: