C++面试题:循环数列问题

21     22     23     24     25     …

20     7       8       9       10

19     6       1       2       11

18     5       4       3       12

17     16     15     14     13

看清以上数字排列的规律,设1点的坐标是(0, 0), x方向向右为正,y方向向下为正。例如,7的坐标为(-1, -1),2的坐标为(0, 1),3的坐标为(1, 1)。编程实现输入任意一点坐标(x, y), 输出所对应的数字。

 

先不妨在更大范围内考察各数字之间的关系:

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

210

157

158

159

160

161

162

163

164

165

166

167

168

169

170

227

209

156

111

112

113

114

115

116

117

118

119

120

121

122

171

228

208

155

110

73

74

75

76

77

78

79

80

81

82

123

172

229

207

154

109

72

43

44

45

46

47

48

49

50

83

124

173

230

206

153

108

71

42

21

22

23

24

25

26

51

84

125

174

231

205

152

107

70

41

20

7

 

8

9

10

27

52

85

126

175

232

204

151

106

69

40

19

6

1

2

11

28

53

86

127

176

233

203

150

105

68

39

18

5

4

3

12

29

54

87

128

177

234

202

149

104

67

38

17

16

15

14

13

30

55

88

129

178

235

201

148

103

66

37

36

35

34

33

32

31

56

89

130

179

236

200

147

102

65

64

63

62

61

60

59

58

57

90

131

180

237

199

146

101

100

99

98

97

96

95

94

93

92

91

132

181

238

198

145

144

143

142

141

140

139

138

137

136

135

134

133

182

239

197

196

195

194

193

192

191

190

189

188

187

186

185

184

183

240

 

当x > 0 时:

1,2,11,28,53,86, …                  (1)

他们之间的差分别是:

1,9,17,25,33…

这是一个公差为8的等差数列(arithmetic sequence),其第n项可以用a(n) = 1 + (n – 1) * 8表示,那么数列(1)的第n项可以表示如下:

x(n) = x(n – 1) + a(n) = x(n – 1) + 1 + (n – 1) * 8

由上面的公式,很容易想到需要用递归的方法来解决。由于要用到递归,因此x(n)的表达式中除x(n – 1)外,其他都必须展开。

 

同理,当x < 0时:

x(n) = x(n - 1) + 5 + (n - 1) * 8

上面的n是取了绝对值后的情况。

 

同理,当y > 0时:

y(n) = y(n – 1) + 3 + (n - 1) * 8

 

同理,当y < 0时:

y(n) = y(n – 1) + 7 + (n - 1) * 8

上面的n是取了绝对值后的情况。

 

解决上述问题的代码如下,应该有很大的改善空间。不过其优点就是不复杂,易懂。

// for x > 0

int calculateX(int n)

{

         if(n > 0)

         {

                   return calculateX(n - 1) + (1 + (n - 1) * 8) /*calculateIncrement(n - 1)*/;

         }

         else

         {

                   return 1;

         }

}

 

// for x < 0

int calculateMX(int n)

{

         if(n > 0)

         {

                   return calculateMX(n - 1) + (5 + (n - 1) * 8);

         }

         else

         {

                   return 1;

         }

}

 

// for y > 0

int calculateY(int n)

{

         if(n > 0)

         {

                   return calculateY(n - 1) + (3 + (n - 1) * 8);

         }

         else

         {

                   return 1;

         }

}

 

// for Y < 0

int calculateMY(int n)

{

         if(n > 0)

         {

                   return calculateMY(n - 1) + (7 + (n - 1) * 8);

         }

         else

         {

                   return 1;

         }

}

 

// calculate the value at specified coordinates

int calculate(int x, int y)

{

         int ret = 0;

         if ((x > 0) && (y > 0))

         {

                   if( x > y)

                   {

                            ret = calculateX(x) + y;

                   }

                   else

                   {

                            ret = calculateY(y) - x;

                   }

         }

 

         if ((x > 0) && (y < 0))

         {

                   if( x > abs(y))

                   {

                            ret = calculateX(x) + y;

                   }

                   else

                   {

                            ret = calculateMY(abs(y)) + x;

                   }

         }

 

         if ((x < 0) && (y < 0))

         {

                   if( abs(x) > abs(y))

                   {

                            ret = calculateMX(abs(x)) - y;

                   }

                   else

                   {

                            ret = calculateMY(abs(y)) + x;

                   }

         }

 

         if ((x < 0) && (y > 0))

         {

                   if( abs(x) > abs(y))

                   {

                            ret = calculateMX(abs(x)) - y;

                   }

                   else

                   {

                            ret = calculateY(y) - x;

                   }

         }

         return ret;

}

 

int main()

{

         int x = 0;

         int y = 0;

         cout << "Please enter coordinates. CTRL + Z to quit." << endl;

         while(cin >> x >> y)

         {

                   cout << "(" << x << ", " << y << ") = " << calculate(x, y) << endl;

         }

 

         return 0;

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值