导航:首页 > 源码编译 > 算法提升开灯游戏C语言

算法提升开灯游戏C语言

发布时间:2022-09-13 03:23:56

⑴ C语言开灯问题就解释,题目什么意思

//我觉得7号灯肯定是在关闭状态
//因为第1个人把所有等打开,那么只有第7个人是7的倍数,
//所以第7个人会把第7个灯关闭掉,7号灯的状态肯定是关闭的
//所以说你这个输出有可能是错误的。
//给你写的完整代码,希望能帮到你。
#include<stdio.h>
#defineN1000
structLight
{
intnum;
intonOff;//1打开0关闭
};
intmain()
{
intn,k,i;
Lightlight[N];
scanf("%d%d",&k,&n);
if(k>n||n>1000) //不符合条件的直接返回
return0;
for(i=0;i<N;i++)//初始化灯都是亮着的,因为第1个人会把所有灯打开
{
light[i].onOff=1;
light[i].num=i+1;
}
for(i=2;i<=k;i++)//从第2个人开始循环,一直到第k个
for(intj=0;j<n;j++)
if(light[j].num%i==0&&light[j].num>=i)//如果灯的编号是人的编号的倍数,且灯号大于人号
{
if(light[j].onOff==1)//如果是开,就关闭,否则打开
light[j].onOff=0;
elselight[j].onOff=1;
//输出信息
printf("i=%d第%d号灯,状态:%d ",i,light[j].num,light[j].onOff);
}

for(i=0;i<n;i++)//遍历,输出所有打开的灯
if(light[i].onOff==1)
printf("%d",light[i].num);
printf(" ");
return0;
}

⑵ 求助C语言中的开灯问题!有n盏灯 编号1~n 第一个人把所有灯点亮 ,第2个人按下所有编号为2的倍

这个是白皮书上的题吧。。
把数组a清零之后,每次 j%i==0 a[j] = !a[j];取反的意思就是把0变非零,非零变零。
0和非零,来模拟灯的状态,0表示灯在关着,取非!之后表示灯在开着。
if(first)first = 0;就是为了满足题意的输出要求,书上写的很清楚,如果是想要单纯学算法,不需要在意那些细节,掌握重要思路及代码就行了;如果要比赛,这个就比较重要,需要谨慎。
if(first)就相当于if(first!=0)的意思。
还有什么不懂的吗?

⑶ 用c语言实现算法led0亮2秒,led1亮3秒,led1灭2秒,led0灭5秒程序

貌似是考多线程,你这里面没说明同步规则,就分开写吧:
void led0thread()
{
while(1)

{

led0.light();

Sleep(2000);

led0.turnoff();

Sleep(5000);

}

}

void led1thread()
{
while(1)

{

led0.light();

Sleep(3000);

led0.turnoff();

Sleep(2000);

}

}

⑷ 开灯问题用C语言怎么解决

#include"stdio.h"
voidmain()
{
/*0表示关灯,1表示开灯*/
intn,k,a[101],i,b,c,d;

printf("输入人数");
scanf("%d",&k);
printf("输入灯的数目");
scanf("%d",&n);
for(i=1;i<101;i++)
{
a[i]=0;
}

for(b=1;b<=k;b++)//这里不能是k++啊!死循环了
{
for(c=1;c<=n;c++)
{
if(c%b==0)
{
if(a[c]==0)
{
a[c]=1;
}else
{
a[c]=0;
}
}
}
}
for(d=1;d<=n;d++)
if(a[d]==1){
printf("%d",d);//加上空格,看着清楚些
}
}

⑸ 大神们,求解一道算法编程,最好只用C语言编写,拜托啦= =

#include<stdio.h>
#include<stdlib.h>
intmain()
{intn,i,j,m,t,x,a[1000];
scanf("%d",&n);
a[0]=rand()%25;
printf("%d",a[0]);
for(i=1;i<n;i++)
{a[i]=a[i-1]+rand()%10+1;
printf("%d",a[i]);
}
printf(" x=");
scanf("%d",&x);
for(i=0,j=n-1;i<j;)
{m=(i+j)/2;
if(a[m]==x){j=m;break;}
elseif(a[m]<x)i=m+1;
elsej=m;
}
if(a[j]==x)
{t=a[j];a[j]=a[j+1];a[j+1]=t;}
else
{if(a[j]<x)j++;
for(i=n;i>j;i--)a[i]=a[i-1];
a[j]=x;
n++;
}
for(i=0;i<n;)
printf("%d",a[i++]);
printf(" ");
return0;
}

