| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1913 人关注过本帖, 1 人收藏
标题:一道简单算法题目,看看各位最简单的解法
只看楼主 加入收藏
lovegh
Rank: 5Rank: 5
来 自:图灵学院
等 级:职业侠客
威 望:3
帖 子:117
专家分:311
注 册:2015-1-23
收藏
得分:0 
我的想法是把所有三位数每位不一样的都筛选出来,这是第一步。(因为是从小到大筛选,所以保证了顺序)
然后在遍历该筛选后的数组,分别取出其两倍,三倍,分别进行合法性判断,正确就输出,以下是代码,我的
比较繁琐。
程序代码:
#include <stdio.h>

int a[1000] = {0};
int main() {
    
    //筛选数据
    for (int i = 100; i <= 999; i++) {
        int b2 = i /100;
        int b1= i /10 % 10;
        int b0 = i %10;
        if (b2 != b1 && b2 != b0 && b1 != b0 && b1 && b2) a[i] = i;
    }
    
    
    for (int i = 100; i <= 999; i++) {
        if (a[i] && 3*i <= 999 && a[2*i] && a[3*i]) {
    
            int a2 = a[i]/100,a1 = a[i]/10%10,a0 = a[i] %10;
            int b2 = a[i*2]/100,b1 = a[i*2]/10%10,b0 = a[i*2] %10;
            int c2 = a[i*3]/100,c1 = a[i*3]/10%10,c0 = a[i*3] %10;
            if (a2 != b2 && a2 != b1 && a2 != b0 &&
                a2 != c2 && a2 != c1 && a2 != c0 &&
                a1 != b2 && a1 != b1 && a1 != b0 &&
                a1 != c2 && a2 != c1 && a1 != c0 &&
                a0 != b2 && a0 != b1 && a0 != b0 &&
                a0 != c2 && a0 != c1 && a0 != c0 &&
                b2 != c2 && b2 != c1 && b2 != c0 &&
                b1 != c2 && b1 != c1 && b1 != c0 &&
                b0 != c2 && b0 != c1 && b0 != c0) {
                printf("%d %d %d\n", i, 2*i, 3*i);
            }
        
        }
        
    }
    return 0;
}

别老是写代码,要多陪妹子,多了解老婆大人,血淋淋的教训。
2015-01-31 16:29
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:2 
代码是简洁 但是看不懂啊
我来个普通的吧
程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void numToStr(int a, char *str);
void prtNum(int a, char *str);

int main(void) {
    int x, y, z, a;
    char str[10];

    for(x = 1; x <= 3; x++) {
        for(y = 1; y <= 9; y++) {
            if(y == x) continue;

            for(z = 1; z <= 9; z++) {
                if(z == x || z == y || (a = x * 100 + y * 10 + z) > 333)
                    continue;

                numToStr(a, str);
                prtNum(a, str);
            }
        }
    }

    return 0;
}

void numToStr(int a, char *str) {
    char tstr[4];
    itoa(a, str, 10);
    itoa(a * 2, tstr, 10);
    strcat(str, tstr);
    itoa(a * 3, tstr, 10);
    strcat(str, tstr);
}

void prtNum(int a, char *str) {
    int i, j, flag;
    char num[] = "123456789";

    for(i = 0; i < 9; i++) {
        flag = 0;

        for(j = 0; j < 9; j++) {
            if(str[j] == '0') {
                flag = 2;
                break;
            }

            if(num[i] == str[j])
                flag++;

            if(flag > 1) break;
        }

        if(flag > 1) break;
    }

    if(flag == 1) {
        printf("%d %d %d\n", a, a * 2, a * 3);
    }
}


[ 本帖最后由 longwu9t 于 2015-1-31 16:38 编辑 ]

Only the Code Tells the Truth             K.I.S.S
2015-01-31 16:35
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:8 
回复 10楼 lovegh
这是将3个三位数组成一个九位数,然后取每位数,用数组a[9]来标记数j是否存在,若j存在则a[j]=1

