算法求解(数学建模的问题)

最帅马老师 2010-08-05 05:26:03
刚看到有兄弟提问,没想出下文就结贴了,现重新开一贴征求算法:

原题:

有一条长阶梯,若每步跨2阶,则最最后剩一阶,若每步跨3 阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶。只有每次跨7阶,最后才正好一阶不剩。请问这条阶梯共有多少阶?
C语言,使用如下程序:


#include <stdio.h>
int
main()
{
int i=0;

while (i+=7)
{
if ( (i-2)%3!=0 ) continue;
if ( (i-4)%5!=0 ) continue;
if ( (i-5)%6!=0 ) continue;

printf("the anwser is: %d\n", i);
break;
}

return 0;
}


输出为119。
那么,119是不是唯一的答案?不是,将程序更改为如下:

#include <stdio.h>

int
main()
{
int i=0;

while (i+=7)
{
if (i>10000)
{
break;
}

if ( (i-2)%3!=0 ) continue;
if ( (i-4)%5!=0 ) continue;
if ( (i-5)%6!=0 ) continue;

printf("the anwser is: %d\n", i);
}

return 0;
}

输出为:
the anwser is: 119
the anwser is: 329
the anwser is: 539
the anwser is: 749
the anwser is: 959
the anwser is: 1169
the anwser is: 1379
the anwser is: 1589

从这些输出可以观察到,从119开始,每个符合条件的答案之间相差210。
但为什么会相差210?第一个数为119,可不可以推算出来,而不用遍历?
如果用函数f(x)表示,则此函数有f(x+T)=f(x),周期T为210,这个函数如何建模?
...全文
391 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
neverby 2010-08-07
  • 打赏
  • 举报
回复
中国剩余定理……
alandingking 2010-08-06
  • 打赏
  • 举报
回复
中国剩余定理,LZ去看看
yinxx11 2010-08-06
  • 打赏
  • 举报
回复
来学习学习
qiuqiu19870120 2010-08-06
  • 打赏
  • 举报
回复
这个可以列出六元非齐次方程可以解出其解
1 -2 0 0 0 0 1
1 0 -3 0 0 0 2
1 0 0 -5 0 0 4
1 0 0 0 -6 0 5
1 0 0 0 0 -7 0
显然前面的系数矩阵的秩是5 所以最后的解得形式肯定是y=a*n+b的形式 很显然这是直线的形式 所以我只要解出其中两点就等于解决这方程的解了 然后取这直线的整数点OK了
arong1234 2010-08-06
  • 打赏
  • 举报
回复
Q446512799 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zmshy2128 的回复:]
用手都可以算出来

设满足条件的总阶数为N(i) (表示第i个解),因为“若每步跨3 阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶。” 则N(i)+1同时是3、5、6的倍数,即N(i)+1是 30 的倍数。 又因为因为N(i)是7 的倍数。

那么有 N(i+1) + 1也是30的倍数,N(i+1)也是7的倍数。
固有 N(i+1)-N(i) 的值同时是30和7……
[/Quote]
~~
cattycat 2010-08-06
  • 打赏
  • 举报
回复
8楼说的不错。
N(i)+1被2,3,5,6整除,所以能被5*6=30整除,而N(i)能被7整除。
下一个解N(i+1)+1能被30整除,N(i+1)能被7整除。
可以这样写:
(N(i+1)+1)-(N(i)+1)=N(i+1)-N(i)
所以就有N(i+1)-N(i)同时被30和7整除。最小公倍数也被整除,就是相差210.
第一个解从30-1=29试,第二个解从59试,后面依次是89,119,找到第一个解是119,后面每个解相差210.
雪域迷影 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zmshy2128 的回复:]


设满足条件的总阶数为N(i) (表示第i个解),因为“若每步跨3 阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶。” 则N(i)+1同时是3、5、6的倍数,即N(i)+1是 30 的倍数。 又因为因为N(i)是7 的倍数。

那么有 N(i+1) + 1也是30的倍数,N(i+1)也是7的倍数。
固有 N(i+1)-N(i) 的值同时是30和7的倍数,即使210的倍数[/Quote]
8楼的思路不错,
我刚开始做的思路效率太低了,学习了!
以前也做过一模一样的问题,只不过问题描述的方式不一样罢了!
shellfish567 2010-08-06
  • 打赏
  • 举报
回复
你的算法处理的太过于粗糙,根本没考虑效率问题!
根据相应的数可以看出,如果要满足这个数,则有个条件,这个数是2的倍数减一,2的倍数减一,5的倍数减一,6的倍数减一,恰且等于7的倍数。
都是减一,那为什么不这么求?这个数为2,3,5,6的公倍数减1,恰且整除以7?2,3,5,6的公倍数为30,可以这么写
#include <stdio.h>
main()
{
int i=30-1;//这里为了表示满足这个条件
while(1)
{
if((i%7==0)
break;
i+=30;
}
printf("the min num is %i\n",i);
}

至于为什么往上每次加210,算算2,3,5,6,7的公倍数?既是每次加的30%7==2,那么这个余数要想被7整除那需要?14,也就是7次,7次+30==210,所以,要想求以后的数,只需要从最小的数开始,每次加210即可,具体代码不用写了吧?我想应该效率上要高于你那个
zdl110110 2010-08-06
  • 打赏
  • 举报
回复
2,3,5,6,7的最小公倍数为210
liuwei2500 2010-08-06
  • 打赏
  • 举报
回复
用30的倍数来解决的确是一个正确的解答
Abc9956 2010-08-06
  • 打赏
  • 举报
回复
小小的学习下
moxiao02 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zmshy2128 的回复:]
用手都可以算出来

设满足条件的总阶数为N(i) (表示第i个解),因为“若每步跨3 阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶。” 则N(i)+1同时是3、5、6的倍数,即N(i)+1是 30 的倍数。 又因为因为N(i)是7 的倍数。

那么有 N(i+1) + 1也是30的倍数,N(i+1)也是7的倍数。
固有 N(i+1)-N(i) 的值同时是30和7……
[/Quote]

不错
AAA20090987 2010-08-05
  • 打赏
  • 举报
回复
这就是中国剩余定理吧
离散数学的书中有详细介绍
zmshy2128 2010-08-05
  • 打赏
  • 举报
回复
用手都可以算出来

设满足条件的总阶数为N(i) (表示第i个解),因为“若每步跨3 阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶。” 则N(i)+1同时是3、5、6的倍数,即N(i)+1是 30 的倍数。 又因为因为N(i)是7 的倍数。

那么有 N(i+1) + 1也是30的倍数,N(i+1)也是7的倍数。
固有 N(i+1)-N(i) 的值同时是30和7的倍数,即210.


对于满足条件的第一个解,以
for(i = 29; 判断i是否整除7; i+=30)

的方式计算寻找即可。
huayiluo 2010-08-05
  • 打赏
  • 举报
回复
表示关注!
最帅马老师 2010-08-05
  • 打赏
  • 举报
回复
只是想做下尝试
djjlove_2008 2010-08-05
  • 打赏
  • 举报
回复
这个用数学建模来做吗?其实就是展示你的逻辑思维呀,恩,使用剩余定理是最快的方法。
ayw215 2010-08-05
  • 打赏
  • 举报
回复
这个其实就是中国剩余定理了
可以写出通项来
weixiaoshashou 2010-08-05
  • 打赏
  • 举报
回复
先来看看热闹。待会进来瞻仰大牛。
加载更多回复(2)

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