免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5705 | 回复: 19
打印 上一主题 下一主题

[算法] 发个简单的题目 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-06 18:05 |只看该作者 |倒序浏览
将1,2,3,4,5,6,7,8,9共9个数分成三组,组成3个三位数,且使这3个三位数构成1:2:3的比例,例如:3个三位数192,384,576满足以上条件.192:384:576=1:2:3。试求出所有满足条件的3个三位数。

论坛徽章:
0
2 [报告]
发表于 2009-04-06 18:17 |只看该作者

回复 #1 吴秦 的帖子

这是我自己的,大家也贴下自己的。

/*我的思路是:1~9组成的最小三位数是123,最大的是987,由于要满足1:2:3的关系,
*最小的那个数应该不到于987/3=329。这样的话第一个数的变化范围是123~329,
*将这里面的数分别乘2、乘3,然后判断这三个数是否符合要求,即这三个数是否由1~9组成,
*而且各个数字不能相同。代码如下:
*/


  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. int judge(int n);//用于判断整数n的各位数字是否想同,如果有想同的就返回0;否则返回1

  4. main()
  5. {
  6.         int l,m,n,p,q;
  7.         for(l=123;l<=329;l++)
  8.         {       
  9.                 m=2*l,n=3*l;
  10.                 p=l*1000+m,q=p*1000+n;
  11.                 if(judge(l)==0||judge(m)==0||judge(n)==0||judge(p)==0||judge(q)==0)
  12.                 //判断l、m、n是否符合要求。如果不符合就跳出本次循环,进入下次循环
  13.                         continue;
  14.                 printf("%d,%d,%d\n",l,m,n);
  15.         }
  16. }

  17. int judge(int n)
  18. {
  19.         int num[10],i,j,len=0,temp=n;
  20.         do
  21.         {
  22.                 ++len;
  23.                 temp=temp/10;
  24.         }while(temp);//求出n的位数
  25.         for(i=1;i<=len;i++)
  26.         {//将n的各位数字存入num[],并判断是否存在0及相同的数字,如果存在就返回0
  27.                 if((num[i]=n%10)==0) return 0;
  28.                 n=n/10;               
  29.                 for(j=1;j<i;j++)
  30.                         if(num[j]==num[i]) return 0;
  31.         }
  32.         return 1;
  33. }
复制代码

[ 本帖最后由 吴秦 于 2009-4-6 18:18 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-04-07 09:18 |只看该作者

回复 #2 吴秦 的帖子

又用这种办法求是几位数??狂晕!换个办法吧!

int judge(int n)这个函数里面,你直接判断读进来的数字是不是大于123 小于987就好了啊 ,之后就按照3位处理呗!还用搞什么除以10啥的吗!想不明白!

论坛徽章:
0
4 [报告]
发表于 2009-04-07 09:26 |只看该作者
我基本没什么思路。。
SirFang 该用户已被删除
5 [报告]
发表于 2009-04-07 11:58 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2009-04-07 17:21 |只看该作者
//a : 100 ~ 333
//b : 200 ~ 666

//c : 300 ~ 999

#include <stdio.h>

#define MATCH 0
#define NOT_MATCH 1

int judge(int a, int b, int c)
{
    char tmp_buf [9 +1]="\0";
    sprintf(tmp_buf, "%d%d%d", a, b, c);
   
    //如果 tmp_buf 中有相同的元素 return NOT_MATCH

    int i = 0;
    int k = 0;
    for (i = 0; i < 10; i++)
    {
        for (k = i+1; k < 10; k++)
        {
            if (tmp_buf[i] == tmp_buf[k])
            {
                return NOT_MATCH;
            }
        }
        
    }

    return MATCH;
}

int main()
{
    int a = 0;
    int b = 0;
    int c = 0;
   
    for (a = 123; a < 333; a++)
    {
        b = a * 2;
        c = a * 3;
        
        if(judge(a, b, c) == NOT_MATCH)
        {
            continue;
        }
        else
        {
            printf("%d, %d, %d\n", a, b, c);
        };
    }

    return 0;
}


[ 本帖最后由 libin1983 于 2009-4-7 17:23 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-04-07 17:44 |只看该作者

回复 #6 libin1983 的帖子

int judge(int a, int b, int c) {
    int digital[10] = { 0, };
    char tmp_buf [9 +1]="\0";
    sprintf(tmp_buf, "%d%d%d", a, b, c);

    for ( int i = 0; i < 9; i ++ ) {
          if ( 0 != digital[tmp_buf[i] - '0'] ) {
                   return NOT_MATCH;
          }
           digital[tmp_buf[i] - '0'] = 1;
   }
   
    return MATCH;
}


[ 本帖最后由 drowsyboy 于 2009-4-7 17:47 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-04-07 18:57 |只看该作者
原帖由 SirFang 于 2009-4-7 11:58 发表


中间数必须是偶数,否则第一个数就不是整数,所以,如果以中间的数来做循环体的话,循环量会减一半。
中间数必须小于等于658,否则最后一位数会超过3位数(大于1000)。
for(int digit = 0; digit < 658; ...



跟一贴吧,每个数的规律都是可以被3整除,
所以加上“sirfang”的方法,迭代的步长可以增加到6
liaohuangen 该用户已被删除
9 [报告]
发表于 2009-04-07 21:22 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
10 [报告]
发表于 2009-04-07 23:15 |只看该作者

回复 #3 bladmin 的帖子

我感觉这样更通用,不管哪个地方那个都可以这样求一个数的位数,这样为何不好。
你要是觉得效率不高用位操作,但这个更直观。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP