fork download
  1. #include <stdio.h>
  2. #include <stdint.h>
  3.  
  4. typedef uint64_t u64;
  5.  
  6. // 修改後的除法函數,返回商和餘數
  7. void nvme_u64_div(u64 dividend, u64 divisor, u64* quotient, u64* remainder) {
  8. *quotient = 0;
  9. *remainder = 0;
  10. int i;
  11. for (i = 63; i >= 0; i--) {
  12. *remainder = (*remainder << 1) | ((dividend >> i) & 1);
  13. if (*remainder >= divisor) {
  14. *remainder -= divisor;
  15. *quotient |= (1ULL << i);
  16. }
  17. }
  18. }
  19.  
  20. // 測試案例結構
  21. typedef struct {
  22. u64 dividend;
  23. u64 divisor;
  24. u64 expected_quotient;
  25. u64 expected_remainder;
  26. } TestCase;
  27.  
  28. // 執行測試並打印結果
  29. void run_test_case(TestCase test) {
  30. u64 quotient, remainder;
  31. nvme_u64_div(test.dividend, test.divisor, &quotient, &remainder);
  32.  
  33. printf("Dividend: %llu\n", test.dividend);
  34. printf("Divisor: %llu\n", test.divisor);
  35. printf("Expected Quotient: %llu\n", test.expected_quotient);
  36. printf("Actual Quotient: %llu\n", quotient);
  37. printf("Expected Remainder: %llu\n", test.expected_remainder);
  38. printf("Actual Remainder: %llu\n", remainder);
  39. printf("Test %s\n\n",
  40. (quotient == test.expected_quotient && remainder == test.expected_remainder)
  41. ? "PASSED" : "FAILED");
  42. }
  43.  
  44. int main() {
  45. // 測試案例數組
  46. TestCase test_cases[] = {
  47. // 正常案例
  48. {1000000000000000000ULL, 3ULL, 333333333333333333ULL, 1ULL},
  49. {9223372036854775807ULL, 2ULL, 4611686018427387903ULL, 1ULL},
  50. {18446744073709551615ULL, 9223372036854775807ULL, 2ULL, 1ULL},
  51.  
  52. // 邊界案例
  53. {18446744073709551615ULL, 1ULL, 18446744073709551615ULL, 0ULL},
  54. {18446744073709551615ULL, 18446744073709551615ULL, 1ULL, 0ULL},
  55. {0ULL, 18446744073709551615ULL, 0ULL, 0ULL},
  56.  
  57. // 特殊案例
  58. {18446744073709551614ULL, 2ULL, 9223372036854775807ULL, 0ULL},
  59. {18446744073709551615ULL, 2ULL, 9223372036854775807ULL, 1ULL},
  60. {18446744073709551615ULL, 3ULL, 6148914691236517205ULL, 0ULL},
  61.  
  62. // 質數案例
  63. {18446744073709551557ULL, 11ULL, 1676976734155413778ULL, 9ULL},
  64. {18446744073709551557ULL, 18446744073709551557ULL, 1ULL, 0ULL},
  65.  
  66. // 2的冪次方案例
  67. {9223372036854775808ULL, 2ULL, 4611686018427387904ULL, 0ULL},
  68. // 注意:2^64 溢出了 u64,所以我們不包括這個案例
  69. };
  70.  
  71. int num_tests = sizeof(test_cases) / sizeof(test_cases[0]);
  72.  
  73. for (int i = 0; i < num_tests; i++) {
  74. printf("Test Case %d:\n", i + 1);
  75. run_test_case(test_cases[i]);
  76. }
  77.  
  78. return 0;
  79. }
  80.  
Success #stdin #stdout 0s 5280KB
stdin
Standard input is empty
stdout
Test Case 1:
Dividend: 1000000000000000000
Divisor: 3
Expected Quotient: 333333333333333333
Actual Quotient: 333333333333333333
Expected Remainder: 1
Actual Remainder: 1
Test PASSED

Test Case 2:
Dividend: 9223372036854775807
Divisor: 2
Expected Quotient: 4611686018427387903
Actual Quotient: 4611686018427387903
Expected Remainder: 1
Actual Remainder: 1
Test PASSED

Test Case 3:
Dividend: 18446744073709551615
Divisor: 9223372036854775807
Expected Quotient: 2
Actual Quotient: 2
Expected Remainder: 1
Actual Remainder: 1
Test PASSED

Test Case 4:
Dividend: 18446744073709551615
Divisor: 1
Expected Quotient: 18446744073709551615
Actual Quotient: 18446744073709551615
Expected Remainder: 0
Actual Remainder: 0
Test PASSED

Test Case 5:
Dividend: 18446744073709551615
Divisor: 18446744073709551615
Expected Quotient: 1
Actual Quotient: 1
Expected Remainder: 0
Actual Remainder: 0
Test PASSED

Test Case 6:
Dividend: 0
Divisor: 18446744073709551615
Expected Quotient: 0
Actual Quotient: 0
Expected Remainder: 0
Actual Remainder: 0
Test PASSED

Test Case 7:
Dividend: 18446744073709551614
Divisor: 2
Expected Quotient: 9223372036854775807
Actual Quotient: 9223372036854775807
Expected Remainder: 0
Actual Remainder: 0
Test PASSED

Test Case 8:
Dividend: 18446744073709551615
Divisor: 2
Expected Quotient: 9223372036854775807
Actual Quotient: 9223372036854775807
Expected Remainder: 1
Actual Remainder: 1
Test PASSED

Test Case 9:
Dividend: 18446744073709551615
Divisor: 3
Expected Quotient: 6148914691236517205
Actual Quotient: 6148914691236517205
Expected Remainder: 0
Actual Remainder: 0
Test PASSED

Test Case 10:
Dividend: 18446744073709551557
Divisor: 11
Expected Quotient: 1676976734155413778
Actual Quotient: 1676976733973595596
Expected Remainder: 9
Actual Remainder: 1
Test FAILED

Test Case 11:
Dividend: 18446744073709551557
Divisor: 18446744073709551557
Expected Quotient: 1
Actual Quotient: 1
Expected Remainder: 0
Actual Remainder: 0
Test PASSED

Test Case 12:
Dividend: 9223372036854775808
Divisor: 2
Expected Quotient: 4611686018427387904
Actual Quotient: 4611686018427387904
Expected Remainder: 0
Actual Remainder: 0
Test PASSED