fork download
  1. /*
  2. http://p...content-available-to-author-only...h.net/test/read.cgi/tech/1402622093/81
  3. [ プログラム ] プログラミングのお題スレ Part4
  4.  
  5. 81 名前:デフォルトの名無しさん [sage]: 2014/06/20(金) 00:35:34.20 ID:eyF0lSTD
  6. お題:0から9のうち8種類の数字を使って4桁の10進数を2個つくり、その積をとると
  7. 4桁の2個の数に使用した8種類の数字はひとつも現れなかった。
  8. この4桁の2個の10進数を求める。
  9.  
  10.   ver.2
  11. */
  12. #include<stdio.h>
  13. #include<stdlib.h>
  14.  
  15. #define DBG_COUNT // 関数コール回数をカウントするならこれを有効にする
  16. // 時間測りたければコメントアウトして無効にする
  17.  
  18. #ifdef DBG_COUNT
  19. int nKeisan = 0; // keisan(); call counter
  20. int nCheck = 0; // check (); call counter
  21. #endif
  22.  
  23. //左辺と右辺で同じ数字があるか探す
  24. // -1 : 同じ数字 あり
  25. // 0 : 〃 なし
  26. int keisan(int *res, int *a)
  27. {
  28. int r, x, i;
  29.  
  30. #ifdef DBG_COUNT
  31. nKeisan++;
  32. #endif
  33. r = *res = (a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3])
  34. * (a[4] * 1000 + a[5] * 100 + a[6] * 10 + a[7]);
  35. while (r) {
  36. x = r % 10;
  37. for (i = 0; i < 8; i++)
  38. if (a[i] == x)
  39. return -1;
  40. r /= 10;
  41. }
  42.  
  43. return 0;
  44. }
  45.  
  46. //左辺に同じ数字があるか探す
  47. // -1 : 同じ数字 あり
  48. // 0 : 〃 なし
  49. int check(int *a, int n)
  50. {
  51. int i;
  52.  
  53. #ifdef DBG_COUNT
  54. nCheck++;
  55. #endif
  56. for (i = 0; i < n; i++)
  57. if (a[i] == a[n])
  58. return -1;
  59.  
  60. return 0;
  61. }
  62.  
  63. //
  64. int main()
  65. {
  66. int a[8], r;
  67.  
  68. for (a[0] = 1; a[0] < 9; a[0]++) {
  69. for (a[1] = 0; a[1] < 10; a[1]++) { if (check(a, 1)) continue;
  70. for (a[2] = 0; a[2] < 10; a[2]++) { if (check(a, 2)) continue;
  71. for (a[3] = 0; a[3] < 10; a[3]++) { if (check(a, 3)) continue;
  72. for (a[4] = a[0] + 1; a[4] < 10; a[4]++) { if (check(a, 4)) continue;
  73. for (a[5] = 0 ; a[5] < 10; a[5]++) { if (check(a, 5)) continue;
  74. for (a[6] = 0 ; a[6] < 10; a[6]++) { if (check(a, 6)) continue;
  75. for (a[7] = 0 ; a[7] < 10; a[7]++) { if (check(a, 7)) continue;
  76. if(0 == keisan(&r, a))
  77. printf("%d%d%d%d x %d%d%d%d = %d\n", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], r);
  78. } } } } } } } }
  79. #ifdef DBG_COUNT
  80. "check (); %d called\n"
  81. "keisan(); %d called\n"
  82. , nCheck, nKeisan
  83. );
  84. #endif
  85.  
  86. return 0;
  87. }
  88.  
Success #stdin #stdout 0.06s 2292KB
stdin
Standard input is empty
stdout
5049 x 6712 = 33888888
check (); 3169664 called
keisan(); 725760 called