我有张 KETEZERFORINT面值2000的纸币。请问值不值钱

我有张 KETEZERFORINT面值2000的纸币。请问值不值钱,第1张

“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);//输出兑换方案次数


以下是程序运行结果(部分):


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/13499499.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-19
下一篇 2023-08-19

发表评论

登录后才能评论

评论列表(0条)

保存