| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1903 人关注过本帖
标题:[求助]一道百思不得其解的题
只看楼主 加入收藏
shower
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2006-4-29
收藏
 问题点数:0 回复次数:23 
[求助]一道百思不得其解的题

问题是这样的:
有一个数x, 0<=x<=1000, 把它拆分成几个数的和,x1+x2+......xn=x,使得x1,x2,x3.....xn的最小公倍数最大,
要求输入这个数 x,输出最小公倍数 S。
讲讲思路。谢谢。

搜索更多相关主题的帖子: 百思不得其解 
2006-10-10 22:02
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

如果不要求效率的话我可以写一个.
现在试试.


倚天照海花无数,流水高山心自知。
2006-10-14 17:39
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

#include<stdio.h>
typedef struct{
int value;
int max;
}data;
int addvalue(int num)
{
int i=1,sum=0;
while(i*i<num)
{
if(num%i==0)
sum+=(i+num/i);
i++;
}
if(i*i==num)
{
sum+=i;
}
return(sum);
}
int chazhao(data a[],int n,int num)
{
int i=n-1;
while(i>=0&&a[i].max>num)
{
i--;
}
return(i+1);
}

int main()
{
int n,i=1,j=2,sum,num;
data a[300];
a[0].value=1;
a[0].max=1;
printf("input a number that is smaller than 1000:");
scanf("%d",&num);
while(a[i-1].max<=1000)
{
sum=addvalue(j);
if(a[i-1].max<sum)
{
a[i].max=sum;
a[i].value=j;
}
else
{
i--;
}
i++;
j++;
}
printf("%d\n",a[chazhao(a,i,num)].value);
/*while(--i>=0)显示数组内各以value为公倍数的最大和X
{
printf("%d %d\n",a[i].value,a[i].max);
}*/
getch();
return(0);
}
/*看看可以不*/


倚天照海花无数,流水高山心自知。
2006-10-14 18:29
C语言学习者
Rank: 4
等 级:贵宾
威 望:13
帖 子:1278
专家分:0
注 册:2006-9-26
收藏
得分:0 
nuciewth可不可以分解它们,给我看看

谁有强殖装甲第二部,可以Q我460054868
2006-10-14 19:42
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
收藏
得分:0 
不大理解题意
比如输入:10
那么 10=1+9//最小公倍数是9
而nuciewth如果是10的话结果是6



2006-10-14 20:18
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
收藏
得分:0 
nuciewth
能告诉我你是怎么拆分的吗?
谢谢

2006-10-14 22:29
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
以下是引用wangxiang在2006-10-14 20:18:56的发言:
不大理解题意
比如输入:10
那么 10=1+9//最小公倍数是9
而nuciewth如果是10的话结果是6


1 +3 +6=10
当然这里满足条件最小的公倍数是6了.


倚天照海花无数,流水高山心自知。
2006-10-14 22:39
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
我来讲一下我的做法:
首先保存1--1000可以用最小的公倍数表示出来的最大数.
举个例子:都是以前面的数为公倍数
1 可以表示的最大数是1
2 可以表示的最大数是 3 (1+2)
...
6 可以表示的最大数是 12 (1+2+3+6)

即可以表示最大数是它所有约数之和.
为了效率问题,我把一些多余的数除掉了.举个例子
7 可以表示的最大数是 8 (1+8)但因为前面的6已经可以表示出来了,所以7被排除.
保存之后,然后直接从后面开始查找,找到对应区段的max则输出它的公倍数即value.
比如我要表示出23
此时我只写出这段

max:1 2 3 4 6 8 10 12
value:1 3 4 7 12 15 18 28
查找时,先比较28(28>23)则比较下一个18(23>13)结束查找,返回为12(因为23落在以12为最小公倍数的区段中)

倚天照海花无数,流水高山心自知。
2006-10-14 22:51
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
我的做法有点笨拙,显然效率不高,查找倒还可以改为折半查找,最主要的是我将1--1000所有的数据都保存起来,这个是极大的浪费,我是想不出来了,哪位高手帮忙改改啊
我曾经想过用输入的数要判断要求的数组范围,比如从num/4搜索到num/2.但我还没验证出是否对输入的每个数都可以在这个范围之内被表示出来,所以就只能这样了.

各位帮忙了,谢谢了

倚天照海花无数,流水高山心自知。
2006-10-14 22:57
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
收藏
得分:0 
以下是引用nuciewth在2006-10-14 22:39:44的发言:

1 +3 +6=10
当然这里满足条件最小的公倍数是6了.

 题目貌似要使最小公倍数最大哦............
 应该是3+7吧...


汗,都懒得写代码了.......... cheat了一个威望,哈.....
2006-10-14 23:00
快速回复:[求助]一道百思不得其解的题
数据加载中...
 
   



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

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