fork download
  1. // http://t...content-available-to-author-only...h.net/test/read.cgi/tech/1354393458/861
  2. #include <stdio.h>
  3. #include <sys/time.h>
  4.  
  5. // 戻り値 = -1 : 入力値が負
  6. // -2 : 結果が桁あふれする
  7. // メモ = ・計算結果が 31bit-1 = 2147483647 までのものをサポート
  8. int f_31bit(int d)
  9. {
  10. int dd;
  11. int k;
  12. int n; // 桁数
  13. int zero; // ゼロ個数
  14. int res; // 結果
  15.  
  16. // check
  17. if (d < 0) {
  18. return -1;
  19. }
  20. if (d < 10) {
  21. return d;
  22. }
  23. // 桁数数えなど
  24. dd = d / 10;
  25. k = 1;
  26. for (n = 1; dd >= k; n++) {
  27. k *= 10;
  28. }
  29.  
  30. // 0以外をresにいれながら0を数える
  31. res = zero = 0;
  32. for (; n > 0; n--) {
  33. if (d >= k) {
  34. res = res * 10 + d / k;
  35. } else {
  36. zero++;
  37. }
  38. d %= k;
  39. k /= 10;
  40. }
  41.  
  42. // 0を付け加える
  43. for (; zero > 0; zero--) {
  44. if (res > 214748364) { // resが次で10倍されたら桁あふれする
  45. return -2;
  46. }
  47. res *= 10;
  48. }
  49.  
  50. // 終了
  51. return res;
  52. }
  53.  
  54. int main()
  55. {
  56. int v; // 値
  57. v = 20010307;
  58. // v = 1020304050;
  59. // v = 2147483647; // 良い
  60. // v = 2000000014; // 良い
  61. // v = 2000000020; // ダメ (計算結果の 2200000000 は 2147483647(== 2^31-1)を越える)
  62. int ex = 100000; // 実行回数
  63. int count = 10; // 計測回数
  64. int res;
  65. int i, j;
  66. struct timeval s, e;
  67. double sum; // 結果
  68.  
  69. printf("f_31bit(%d);を%d回実行する時間の計測を%d回し、平均時間を出す\n", v, ex, count);
  70. if (0 <= (res = f_31bit(v))) { // 試しに実行
  71. sum = 0.0;
  72. for (j = 0; j < count; j++) {
  73. gettimeofday(&s, NULL);
  74. for (i = 0; i < ex; i++) {
  75. res = f_31bit(v);
  76. }
  77. gettimeofday(&e, NULL);
  78. sum += (e.tv_sec - s.tv_sec) + (e.tv_usec - s.tv_usec) / 1000000.0;
  79. }
  80. printf("result = %d, time = %fms\n", res, 1000.0 * sum / ((double) count));
  81. } else if (-1 == res) {
  82. printf("入力値が負\n");
  83. } else if (-2 == res) {
  84. printf("結果が 2147483647 を越える\n");
  85. }
  86.  
  87. return 0;
  88. }
  89.  
Success #stdin #stdout 0s 2248KB
stdin
Standard input is empty
stdout
f_31bit(20010307);を100000回実行する時間の計測を10回し、平均時間を出す
result = 21370000, time = 0.000200ms