“Kétezer forint”是匈牙利语“二千福林”的意思。这是匈牙利的纸币,面额2000福林。纸币正面是匈牙利特兰西瓦尼亚王子加波尔·拜特伦,背面是匈牙利画家玛达拉斯·维克多的油画作品《拜特伦王子在科学家中间》 。
匈牙利货币在我国不是可自由兑换货币,在国内银行无法兑换。匈牙利福林与人民币无汇率,要通过匈牙利福林与美元的汇率来折算,2000匈牙利福林大约折算56元人民币。
取m个硬币,每次将m个硬币同时抛出,并记录正面出现的次数X,一共进行n次最后统计正面出现次数X满足X≤√(m/2)+m/2的情况有k个,所以
k/n=P(X≤√(m/2)+m/2)=P(((X-m/2)/√(m/4))≤√2)
每次硬币正面向上的期望是EX=m/2,方差DX=m/4,由中心极限定理有:
((X-m/2)/√(m/4)~N(0,1)
所以k/n=P(((X-m/2)/√(m/4))≤√2)=1/2+1/√(2π)∫[0,√2]exp(-x²/2)dx
=1/2+(1/√π)∫[0,1]exp(-x²)dx
从而∫[0,1]exp(-x²)dx=(k/n-1/2)√π
通过编程模拟计算∫[0,1]exp(-x²)dx≈075
而准确值为∫[0,1]exp(-x²)dx=07468241328
int ThrowCoin(int coins)
{
int i,k=0;
for(i=0,k=0;i<coins;i++)
{
if(rand()%2)
k++;
}
return k;
}
//P((X-u)/o<=sqrt(2))=1/2+int(exp(-x^2),x=01)/sqrt(2);
double Compute(int n,int coins)
{
int nmax=(int)(sqrt(coins05)+coins05+05);
double pi=31416;
int i,count=0;
for(i=0;i<n;i++)
{
if(ThrowCoin(coins)<=nmax)
count++;
}
//count/n=1/2+A/sqrt(pi);
return ((double)count/n-05)sqrt(pi);
}
void main()
{
int coins=200;
int n=20000;
double A=Compute(n,coins);
printf("n=%d\tcoins=%d\nA=%f\n",n,coins,A);
}
思路:假设有数组arr,里面的int值代表银币重量,下标代表第几个银币。
循环(非递归):把数组第一个值赋值给变量tmp,从第二个变量循环到最后一个,比较循环里的变量和tmp值,如果不等,就返回小数下标。
递归:用二分思想,银币分2堆(不能均分时把中间那个留出来),取重量小的那堆继续二分。最后只剩下一个时就是所求
下面这种写法是返回下标的。也可以把硬币假设成一种数据类型,然后返回那个类型
#!/usr/bin/python# -- coding: utf-8 --
#返回最小值下标
def getMin(arr1):
if len(arr1)==0:return -1
tmp=arr1[0]
index=0
for cur in arr1:
if tmp!=cur:
return 0 if tmp<cur else index
index+=1
return -1
real_index=0
#返回最小值下标 递归
def getMinRecursion(arr1):
global real_index
n=len(arr1)
if n==0:return -1
if n==1:return real_index
if n==2:return real_index if arr1[0]<arr1[1] else real_index+1
sum1=sum(arr1[0:int(n/3)])
sum2=sum(arr1[int(n/3):int(n/3)2])
if sum1==sum2:
real_index+=int(n/3)2
return getMinRecursion(arr1[int(n/3)2:n+1])
if sum1<sum2:
return getMinRecursion(arr1[0:int(n/3)])
else:
real_index+=int(n/3)
return getMinRecursion(arr1[int(n/3):int(n/3)2])
arr=[1,1,1,1,1,1,0,1,1]
print("%d"%getMin(arr))
print("%d"%getMinRecursion(arr))
以下是c语言代码(含注释),兑换方案有3,418,951种:
#include <stdioh>
void main()//主函数
{
int wuFen=0;//5分硬币的数量
int yiJiao=0;//1角硬币的数量
int wuJiao=0;//5角硬币的数量
int yiYuan=0;//1元硬币的数量
int count=0;//记录兑换方案次数
//内嵌四次循环,分析每种兑换情况(即计算每种硬币的数量的组合)
for(wuFen=0;wuFen<=100100/5;wuFen++)
for(yiJiao=0;yiJiao<=100100/10;yiJiao++)
for(wuJiao=0;wuJiao<=100100/50;wuJiao++)
for(yiYuan=0;yiYuan<=100100/100;yiYuan++)
//如果四种硬币总数量等于100元即10000分
if(wuFen5+yiJiao10+wuJiao50+yiYuan100==100100)
{
//累增兑换方案次数,输出每种兑换结果
count++;
printf("100元可以兑换成%d个5分硬币和%d个1角硬币和%d个5角硬币和%d个1元硬币\n",wuFen,yiJiao,wuJiao,yiYuan);
}
printf("兑换方案共有%d种。\n",count);//输出兑换方案次数
}以下是程序运行结果(部分):
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)