面试题求高手解答谢谢

sunqiyuan1985 2011-04-22 11:26:21
斯诺克台球共有21个球,其中有15个红色一分球,另有其它颜色的2,3,4,5,6,7分球各一个,规则是先打一个红色球,然后可以打一个其他分值的球,如此反复,如果台面还有红色球,打入的高分球计分,同时拿出来放回原位置,当打入最后一个红球后再去打其它色球时,那个色球同样要拿出来放回原位,接着按照分数由低到高,分别将2到7分的各色球打尽.要求写一段简单的c函数,实现输入台面上剩余球的数目,计算出可得的最高分。(不考虑罚分等特殊情况)

以下代码得到的sum是0xffff,对吗?

int i = 0;
unsigned int sum = 0;
for (; i < 16; i++)
sum = sum + 1U<<i;
...全文
254 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunqiyuan1985 2011-04-22
  • 打赏
  • 举报
回复
为什么
wanmeiluck123 2011-04-22
  • 打赏
  • 举报
回复
先打红球应该是14*7 +15 + 2 + 3 + 4 + 5 + 6 + 7吧?
wanmeiluck123 2011-04-22
  • 打赏
  • 举报
回复
为什么我感觉是140呢??
c_losed 2011-04-22
  • 打赏
  • 举报
回复
以下代码得到的sum是0xffff,对吗?

肯定不对。。。。
sunqiyuan1985 2011-04-22
  • 打赏
  • 举报
回复
刚才仔细看了下 谢谢大家 很受益 别人思想
sunqiyuan1985 2011-04-22
  • 打赏
  • 举报
回复
谢谢大家 我仔细看看
svtanto 2011-04-22
  • 打赏
  • 举报
回复
我写了个短的例子供楼主参考一下。

#include <stdio.h>
#include <stdlib.h>

#define COUNT 21

// 是否还有球
int
HasNum(
int *ball
);

// 最小分数的球
int Min(
int *ball
);
// 最大分数的球
int Max(
int *ball
);

int
main(
const int argc,
const char *argv[]
)
{
int ball[COUNT];
int idx;
int sum = 0;
// 初期化为1分的球和2 3 4 5 6 7分的球
for (idx = 0; idx < COUNT; ++idx) {
ball[idx] = idx < COUNT - 7 ? 1 : COUNT - idx;
}
// 如果还有球,就循环
while (HasNum(ball)) {
// 取最小分数的球
int min = Min(ball);
// 累计最小分数的球的得分
sum += ball[min];
// 如果最小分数的球是1分,说明可以打一个其他颜色的球
if (ball[min] == 1) {
// 取最大分数的球
int max = Max(ball);
// 累计最大颜色的分的球
sum += ball[max];
}
// 打过的最小颜色的分数的球不能在打了,设置为0分
ball[min] = 0;
}
// 输出结果
printf("sum=%d\n", sum);

return 0;
}

// 是否还有球
int
HasNum(
int *ball
)
{
int idx;
for (idx = 0; idx < COUNT; ++idx) {
if (ball[idx] != 0) {
return 1;
}
}
return 0;
}

// 最小分数的球
int
Min(
int *ball
)
{
int idx;
int minpos = -1;
int value = 0x7FFFFFFF;
for (idx = 0; idx < COUNT; ++idx) {
if ((value > ball[idx]) && (ball[idx] > 0)) {
value = ball[idx];
minpos = idx;
}
}
return minpos;
}
// 最大分数的球
int Max(
int *ball
)
{
int idx;
int maxpos = -1;
int value = 0;
for (idx = 0; idx < COUNT; ++idx) {
if (value < ball[idx]) {
value = ball[idx];
maxpos = idx;
}
}
return maxpos;
}
qiaolixian 2011-04-22
  • 打赏
  • 举报