一片落叶掉进了回忆的流年。
2015-01-31 17:01
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 10楼 lovegh
我就费点口舌吧,我在8楼的代码使用了字符串,但实际上int类型数最大数已经有10位数了,超过题意要求的9位数判断。
关键语句为:for(j=i+i*2*1000+i*3*1000000;j>0;j=j/10)a[j%10-1]++;
假设i=192,则i+i*2*1000+i*3*1000000=576384192,语句可等效于for(j=576384192;j>0;j=j/10)a[j%10-1]++;分析这个循环:
第一次:j=576384192,j%10=2,a[2]=a[2]+1,j=j/10=57638419
第二次:j=57638419,j%10=9,a[9]=a[9]+1,j=j/10=5763841
第三次:j=5763841,j%10=1,a[1]=a[1]+1,j=j/10=576384
第四次:j=576384,j%10=4,a[4]=a[4]+1,j=j/10=57638
第五次:j=57638,j%10=8,a[8]=a[8]+1,j=j/10=5763
第六次:j=5763,j%10=3,a[3]=a[3]+1,j=j/10=576
第七次:j=576,j%10=6,a[6]=a[6]+1,j=j/10=57
第八次:j=57,j%10=7,a[7]=a[7]+1,j=j/10=5
第九次:j=5,j%10=5,a[5]=a[5]+1,j=j/10=0
j=0则退出for循环,至此数组a[]里对应元素都进行了+1运算,最后判断数组a[]里的元素是否全为1,是则输出该组数。
其实我在9楼的代码应该定义数组为a[10],我定义为a[9],当碰到余数为0时会出现数组下标为负数的情况,我并没有做这个判断。

能编个毛线衣吗?
2015-01-31 17:25
lovegh
Rank: 5Rank: 5
来 自:图灵学院
等 级:职业侠客
威 望:3
帖 子:117
专家分:311
注 册:2015-1-23
收藏
得分:0 
回复 13楼 诸葛欧阳
看懂了,多谢。

别老是写代码,要多陪妹子,多了解老婆大人,血淋淋的教训。
2015-01-31 18:41
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void numToStr(int a, char *str);
void prtNum(char *str);

int main(void) {
    int x, y, z, a;
    char str[10];

    for(x = 1; x <= 3; x++) {
        for(y = 1; y <= 9; y++) {
            if(y == x) continue;

            for(z = 1; z <= 9; z++) {
                if(z == x || z == y || (a = x * 100 + y * 10 + z) > 333)
                    continue;

                numToStr(a, str);
                prtNum(str);
            }
        }
    }

    return 0;
}

void numToStr(int a, char *str) {
    char tstr[4];
    itoa(a, str, 10);
    itoa(a * 2, tstr, 10);
    strcat(str, tstr);
    itoa(a * 3, tstr, 10);
    strcat(str, tstr);
}

void prtNum(char *str) {
    int num[58] = {0};
    char *p = str;

    while(*p != 0 && num[(int)*p] == 0) {
        num[(int)*p++] = 1;
        if(*p == '0') return;
    }

    if(*p == 0) printf("%.3s %.3s %s\n", str, str + 3, str + 6);
}

Only the Code Tells the Truth             K.I.S.S
2015-01-31 19:07
ffbh
Rank: 2
等 级:论坛游民
威 望:1
帖 子:27
专家分:10
注 册:2015-1-15
收藏
得分:0 
好机智的算法
2015-02-03 20:52
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:336
专家分:1135
注 册:2014-4-13
收藏
得分:0 
凑个热闹。


#include <stdio.h>
//int g[]={0,1,2,4,8,16,32,64,128,256};
int main ()

{
    int ok=1|2|4|8|16|32|64|128|256;
    int i,flg,w,m;   
    for(i=123;i<=987/3;i++)
    {
      flg=0;
      w=i+i*2*1000+i*3*1000000;
      while(w!=0)
      {
       m=w%10-1;     // m=w%10;     
       if(1<<m&flg) break;   //if(g[m]&flg) break;
       else flg|=1<<m;   //else flg|=g[m];
       w/=10;   
      }
      if(flg==ok)  printf("%d %d %d\n", i, i * 2, i * 3);
    }
    return 1;
}
2015-04-01 10:10
fogmaple
Rank: 4
来 自:江西省赣州市于都县
等 级:业余侠客
威 望:1
帖 子:119
专家分:233
注 册:2014-7-28
收藏
得分:0 
我也没有看懂,太乱了,本身应该是不用排列方式吧
2015-04-02 07:53
lowrie
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:81
专家分:138
注 册:2015-3-12
收藏
得分:0 
回复 14楼 wmf2014
好牛叉的算法,受教了
2015-04-02 09:25
快速回复:一道简单算法题目,看看各位最简单的解法
数据加载中...
 
   



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

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