每日刷题(二十五)
蓝桥杯第八届C语言B组省赛习题
习题H:包子凑数
这个题,确实蛮有难度的
首先要审清题,很多人题目都没读懂就做了,这里输入第一行的数目是指有几种蒸笼。
这是一个数学问题,其实很多编程题,其实难就难在考察你的数学分析能力上。从题目给的两个样例,样例1中凑不出的数目有限,样例2中凑不出的数目是无限的。经过观察可以看出,样例2的都是偶数,所以奇数都凑不出。
所以可以推断出如果两数互质,则凑不出的数目有限,如果两数不互质,则凑不出的数目无限。
我们可以不妨假设凑得出的数目是在两种笼屉本质数目的乘积之和以内,因为一种蒸笼可包含包子的上限是100,那么我们就暂时设得出的数目在10000以内。
那么我们还需要考虑如何将凑不出的数字存储起来,这里可以参考求素数的筛选法。进而就可以求出有多少凑得出的数目
详细C代码如下
#include<stdio.h>
int gcd(int a, int b)
{
if(b == 0)
return a;
else
return gcd(b, a % b);
}
int main()
{
int a[100];
int f[10000] = {0};
int n, i, j;
int g = 0;
scanf("%d", &n);
f[0] = 1;
for(i = 0; i < n; i++)
{
scanf("%d",&a[i]);
if(i == 0)
g = a[i];
else
g = gcd(g, a[i]);
for(j = 0; j < 10000; j++)
{
if(f[j])
f[j + a[i]] = 1; //a[i]*k是可以凑出来的各类包子数目
//k*a[i] + m*a[i + 1]也是可以凑出来的各类包子数目
}
}
if(g != 1)
{
printf("INF\n");
}
else
{
int count = 0;
for(i = 0; i < 10000; i++)
{
if(!f[i])
count++;
}
printf("%d\n", count);
}
return 0;
}