御笔剑客 发表于 2017-10-22 11:37:38

下面的题目这种解法是什么意思呢?

#include <stdio.h>
#include <string.h>


int main(int argc, const char * argv[])
{
    //用1,2,3...9组成3个三位数abc, def, ghi, 每个数字恰好使用一次,且abc:def:ghi=1:2:3,输出所有解。
    int n, i, j;
    char a;
    for(n = 123; n < 330; n++){
      sprintf(a, "%d", n * 1000000 + n * 2 * 1000 + n * 3);
      
      for(j = 0, i = '1'; i <= '9'; memchr(a, i++, 9) && j++);
      
      if (j == 9) {
            printf("%d %d %d \n", n, n * 2, n * 3);
      }
    }
return 0;
}

hacker.jin 发表于 2017-10-22 22:43:40

本帖最后由 hacker.jin 于 2017-10-22 22:47 编辑

首先因为只有三位数,所以结果中最大的值为987(不能有重复数值),除以3就是329(也就是 小于330),而最小为123(相信不需要解释吧),然后结果是长度为3的数组,其中第一个数组的值的范围也就是123到329,这里写了一个for循环,因为其结果肯定在这里面,又定义了一个长度为10的字符数组(其实只用到了9位,最后一位是字符串结束符),在for循环中格式化字符串,因为n的值有可能是结果中的第一个数值,所以把他*100000,然后加上他的2倍*1000,再加上他的3倍,注意这里把他格式化成了字符串,不要想的太复杂,其实结果很简单,比如第一次循环n=123,那么字符串的结果就是 123000000+456000+789=====123456789,简单吧,然后下面一部就有点难理解了,其实也不难,就是判断字符串中有没有重复的字符,每次循环 i+1,i的结果是字符‘1’到'9’,如果>>字符串<<中存在对应的字符j才会+1,循环结束判断j的值如果等于9(如果等于9说明‘1’到‘9' 9个字符都存在于字符串中,因为只有9个字符,如果都存在自然没有重复的,也就满足 ”用1,2,3...9组成3个三位数“ ),那么就是满足条件的结果,这里只是求出三个数值中的第一个,但是因为其他两个分别是他的2倍和3倍,所以你懂的,直接打印出来就可以了,over , 打字比研究代码花的时间要多几倍

hacker.jin 发表于 2017-10-22 22:48:14

192 384 576
219 438 657
273 546 819
327 654 981

hacker.jin 发表于 2017-10-22 23:07:32

别忘记采纳,打中文很累的,

御笔剑客 发表于 2017-10-23 07:33:07

hacker.jin 发表于 2017-10-22 22:43
首先因为只有三位数,所以结果中最大的值为987(不能有重复数值),除以3就是329(也就是 小于330),而最 ...

谢谢了,我懂了
页: [1]
查看完整版本: 下面的题目这种解法是什么意思呢?