⑹ C语言开灯问题,有n(n<100)盏灯,编号为1~n。第一个人把所有灯都打开,第二个人按下所有

看代码比写代码麻烦,写一个你作参考……

//#include"stdafx.h"//Ifthevc++6.0,withthisline.
#include"stdio.h"
intmain(void){
charlight[101];
intn,k,i,j;
while(1){
printf("Inputn&k(0<n<1000<k<=n)... n=");
if(scanf("%d%d",&n,&k)&&n>0&&n<100&&k>0&&k<=n)
break;
printf("Error,redo:");
}
for(i=1;i<=n;light[i++]=1);
for(i=2;i<=k;i++)
for(j=i;j<=n;j++)
if(j%i==0)
light[j]^=1;
for(i=1;i<=n;i++)
if(light[i])
printf("%d",i);
printf(" ");
return0;
}

⑺ 开灯问题用C语言中的数组怎么解决

#include <stdio.h>
#define n 100
void main(void)
{
int i, j, a[n];

for(i = 0; i < n; i++) a[i] = 0;// 初始化为全0

for(i = 1; i <= n; i++)
for(j = i ; j <= n; j = j + i)
a[j - 1] += 1;

//100人对100灯,都操作完毕,下面是显示

for(i = 0; i < n; i++) {
if((i % 8) == 0) printf("\n");
printf(" L%2d: %d, ", i + 1, a[i] % 2);
}

printf("\n");
}
/*
运行结果显示如下:

L 1: 1, L 2: 0, L 3: 0, L 4: 1, L 5: 0, L 6: 0, L 7: 0, L 8: 0,
L 9: 1, L10: 0, L11: 0, L12: 0, L13: 0, L14: 0, L15: 0, L16: 1,
L17: 0, L18: 0, L19: 0, L20: 0, L21: 0, L22: 0, L23: 0, L24: 0,
L25: 1, L26: 0, L27: 0, L28: 0, L29: 0, L30: 0, L31: 0, L32: 0,
L33: 0, L34: 0, L35: 0, L36: 1, L37: 0, L38: 0, L39: 0, L40: 0,
L41: 0, L42: 0, L43: 0, L44: 0, L45: 0, L46: 0, L47: 0, L48: 0,
L49: 1, L50: 0, L51: 0, L52: 0, L53: 0, L54: 0, L55: 0, L56: 0,
L57: 0, L58: 0, L59: 0, L60: 0, L61: 0, L62: 0, L63: 0, L64: 1,
L65: 0, L66: 0, L67: 0, L68: 0, L69: 0, L70: 0, L71: 0, L72: 0,
L73: 0, L74: 0, L75: 0, L76: 0, L77: 0, L78: 0, L79: 0, L80: 0,
L81: 1, L82: 0, L83: 0, L84: 0, L85: 0, L86: 0, L87: 0, L88: 0,
L89: 0, L90: 0, L91: 0, L92: 0, L93: 0, L94: 0, L95: 0, L96: 0,
L97: 0, L98: 0, L99: 0, L100: 1,
Press any key to continue
*/

⑻ C语言的开灯问题,有短代码不理解 求大神解答。

a[j]=!a[j]的意思是a[j]取原来值的逻辑反,比如原来为0,则取反后为1保存,原来如果是1,则运算后保存为0, 可以用a[j]=1-a[j];代替

⑼ 适合初学者的24点游戏C语言源代码

关于二十四点游戏的编程思路与基本算法

漫长的假期对于我来说总是枯燥无味的,闲来无聊便和同学玩起童年时经常玩的二十四点牌游戏来。此游戏说来简单,就是利用加减乘除以及括号将给出的四张牌组成一个值为24的表达式。但是其中却不乏一些有趣的题目,这不,我们刚玩了一会儿,便遇到了一个难题——3、6、6、10(其实后来想想,这也不算是个太难的题,只是当时我们的脑筋都没有转弯而已,呵呵)。

