您的位置:首页 > 其它

蓝桥杯——趣味数学问题举例二(2017.2.11)

2017-02-12 17:27 513 查看
一、舍罕王的失算

        相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜爱象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着8X8共64格的象棋棋盘说:陛下,请您赏给我一些麦子吧。就在棋盘的第1格中放1粒,第2格放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盘上64格,我就感激不尽了。舍罕王让人扛来一袋麦子,他要兑现他的许诺。请问,国王能兑现他的许诺吗?共要多少麦子赏赐他的宰相?

源代码:(注意精度问题)

#include <stdio.h>
#include <math.h>
int main()
{
int i;
double sum=0;
for(i=1;i<=64;i++)
sum+=pow(2,i-1);
printf("%.0lf\n",sum);
return 0;
}程序截图:





二、马克思手稿中的数学题

        有30人,其中有男人、女人和小孩,他们在同一家饭馆吃饭,共花了50元。已知每个男人吃饭需要3元,每个女人吃饭需要2元,每个小孩吃饭需要1元,请编程求出男人、女人和小孩各多少人?若答案不唯一,输出所有可能情况。

源代码:(此题思路可参考“百钱百鸡问题”、“三色球问题”)

#include <stdio.h>
#include <math.h>
int main()
{
int i,j,k;
for(i=1;i<=30;i++) //排除所有男人或女人或小孩数为0的可能情况
{
for(j=1;j<=30;j++)
{
k=30-i-j;
if(i*3+j*2+k==50)
printf("%d %d %d\n",i,j,k);
}
}
return 0;
}
程序截图:





三、换分币

        将一张5元人民币兑换成1元、5角和1角的硬币,共有多少种不同的兑换方法?
源代码:

#include <stdio.h>
#include <math.h>
int main()
{
int sum=50; //将单位全部转化成角
int i,j,k;
int count=0;
for(i=0;i<=5;i++)
{
for(j=0;j<=10;j++)
{
for(k=0;k<=50;k++)
{
if(i*10+j*5+k==50)
{
printf("1元硬币%d个 5角硬币%d个 1角硬币%d个\n",i,j,k);
count++;
}
}
}
}
printf("共有%d种不同的兑换方法\n",count);
return 0;
}
程序截图:





四、分糖果

        10个小孩围成一圈分糖果,老师依次分给这10个小孩10. 2. 8.22. 16. 4. 10. 6. 14. 20块糖果。然后所有的小孩同时将手中的糖分一半给右边的小孩,然后糖块数为奇数的人可向老师要一块。问经过这样几次后大家手中的糖数一样多?每人各有多少块糖?

源代码:

#include <stdio.h>
#define N 10
int Judge(int a[],int n) //判断10个小孩的当前糖果数是否相同
{
int i;
int flag=1;
for(i=0;i<n-1;i++) //相邻两小孩比较
{
if(a[i]!=a[i+1])
{
flag=0;
break;
}
}
return flag;
}
int main()
{
int a
={10,2,8,22,16,4,10,6,14,20}; //10个小孩的初始糖果数
int b
; //记录每个小孩当前糖果数的一半
int i,count=0; //count记录交换次数,初值0
while(!Judge(a,N)) //判断10个小孩的当前糖果数是否相同
{
for(i=0;i<N;i++)
b[i]=a[i]/2;
for(i=1;i<N;i++) //分糖 注意最后一个小孩的一半糖给第一个小孩
{
a[i]/=2;
a[i]+=b[i-1];
if(a[i]%2==1)
a[i]+=1;
}
a[0]/=2;
a[0]+=b[N-1];
if(a[0]%2==1)
a[0]+=1;
count++;
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
}
printf("count=%d\n",count);
printf("num=%d\n",a[0]);
return 0;
}
程序截图:



五、猜牌术


        魔术师利用一副牌中的13张黑桃,预先将它们排好后迭在一起,并使牌面朝下。然后他对观众说:我不看牌,只要数数就可以猜到每张牌是什么,我大声数数,你们听,不信?你们就看。


        魔术师将最上面的那张牌数为1,把它翻过来正好是黑桃A,他将黑桃A放在桌子上,然后按顺序从上到下数手中的余牌;第二次数1.2,将第一张牌放在这迭牌的下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上;第三次数1.2.3,将前面两张依次放在这迭牌的下面,再翻第三张牌正好是黑桃3…这样依次进行,将13张牌全部翻出来,准确无误。问魔术师手中的牌的原始次序是怎样安排的?(13张牌编号依次为1~13,输出原始次序时从这迭牌的上面到下面依次输出)

源代码:

#include <stdio.h>
#define N 14
int main()
{
int a
={0}; //初始化13个"空盒子"
int i,j=0,num;
for(i=0;i<13;i++)
{
num=1;
while(num<=i+1)
{
if(j>12)
j=0;
if(a[j])
j++;
else
{
if(num==i+1)
a[j]=i+1;
j++;
num++;
}
}
}
for(i=0;i<13;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
程序截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: