枚举法应用实例

/*
题目:三色球问题
内容:一个口袋里放有12个球,已知其中3个是红的,3个是白的,6个是黑的,现在从中任取8个,问共有
多少种可能的颜色搭配?
作答者:小白杨
收获: 设8个球中红球为x1个,白球为x2个,则黑球为8-x1-x2。又已知12个球中有3个红球,3个白球,6
个黑球,因此x1的取值范围[0,3],x2的取值范围为[0,3],黑球的个数小于等于6,即8-x1-x2<=6. 
*/

#include 

int main()
{
	int x1,x2,x3,flag = 0;
	for(x1=0;x1<=3;x1++)
	{
		for(x2=0;x2<=3;x2++)
		{
			x3 = 8-x1-x2;
			if(x3<=6)
				flag++;
		}
	}
	printf("%d\n",flag);
	
	return 0;
}



/*
题目:出售金鱼(枚举法) 
内容: 小明将养的一缸金鱼分5次出售:第一次卖出全部的一半加1/2条;第二次卖出余下的三分之一加
1/3条;第3次卖出余下的四分之一加1/4条;第4次卖出余下的五分之一加1/5条;最后卖出余下的11条。
试编程求出原来鱼缸中共有多少条鱼。
作答者:小白杨
收获:依题意可知,金鱼是分5次出售的,每次卖出的方式都相同,因此可以用表达式将每次卖鱼后剩下的
条数计算出来。
由:
第1次卖出全部的一半加1/2条;
第2次卖出余下的三分之一加1/3条;
第3次卖出余下的四分之一加1/4条;
第4次卖出余下的五分之一加1/5条;
可推出:第j次卖出余下的(j+1)分之一加1/(j+1)条。 
假设第j次卖鱼前金鱼总数为x,则第j次卖鱼后鱼缸中还剩下金鱼的条数为:x-(x+1)/(j+1).
又由于“最后卖出余下的11条”,因此第4次卖鱼后鱼缸中剩下的金鱼条数为11条。因为金鱼只能整条进行
出售,因此x+1必然能够整除j+1.可以从23开始试探x的取值,由于x值必为奇数,因此步长取2. 
*/
#include 

int main()
{
	int i,j,x,flag = 0;
	
	for(i=23; flag==0; i+=2)
	{
		for(j=1,x=i;j<=4&&x>=11;j++)
		{
			if((x+1)%(j+1)==0)
				x -= (x+1)/(j+1);
			else
				break; 
		}
		if(j==5&&x==11)
		{
			printf("%d\n",i);
			flag = 1;
		}
			
	}
	
	return 0;
	
 } 


/*
题目:求车速
内容:
作答者:
收获: 优化:将一位5位数存入一个数组
      
*/

#include 

int main()
{
	double v;
	long x = 95860,k=100000;
	int t,a[5] = {0};
	
	while(x<100000)
	{
		/*a[0] = x/10000;
		a[1] = (x%10000)/1000;
		a[2] = ((x%10000)%1000)/100;
		a[3] = (((x%10000)%1000)%100)/10;
		a[4] = (((x%10000)%1000)%100)%10;*/
		for(t=0;t<5;t++)
		{
			a[t] = (x%k)/(k/10);
			k /= 10;
		}
		if(a[0]==a[4]&&a[1]==a[3])
			break;
		x++;
	}
	v = (double)(x-95859)/2;
	printf("车速:%f\t,新的对称数:%d\n",v,x);
	
	return 0; 
}



/*
题目:爱因斯坦的数学问题
内容:
作答者:小白杨
内容: 
*/

#include 

int main()
{
	int n,i,flag;
	
	//while(1)
	{
		flag = 0;
		scanf("%d",&n);
		for(i=7;i<=n;i+=7)
		{
			if((i%2==1)&&(i%3==2)&&(i%5==4)&&(i%6==5))
			{
				printf("%d\t",i);
				flag++;
				if(flag%5 == 0)
					printf("\n");
			}
			
		}
		printf("\n在1~%d中有%d个数满足条件\n",n,flag);
	}
	return 0;
}


 

你可能感兴趣的:(C语言趣味编程)