回复
int LeftTotalMax(int iRedNum)
{
if (iRedNum >=0 && iRedNum <= 15)
{
return (iRedNum<<3+27); //相当于一个红,一个黑,总共8分,iRedNum*8,最后27分全收
}
else
{
return -1;
}
}
试试这个,应该可以。
Golden_Shadow 2011-04-22
  • 打赏
  • 举报
回复
int count (const int sum)
{
int value ;
int i ;

value = 0 ;
for (i = sum; i > 6; i--)
value += (7 + 1) ;
while (i > 0)
{
switch (i)
{
case 6 : value += 7 ;
break ;
case 5 : value += 6 ;
break ;
case 4 : value += 5 ;
break ;
case 3 : value += 4 ;
break ;
case 2 : value += 3 ;
break ;
case 1 : value += 2 ;
break ;
}
i-- ;
}

return value ;
}
David_Hu 2011-04-22
  • 打赏
  • 举报
回复
if(inputNum>6)
{
sum=27+(inputNum-6)*7;
}else
{
sum=0;
for(ini i=0;i<inputNum;i++)
sum=sum+(7-i);
}
David_Hu 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wo_aidoudou 的回复:]
int x; /* 剩余球的数目 */
int red; /* 剩余红色球数目 */
int sum; /* 能够得到的最高分数 */

red = x - 6; /* 其它颜色球总数为6 */
sum = red * 7 + red + 2 + 3 + 4 + 5 + 6 + 7;

这样我们可以知道斯诺克的满分其实就是15*7+15+2+3+4+5+6+7=147!
[/Quote]
楼上的说法是对的,只是没有算桌面上球数小于等于6个的情况

会打斯诺克的人就会知道规则,做起来就简单了
输入桌面上的球数就表示选手按击打规则重新击球了
zhanghuayi_xiyou 2011-04-22
  • 打赏
  • 举报
回复

int LeftTotalMax(int iRedNum)
{
if (iRedNum >=0 && iRedNum <= 15)
{
return (iRedNum<<3+27); //相当于一个红,一个黑,总共8分,iRedNum*8,最后27分全收
}
else
{
return -1;
}
}

wo_aidoudou 2011-04-22
  • 打赏
  • 举报
回复
int x; /* 剩余球的数目 */
int red; /* 剩余红色球数目 */
int sum; /* 能够得到的最高分数 */

red = x - 6; /* 其它颜色球总数为6 */
sum = red * 7 + red + 2 + 3 + 4 + 5 + 6 + 7;

这样我们可以知道斯诺克的满分其实就是15*7+15+2+3+4+5+6+7=147!
super0wei 2011-04-22
  • 打赏
  • 举报
回复
这个说不定吧
要看你上次击的是什么球
比如桌面球数大于等于6的情况下,上次击球为花色,那么这次就要击红色球,那么最高分为:
(n-6)*8+27
要是上次击的是红色球,那么这次击的是花色球,并且进球后还得拿出来,那么最高分为:
7+(n-6)*8+27
小于6个球就可以直接算分呗,这个就不用我说了吧
tyx_tc 2011-04-22
  • 打赏
  • 举报
回复
不是147吗?int sum;
for(int i=0;i<15;i++)
{sum+=1+7;}
for(int i=7;i>2;i--)
{sum+=i;}
printf("%d"sum);
xunfeng_2008 2011-04-22
  • 打赏
  • 举报
回复
这是简单的题目,介绍以下
n = [1, 6] 就是全彩球1个 7, 2个 7 + 6, ......
n > 6 个 最 (n-6)*8 +7+6+5+4+3+2
代码你一定可以的
wx376752150 2011-04-22
  • 打赏
  • 举报
回复

每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
xspace_time 2011-04-22
  • 打赏
  • 举报
回复
假如已知每次击球事件得分,以每次得分作为函数接口
则要将红球和其它6个球分开
int number=21;
if(bumber<6&&bumber>0){number--;sum_score--;}
else if(number==6){number--;sum_score=27;}
else {number--;sum_score=8;}
主要是对规则的理解,不知道有没有问题

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