c语言 不定方程问题程序,[原创]钱币问题解答(二元一次不定方程正整数解浅析)...

[原创]钱币问题解答(二元一次不定方程正整数解浅析)

可能很多朋友对不定方程的解法都有一定的了解,我这里只针对钱币问题对一类简单的二元一次不定方程正整数解

做些简单说明,希望会对大家有用。

(严谨的数学推理,要使用一些代数符号。在此为了简单起见,做个直接的例子,说明解答原理)

这里先假设有1分,2分,3分硬币分别是z,x,y个,以下数学推理,请勿与程序表达式一概而论

z+2x+3y=N(你需要键入的硬币总金额) 其中x,y>=0

2x+3y=N-z------------------------------①

设 m=N-z------------------------------------②

综合①② 得

2x+3y=m=m(3-2)

2x+3y=-2m+3m

2x+2m=3m-3y

2(x+m)=3(m-y)

(x+m)/3=(m-y)/2------------------------③

由于2和3互质,所以③两边均是整数。不妨假设这个整数是t

(x+m)/3=t (m-y)/2=t

x=3t-m y=m-2t

x,y>=0

x=3t-m>=0 y=m-2t>=0

t>=m/3---④ t<=m/2---⑤

综合 ④ ⑤得

m/3 <= t <=m/2

到这里很显然,一个t对应一组(x,y) ,有几个t就有几组正整数解(请允许我包括0在内,本题要求)

现在题目就转化成求区间[m/3,m/2]上整数的个数(t只要求整数,这范围是满足x,y取值的范围)

(int)(m/2)-(int)(m/3) 是要求的个数吗?也许在有的时候是对的,但当m/3是整数的时候,显然少算了一个,那正是m/3本身

题目到现在清楚了,当选择一个1分硬币的个数z, 那么N-z就确定了(即m) 计算出这时区间 [m/3,m/2]上整数个数,便是当1分

硬币为z时,所有解的组数。那当然写程序,可以让1分硬币个数从0循环到N 计算出每次的组数,最后的总和便是本题的要求

相信大家已经明白了,用这种方法有如下的程序

#include

#include

void main()

{

long count=0;

int n,leap,i;

int count1,count2;

scanf("%d",&n);

for(i=0;i<=n;i++) /*这里如果循环的是3分硬币的个数,当然计算效率会高不少,可略改for内的程序达到*/

{

leap=0; /*我比较懒就写这个,刚才分析过程得出来的程序*/

count1=(n-i)/2;

count2=(n-i)/3;

if((n-i)%3==0)

leap=1;

count1=(count1-count2)+leap;

count+=count1;

}

printf("%ld\n",count);

getch();

}

程序在(win XP,win-tc)正常运行。附两组数据检验 2934--------718831, 12553-------13137761

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值