| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1151 人关注过本帖
标题:[原创]钱币问题解答(二元一次不定方程正整数解浅析)
取消只看楼主 加入收藏
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
结帖率:100%
收藏
 问题点数:0 回复次数:1 
[原创]钱币问题解答(二元一次不定方程正整数解浅析)

钱币问题,原帖如下:http://bbs.bc-cn.net/bbs/dispbbs.asp?BoardID=5&ID=44812&replyID=&skin=1
本来上次要上解答过程的,可一时疏忽给忘记了

可能很多朋友对不定方程的解法都有一定的了解,我这里只针对钱币问题对一类简单的二元一次不定方程正整数解
做些简单说明,希望会对大家有用。
(严谨的数学推理,要使用一些代数符号。在此为了简单起见,做个直接的例子,说明解答原理)
这里先假设有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 <stdio.h>
#include <conio.h>

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

搜索更多相关主题的帖子: 方程 整数 问题解答 钱币 浅析 
2006-02-26 03:51
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
收藏
得分:0 

请注意正文最后一句话


叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-02-26 21:16
快速回复:[原创]钱币问题解答(二元一次不定方程正整数解浅析)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015767 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved