我来说个
题外话,
你的代码正确与否,要
测试呀,口说无凭
既然数组是 { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 }
那边界点你肯定需要测试到,比如,
输入 0, 1 看看结果是不是 2
输入 14, 15 看看结果是不是 14
输入 15, 14 看看结果是不是 13
输入 2, 1 看看结果是不是 0
输入 1, 0 看看结果是不是 1
当然,也可以写个测试模块,比如
程序代码:
#include <stdio.h>
int 莫启飞( int a, int b )
{
static const int arr[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 };
if( a < b )
return arr[b+1];
return arr[a+1];
}
int apull( int a, int b )
{
int flag;
if( a < b )
flag = (b == 15) ? -1 : 1;
else
flag = (b == 0) ? 1 : -1;
return b + flag;
}
int 某甲( int a, int b )
{
int c = b - a + b;
if( c > 15 )
return 14;
if( c < 0 )
return 1;
return c;
}
int 某乙( int a, int b )
{
return b+1-((a-b+1)/2*30+(b-a)*b)%30/15*2;
}
#include <utility>
int main(void)
{
std::pair<const char*,int (*)(int,int)> funs[] = { {"莫启飞",莫启飞}
, {"apull",apull}
, {"某甲",某甲}
, {"某乙",某乙} };
for( auto fun : funs )
{
bool passed = true;
const int arr[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 };
for( size_t i=0; i!=30; ++i )
{
int a = arr[i];
int b = arr[(i+1)%30];
int c = arr[(i+2)%30];
int result = fun.second( a, b );
if( result != c )
{
printf( " f(%d,%d) = %d, 但你计算出的结果却是 %d\n", a, b, c, result );
passed = false;
}
}
printf( "--- %s 测试%s ---\n", fun.first, passed?"通过":"失败" );
}
}
输出
f(15,14) = 13, 但你计算出的结果却是 14
f(14,13) = 12, 但你计算出的结果却是 15
f(13,12) = 11, 但你计算出的结果却是 14
f(12,11) = 10, 但你计算出的结果却是 13
f(11,10) = 9, 但你计算出的结果却是 12
f(10,9) = 8, 但你计算出的结果却是 11
f(9,8) = 7, 但你计算出的结果却是 10
f(8,7) = 6, 但你计算出的结果却是 9
f(7,6) = 5, 但你计算出的结果却是 8
f(6,5) = 4, 但你计算出的结果却是 7
f(5,4) = 3, 但你计算出的结果却是 6
f(4,3) = 2, 但你计算出的结果却是 5
f(3,2) = 1, 但你计算出的结果却是 4
f(2,1) = 0, 但你计算出的结果却是 3
f(1,0) = 1, 但你计算出的结果却是 2
--- 莫启飞 测试失败 ---
--- apull 测试通过 ---
--- 某甲 测试通过 ---
--- 某乙 测试通过 ---