| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 531 人关注过本帖
标题:请高手帮忙解释下这道题?
只看楼主 加入收藏
youyuanjia
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2006-9-19
结帖率:84.62%
收藏
已结贴  问题点数:25 回复次数:5 
请高手帮忙解释下这道题?
编程求:将1~9这9个数字分成3个3位数,要求第一个数是第二个数的二分之一,是第三个数的三分之一.
请大家帮忙解答一下.
我这里有个参考答案,但我看不懂,希望哪位帮我解释下下,谢谢了.
#include <stdio.h>
int a[9]={1,2,3,4,5,6,7,8,9};
main()
{
 int m,count=0;
for(m=123;m<=329;m++)
if(sh(m,a)&&sh(2*m,a+3)&&sh(3*m,a+6)&&))
printf("NO.%d:%d  %d  %d\n",++count,m,2*m,3*m);
}
int sh(int  x,int *y)
{
  int *p1,*p2;
  for(p1=y;p1<y+3;p1++)
  {  *p1=x%10;
     x/=10;
    for(p2=a;p2<p1;p2++)
    if(*p1==0||*p2==*p1)return 0;
}
return 1;
}
搜索更多相关主题的帖子: 解释 
2010-03-24 23:11
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
收藏
得分:0 
#include <stdio.h>
int a[9]={1,2,3,4,5,6,7,8,9};

int sh(int  x,int *y)
{
    int *p1,*p2;
    for(p1=y;p1<y+3;p1++)//取三位数的值
    {  
        *p1=x%10; //取最低位数的值
        x/=10; //下移一位,方便取下一位数
        for(p2=a;p2<p1;p2++)//从数组的第0个元素开始到p1位置对比查找有没有等于0或者有重复的数
            if(*p1==0||*p2==*p1)return 0;//如果有等于0或者有重复的数,条件不成立,返回0
    }
    return 1;//y~y+2这三个位置的数没有等于0的,且a~y+2之间没有重复的数,则返回1
}
main()
{
    int m,count=0;
    for(m=123;m<=329;m++)    //三个数中最小的数最小是123,最大是987/3 == 329
        if(sh(m,a)&&sh(2*m,a+3)&&sh(3*m,a+6))//sh(m,a)置满足条件的最小的数,sh(2*m,a)置满足条件的第二大数,sh(3*m,a)置满足条件的第一大数
            printf("NO.%d:%d  %d  %d\n",++count,m,2*m,3*m); //都能满足上面三个条件的话,m,2*m,3*m就是一组满足要求的值
}
2010-03-24 23:47
赤那
Rank: 3Rank: 3
来 自:广东
等 级:论坛游侠
威 望:1
帖 子:127
专家分:178
注 册:2010-3-1
收藏
得分:0 
#include <stdio.h>
int a[9]={1,2,3,4,5,6,7,8,9};
int sh(int  x,int *y)
{
  int *p1,*p2;
  for(p1=y;p1<y+3;p1++)
  {  *p1=x%10;
     x/=10;
    for(p2=a;p2<p1;p2++)
    if(*p1==0||*p2==*p1)
        return 0;
    else
        return 1;
  }
}
void main()
{
    int m,count=0;
    for(m=123;m<=329;m++)
    {
        if(sh(m,a)&&sh(2*m,a+3)&&sh(3*m,a+6))
            printf("NO.%d:%d  %d  %d\n",++count,m,2*m,3*m);
    }
}
 
图片附件: 游客没有浏览图片的权限,请 登录注册
2010-03-25 01:49
初学者jie
Rank: 2
等 级:论坛游民
帖 子:15
专家分:11
注 册:2009-10-20
收藏
得分:0 
原来是这样
2010-03-25 10:40
youyuanjia
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2006-9-19
收藏
得分:0 
回复 2楼 ldg628
谢谢高手,但我还是有点不明白.
for(p1=y;p1<y+3;p1++)//取三位数的值
    {  
        *p1=x%10; //取最低位数的值
        x/=10; //下移一位,方便取下一位数
        for(p2=a;p2<p1;p2++)//从数组的第0个元素开始到p1位置对比查找有没有等于0或者有重复的数
            if(*p1==0||*p2==*p1)return 0;//如果有等于0或者有重复的数,条件不成立,返回0
    }
这个双重的循环,外层和内层分别是什么意思哦,这个题的主要解题思路的什么哦,或者说是算法?
2010-03-25 22:33
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
收藏
得分:25 
主要思路:
从三个数中最小的数着手,它的范围时 123 ~ 987/3 == 329,在这个范围内一一取值,对满足条件的进行打印

函数int sh(int  x,int *y)的作用是对每一个值x进行分析,取它每一权位数的值,不合条件时,返回0,否则返回1:
 (1)   sh(m,a)是处理最小值,把满足条件的三位数依放入a[0],a[1],a[2],
 (2)   sh(2*m,a+3)是处理第二大的值,把满足条件的三位数依放入a[3],a[4],a[5],
 (3)   sh(3*m,a+6)是处理最大的值,把满足条件的三位数依放入a[6],a[7],a[8].
他们的执行顺序是 (1) -> (2) -> (3),在后面执行的要依赖前面的处理结果:
    for(p1=y;p1<y+3;p1++)//这是大循环,取x每一权位数的值,然后在小循环中判断取得的当前值等不等于0(等于0条件不满足),如果不等于0就与已经赋值了的前面的数组元素一一对比,看看有没有相等的值,如果有相等的, 说明这个数里与前面的数字有重复,不能满足条件,直接返回0
    {  
        *p1=x%10; //取最低位数的值
        x/=10; //下移一位,方便取下一位数
        for(p2=a;p2<p1;p2++)//从数组的第0个元素开始到p1位置对比查找有没有等于0或者有重复的数
            if(*p1==0||*p2==*p1)return 0;//如果有等于0或者有重复的数,条件不成立,返回0
    }
   
2010-03-26 10:39
快速回复:请高手帮忙解释下这道题?
数据加载中...
 
   



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

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