鱼C论坛

 找回密码
 立即注册
查看: 1752|回复: 4

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

[复制链接]
发表于 2017-10-22 11:37:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>
  2. #include <string.h>


  3. int main(int argc, const char * argv[])
  4. {  
  5.     //用1,2,3...9组成3个三位数abc, def, ghi, 每个数字恰好使用一次,且abc:def:ghi=1:2:3,输出所有解。
  6.     int n, i, j;
  7.     char a[10];
  8.     for(n = 123; n < 330; n++){
  9.         sprintf(a, "%d", n * 1000000 + n * 2 * 1000 + n * 3);
  10.         
  11.         for(j = 0, i = '1'; i <= '9'; memchr(a, i++, 9) && j++);
  12.         
  13.         if (j == 9) {
  14.             printf("%d %d %d \n", n, n * 2, n * 3);
  15.         }
  16.     }
  17. return 0;
  18. }
复制代码
最佳答案
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 , 打字比研究代码花的时间要多几倍
QQ截图20171022113655.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 , 打字比研究代码花的时间要多几倍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-10-22 22:48:14 | 显示全部楼层
192 384 576
219 438 657
273 546 819
327 654 981
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-22 23:07:32 | 显示全部楼层
别忘记采纳,打中文很累的,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢了,我懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 21:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表