问题既然出现了,我们当然要解决。冥思苦想之际,我的脑中掠过一丝念头——何不编个程序来解决这个问题呢?文曲星中不就有这样的程序吗?所以这个想法应该是可行。想到这里我立刻开始思索这个程序的算法,最先想到的自然是穷举法(后来发现我再也想不到更好的方法了,悲哀呀,呵呵),因为在这学期我曾经写过一个小程序——计算有括号的简单表达式。只要我能编程实现四个数加上运算符号所构成的表达式的穷举,不就可以利用这个计算程序来完成这个计算二十四点的程序吗?确定了这个思路之后,我开始想这个问题的细节。
首先穷举的可行性问题。我把表达式如下分成三类——
1、 无括号的简单表达式。
2、 有一个括号的简单表达式。
3、 有两个括号的较复4、 杂表达式。
穷举的开始我对给出的四个数进行排列,其可能的种数为4*3*2*1=24。我利用一个嵌套函数实现四个数的排列,算法如下:
/* ans[] 用来存放各种排列组合的数组 */
/* c[] 存放四张牌的数组 */
/* k[] c[]种四张牌的代号,其中k[I]=I+1。
用它来代替c[]做处理,考虑到c[]中有可能出现相同数的情况 */
/* kans[] 暂存生成的排列组合 */
/* j 嵌套循环的次数 */
int fans(c,k,ans,kans,j)
int j,k[],c[];char ans[],kans[];
{ int i,p,q,r,h,flag,s[4],t[4][4];
for(p=0,q=0;p<4;p++)
{ for(r=0,flag=0;r if(k[p]!=kans[r]) flag++;
if(flag==j) t[j][q++]=k[p];
}
for(s[j]=0;s[j]<4-j;s[j]++)
{ kans[j]=t[j][s[j>;
if(j==3) { for(h=0;h<4;h++)
ans[2*h]=c[kans[h]-1]; /* 调整生成的排列组合在最终的表
达式中的位置 */
for(h=0;h<3;h++)
symbol(ans,h); /* 在表达式中添加运算符号 */
}
else { j++;
fans(c,k,ans,kans,j);
j--;
}
}
}

正如上面函数中提到的,在完成四张牌的排列之后,在表达式中添加运算符号。由于只有四张牌,所以只要添加三个运算符号就可以了。由于每一个运算符号可重复,所以计算出其可能的种数为4*4*4=64种。仍然利用嵌套函数实现添加运算符号的穷举,算法如下:

/* ans[],j同上。sy[]存放四个运算符号。h为表达式形式。*/
int sans(ans,sy,j,h)
char ans[],sy[];int j,h;
{ int i,p,k[3],m,n; char ktans[20];
for(k[j]=0;k[j]<4;k[j]++)
{ ans[2*j+1]=sy[k[j>; /* 刚才的四个数分别存放在0、2、4、6位
这里的三个运算符号分别存放在1、3、5位*/
if(j==2)
{ ans[5]=sy[k[j>;
/* 此处根据不同的表达式形式再进行相应的处理 */
}
else { j++; sans(ans,sy,j--,h); }
}
}

好了,接下来我再考虑不同表达式的处理。刚才我已经将表达式分为三类,是因为添加三个括号对于四张牌来说肯定是重复的。对于第一种,无括号自然不用另行处理;而第二种情况由以下代码可以得出其可能性有六种,其中还有一种是多余的。
for(m=0;m<=4;m+=2)
for(n=m+4;n<=8;n+=2)
这个for循环给出了添加一个括号的可能性的种数,其中m、n分别为添加在表达式中的左右括号的位置。我所说的多余的是指m=0,n=8,也就是放在表达式的两端。这真是多此一举,呵呵!最后一种情况是添加两个括号,我分析了一下,发现只可能是这种形式才不会是重复的——(a b)(c d)。为什么不会出现嵌套括号的情况呢?因为如果是嵌套括号,那么外面的括号肯定是包含三个数字的(四个没有必要),也就是说这个括号里面包含了两个运算符号,而这两个运算符号是被另外一个括号隔开的。那么如果这两个运算符号是同一优先级的,则肯定可以通过一些转换去掉括号(你不妨举一些例子来试试),也就是说这一个括号没有必要;如果这两个运算符号不是同一优先级,也必然是这种形式((a+-b)*/c)。而*和/在这几个运算符号中优先级最高,自然就没有必要在它的外面添加括号了。

综上所述,所有可能的表达式的种数为24*64*(1+6+1)=12288种。哈哈,只有一万多种可能性(这其中还有重复),这对于电脑来说可是小case哟!所以,对于穷举的可行性分析和实现也就完成了。

接下来的问题就是如何对有符号的简单表达式进行处理。这是栈的一个着名应用,那么什么是栈呢?栈的概念是从日常生活中货物在货栈种的存取过程抽象出来的,即最后存放入栈的货物(堆在靠出口处)先被提取出去,符合“先进后出,后进先出”的原则。这种结构犹如子弹夹。
在栈中,元素的插入称为压入(push)或入栈,元素的删除称为弹出(pop)或退栈。

栈的基本运算有三种,其中包括入栈运算、退栈运算以及读栈顶元素,这些请参考相关数据结构资料。根据这些基本运算就可以用数组模拟出栈来。

那么作为栈的着名应用,表达式的计算可以有两种方法。

第一种方法——
首先建立两个栈,操作数栈OVS和运算符栈OPS。其中,操作数栈用来记忆表达式中的操作数,其栈顶指针为topv,初始时为空,即topv=0;运算符栈用来记忆表达式中的运算符,其栈顶指针为topp,初始时,栈中只有一个表达式结束符,即topp=1,且OPS(1)=‘;’。此处的‘;’即表达式结束符。
然后自左至右的扫描待处理的表达式,并假设当前扫描到的符号为W,根据不同的符号W做如下不同的处理:
1、 若W为操作数
2、 则将W压入操作数栈OVS
3、 且继续扫描下一个字符
4、 若W为运算符
5、 则根据运算符的性质做相应的处理:
(1)、若运算符为左括号或者运算符的优先级大于运算符栈栈顶的运算符(即OPS(top)),则将运算符W压入运算符栈OPS,并继续扫描下一个字符。
(2)、若运算符W为表达式结束符‘;’且运算符栈栈顶的运算符也为表达式结束符(即OPS(topp)=’;’),则处理过程结束,此时,操作数栈栈顶元素(即OVS(topv))即为表达式的值。
(3)、若运算符W为右括号且运算符栈栈顶的运算符为左括号(即OPS(topp)=’(‘),则将左括号从运算符栈谈出,且继续扫描下一个符号。
(4)、若运算符的右不大于运算符栈栈顶的运算符(即OPS(topp)),则从操作数栈OVS中弹出两个操作数,设先后弹出的操作数为a、b,再从运算符栈OPS中弹出一个运算符,设为+,然后作运算a+b,并将运算结果压入操作数栈OVS。本次的运算符下次将重新考虑。

第二种方法——
首先对表达式进行线性化,然后将线性表达式转换成机器指令序列以便进行求值。

那么什么是表达式的线性化呢?人们所习惯的表达式的表达方法称为中缀表示。中缀表示的特点是运算符位于运算对象的中间。但这种表示方式,有时必须借助括号才能将运算顺序表达清楚,而且处理也比较复杂。

1929年,波兰逻辑学家Lukasiewicz提出一种不用括号的逻辑符号体系,后来人们称之为波兰表示法(Polish notation)。波兰表达式的特点是运算符位于运算对象的后面,因此称为后缀表示。在对波兰表达式进行运算,严格按照自左至右的顺序进行。下面给出一些表达式及其相应的波兰表达式。
表达式 波兰表达式
A-B AB-
(A-B)*C+D AB-C*D+
A*(B+C/D)-E*F ABCD/+*EF*-
(B+C)/(A-D) BC+AD-/

OK,所谓表达式的线性化是指将中缀表达的表达式转化为波兰表达式。对于每一个表达式,利用栈可以把表达式变换成波兰表达式,也可以利用栈来计算波兰表达式的值。

至于转换和计算的过程和第一种方法大同小异,这里就不再赘述了。

下面给出转换和计算的具体实现程序——

/* first函数给出各个运算符的优先级,其中=为表达式结束符 */
int first(char c)
{ int p;
switch(c)
{ case '*': p=2; break;
case '/': p=2; break;
case '+': p=1; break;
case '-': p=1; break;
case '(': p=0; break;
case '=': p=-1; break;
}
return(p);
}
/* 此函数实现中缀到后缀的转换 */
/* M的值宏定义为20 */
/* sp[]为表达式数组 */
int mid_last()
{ int i=0,j=0; char c,sm[M];
c=s[0]; sm[0]='='; top=0;
while(c!='\0')
{ if(islower(c)) sp[j++]=c;
else switch(c)
{ case '+':
case '-':
case '*':
case '/': while(first(c)<=first(sm[top]))
sp[j++]=sm[top--];
sm[++top]=c; break;
case '(': sm[++top]=c; break;
case ')': while(sm[top]!='(')
sp[j++]=sm[top--];
top--; break;
default :return(1);
}
c=s[++i];
}
while(top>0) sp[j++]=sm[top--];
sp[j]='\0'; return(0);
}
/* 由后缀表达式来计算表达式的值 */
int calc()
{ int i=0,sm[M],tr; char c;
c=sp[0]; top=-1;
while(c!='\0')
{ if(islower(c)) sm[++top]=ver[c-'a'];/*在转换过程中用abcd等来代替数,
这样才可以更方便的处理非一位数,
ver数组中存放着这些字母所代替的数*/
else switch(c)
{ case '+': tr=sm[top--]; sm[top]+=tr; break;
case '-': tr=sm[top--]; sm[top]-=tr; break;
case '*': tr=sm[top--]; sm[top]*=tr; break;
case '/': tr=sm[top--];sm[top]/=tr;break;
default : return(1);
}
c=sp[++i];
}
if(top>0) return(1);
else { result=sm[top]; return(0); }
}

这样这个程序基本上就算解决了,回过头来拿这个程序来算一算文章开始的那个问题。哈哈,算出来了,原来如此简单——(6-3)*10-6=24。

最后我总结了一下这其中容易出错的地方——

1、 排列的时候由于一个数只能出现一次, 所以必然有一个判断语句。但是用什么来判断,用大小显然不行,因为有可能这四个数中有两个或者以上的数是相同的。我的方法是给每一个数设置一个代号,在排列结束时,通过这个代号找到这个数。

2、在应用嵌套函数时,需仔细分析程序的执行过程,并对个别变量进行适当的调整(如j的值),程序才能正确的执行。

3、在分析括号问题的时候要认真仔细,不要错过任何一个可能的机会,也要尽量使程序变得简单一些。不过我的分析可能也有问题,还请高手指点。

4、在用函数对一个数组进行处理的时候,一定要注意如果这个数组还需要再应用,就必须将它先保存起来,否则会出错,而且是很严重的错误。

5、在处理用户输入的表达式时,由于一个十位数或者更高位数是被分解成各位数存放在数组中,所以需对它们进行处理,将它们转化成实际的整型变量。另外,在转化过程中,用一个字母来代替这个数,并将这个数存在一个数组中,且它在数组中的位置和代替它的这个字母有一定的联系,这样才能取回这个数。

6、由于在穷举过程难免会出现计算过程中有除以0的计算,所以我们必须对calc函数种对于除的运算加以处理,否则程序会因为出错而退出(Divide by 0)。

7、最后一个问题,本程序尚未解决。对于一些比较着名的题目,本程序无法解答。比如说5、5、5、1或者8、8、3、3。这是由于这些题目在计算的过程用到了小数,而本程序并没有考虑到小数。

⑽ 需要一个C语言程序。51单片机控制:按键按一下,延迟1分钟后开灯,灯亮半个小时就熄灭的程序急需!

如果对时间要求不精确,用软延时即可。
#include<reg52.h>
#define uchar unsigned char

#define uint unsigned int
sbit s=P1^0;

sbit led=P1^1;
void delayms(uint i) //1ms延时程序

{
uchar j;
for(;i>0;i--)
{
for(j=0;j<125;j++)//如果延时时间误差较大,可按比例改变125这个数
//取值范围0-255,数值越大,延时越长
{;}
}
}
void delay1s(uint i) //1s延时程序

{
for(;i>0;i--){delay1ms(1000);}
}

void main()
{
led=0;

while(1)
{
if (s==0)
{
delayms(20);
if (s==0);{delay1s(60);led=1; }
}
if(led==1){delay1s(1800);led=0; }
}
}
如果对时间要求精确,则要用到定时器,还要确保电路外接有晶振,并已知晶振频率

阅读全文

与算法提升开灯游戏C语言相关的资料

热点内容
卡尔曼滤波算法书籍 浏览:764
安卓手机怎么用爱思助手传文件进苹果手机上 浏览:841
安卓怎么下载60秒生存 浏览:800
外向式文件夹 浏览:233
dospdf 浏览:428
怎么修改腾讯云服务器ip 浏览:385
pdftoeps 浏览:490
为什么鸿蒙那么像安卓 浏览:733
安卓手机怎么拍自媒体视频 浏览:183
单片机各个中断的初始化 浏览:721
python怎么集合元素 浏览:477
python逐条解读 浏览:829
基于单片机的湿度控制 浏览:496
ios如何使用安卓的帐号 浏览:880
程序员公园采访 浏览:809
程序员实战教程要多长时间 浏览:972
企业数据加密技巧 浏览:132
租云服务器开发 浏览:811
程序员告白妈妈不同意 浏览:333
攻城掠地怎么查看服务器 浏览:600