| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 845 人关注过本帖
标题:这题怎么样?求建议
取消只看楼主 加入收藏
ellisran
Rank: 1
等 级:新手上路
帖 子:10
专家分:6
注 册:2013-3-31
结帖率:0
收藏
已结贴  问题点数:20 回复次数:5 
这题怎么样?求建议
已知一些正整数,再给出一个整数,计算它是由那些给出的整数的和,
若没有,那么最接近他的最小数,和最近进他的最大数是多少。
例如:随机数3,9,8,17,20,14。
给出12,算得3+9。如给出19,最接近它的最小数是9+8或17,最接近它的最大数是20。
我写的部分代码
#include<stdio.h>
#define N 6
void xiangjin(int a[N],int k)
{
int i,j,t,t1,t2=0,t3;/* t1存储一个最相近的最小数,
t2储存一个最相近的最大数,
t3存储两个数相加与其最相近的最大数 */
printf("不存在两个数与输入数相等,则求相近数\n");
for(i=0;i<N;i++)
{
if(a[i]<k)
t1=a[i];
else
{
t2=a[i];
break;
}
}
if(t2!=0)
{
for(i=0;i<N-1;i++)
{
for(j=1;j<N;j++)
{
if(a[i]+a[j]>k)
{
t3=a[i]+a[j];
if(t2<t3)
printf("最相近的最大数为: %d\n",t2);
else if(t2==t3)
printf("最相近的最大数为: %d + %d 或 %d\n",a[i],a[j],t2);
else
printf("最相近的最大数为: %d + %d\n",a[i],a[j]);
break;
}
}
}
}
}
void main()
{
int i,j,k,a[N];
printf("输入6个随机数: ");
for(i=0;i<N;i++)
scanf("%d",&a[i]);//输入6个随机
printf("\n");
printf("输入一个整数: ");
scanf("%d",&k);
for(i=0;i<N;i++)
{
if(a[i]==k)
{
printf("存在一个数与输入数相等,输出: %d\n",a[i]);
exit(0);
}
}
for(i=0;i<N-1;i++)
{
for(j=1;j<N;j++)
{
if(a[i]+a[j]==k)
{
printf("存在两数相加与输入数相等,输出: %d + %d = %d\n",a[i],a[j],k);
exit(0);
}
}
}
xiangjin(a,k);
}
还没有求最相近的最小数,但我发现一个大问题,如果那些随机数不同答案就有错了,,,求改进或另外好的代码解决
搜索更多相关主题的帖子: include 正整数 
2013-03-31 22:22
ellisran
Rank: 1
等 级:新手上路
帖 子:10
专家分:6
注 册:2013-3-31
收藏
得分:0 
回复 2楼 wp231957
不是这个问题,问题是如果我把例子的数字反过来输入,即输入6个随机数 14 20 17 8 9 3,输入一个整数是15的话,输出结果是20...答案应该是17才正确
2013-03-31 22:31
ellisran
Rank: 1
等 级:新手上路
帖 子:10
专家分:6
注 册:2013-3-31
收藏
得分:0 
回复 4楼 wp231957
嗯,还在想怎么改...随便上来求求思路,求帮助
2013-03-31 22:41
ellisran
Rank: 1
等 级:新手上路
帖 子:10
专家分:6
注 册:2013-3-31
收藏
得分:0 
回复 6楼 czz5242199
是利用链表么?初学者求详细,感谢了
2013-03-31 22:57
ellisran
Rank: 1
等 级:新手上路
帖 子:10
专家分:6
注 册:2013-3-31
收藏
得分:0 
以下是引用czz5242199在2013-3-31 22:59:25的发言:

#include <iostream>
using namespace std;

int n,sum,a[100],t=0;  //最多一百个数
int f[10000];

int main()
{
    cin>>n>>sum;   //输入多少个数,目标和
    for (int i=0; i<n; i++) t+=(cin>>a,a);
   
    f[0]=1;
    for (int i=0; i<n; i++)
        for (int j=t; j>=a; j--) f[j]=f[j]|f[j-a];

   
    if (f[sum]) cout<<sum<<endl;
    else
    {
        int j=sum;
        while (!f[j]) j--;
        cout<<j<<endl;
        
        j=sum;
        while (!f[j]) j++;
        cout<<j<<endl;
    }
   
    system("pause");
}

 f[0]=1;
    for (int i=0; i<n; i++)
        for (int j=t; j>=a[i]; j--) f[j]=f[j]|f[j-a[i]];
这段不懂...还有f[]的作用什么?感谢大神了
2013-03-31 23:38
ellisran
Rank: 1
等 级:新手上路
帖 子:10
专家分:6
注 册:2013-3-31
收藏
得分:0 
以下是引用yctchxf在2013-3-31 23:35:06的发言:

我觉得先找连个数相加不是难事。如果找不到,先对基数(开始的一组数) 进行排序,然后遍历基数找出 检测值的位子,就能找出最接近的小数,和最接近的大数。
至于你说8+9和17 两个都在基数中,是不是非得满足这个条件呢?


————————————————等回复——————————————————————————————————————

...排序这个方法不错,但怎么设计检测值的位子呢?还发现了一个新问题...
for(i=0;i<N-1;i++)
{
for(j=1;j<N;j++)
{
if(a[i]+a[j]==k)
{
printf("存在两数相加与输入数相等,输出: %d + %d = %d\n",a[i],a[j],k);
exit(0);
}
如果我输入18的话,答案是9+9,题目要求不能自己相加自己的吧,求改进
2013-03-31 23:48
快速回复:这题怎么样?求建议
数据加载中...
 
   



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

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