1.有N个人围成一圈,顺序排号.从第1个人开始报数(从1到S报数),凡报到S的人退出圈子,问最后留下的是原来第几号的那 位?
程序:
#include<stdio.h>
int main()
{
int i,n,p=0,s,t=0;
int sb[100];
printf("请输入N的值(N<100)/n");
scanf("%d",&n);
printf("请输入S的值(s<=N)/n");
scanf("%d",&s);
for(i=1;i<=n;i++)
sb[i]=i;
for(i=1;i<=n;i++)
{
if(sb[i]>0)
{
p++;
if(p%s==0)
{ t++;sb[i]=-sb[i];}
if(t==n)
{
printf("最后出去的数是:%d",i);
getch();
return 1;
}
}
if(i==n)
i=0;
}
}
2.5个元素A,B,C,D安顺序入栈,求可能出栈的顺序?
程序:
#include<stdio.h>
#include <stdlib.h>
char in[10]="abcd",stack[10],out[10];
int li=4,ls=0,lo=0,count;
void display(int l)
{
int i;
for(i=0;i<l;i++)
printf("%c ",out[i]);
printf("/n");count++;
}
void f(int x,int y,int z) /*x表示第几个字符入栈,y表示入栈数组的下标,z表示出栈数组的下标*/
{
char s;
if(x==li && z==li)
display(li);
else
{
if(y>0) /* 出栈 */
{
out[z]=stack[y-1];
s=out[z];
f(x,y-1,z+1);
stack[y-1]=s;
}
if(x<li) /* 进栈 */
{
stack[y]=in[x];
f(x+1,y+1,z);
}
}
}
int main()
{
count=0;
f(0,ls,lo);
printf("%d times/n",count);
system("pause");
return 0;
}
3.一个N行N列的表格,要求每个斜列,横列,竖列的和都相等(从1~~N*N-1),写程序.
程序:
#include<stdio.h>
void main()
{
int str[21][21];
int i,j,x,a,t;
printf("请输入一个奇数:/n");
scanf("%d",&i);
j=i/2;
t=i;
a=i*i;
i=0;
for(x=1;x<=a;x++)
{
str[i][j]=x;
if(x%t==0)
i++;
else if(i==0)
{
if(j==t-1)
{
i=t-1;
j=0;
}
else
{
i=t-1;
j++;
}
}
else if(i!=0)
{
if(j==t-1)
{
i--;
j=0;
}
else
{
i--;
j++;
}
}
}
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
printf("%4d",str[i][j]);
printf("/n");
}
}
4.进制转换.输入一个浮点型的数,转换成相应的N进制数.
程序:
#include<stdio.h>
char sb(int a)
{
char c;
if(a>=0&&a<=9)
c='0'+a;
else
c='a'+a-10;
return(c);
}
xiao(float number,int h)
{
int pn[10],t=0,i;
number=number-(int)number;
while(number!=0)
{
pn[t]=number*h;
number=number*h-(int)(number*h);
t++;
}
for(i=0;i<t;i++)
printf("%c",sb(pn[i]));
}
zheng(float number ,int n)
{
int num,t=0;
int st[10];
num=(int)number;
while(num!=0)
{
st[t]=num%n;
num=num/n;
t++;
}
for(;t>0;t--)
printf("%c",sb(st[t-1]));
}
main()
{
float number;
int n;
printf("Please the number for the shu zhi/n");/*输入数值*/
scanf("%f",&number);
printf("Please the number for the jin zi/n");/*转成几进制*/
scanf("%d",&n);
printf("%f=",number);
zheng(number,n);
printf(".");
xiao(number,n);
getch();
}
5.八皇后问题是一个著名而古老的问题.该问题要求在8x8的国际旬棋盘上放置8个皇后,使得它们不能相互攻击,即任意两个皇后不能处于同一行,同一列或者同一斜线上.问有多少放置的方案?
程序:
#include<stdio.h>
int queen[8],b[8],c[15],d[15];
int sum=0;
void display()
{
int k;
printf("%d:",sum++);
for(k=0;k<8;k++)
printf(" %d",queen[k]);
printf("/n");
}
void ptry(int i)
{
int j; /*每个皇后都有8个可能位置*/
for(j=0;j<8;j++)
{
if(b[j]==0&&c[i+j]==0&&d[i-j+7]==0)/*判断位置是否冲突*/
{
queen[i]=j; /*摆放皇后*/
b[j]=1; /*宣布占领第j行*/
c[i+j]=1; /*占领两个对角线*/
d[i-j+7]=1;
if(i<7) /*8个皇后没有摆完,递归摆放下一个皇后*/
ptry(i+1);
else
display(); /*完成任务,打印结果*/
b[j]=0; /*回溯*/
c[i+j]=0;
d[i-j+7]=0;
}
}
}
void main()
{
int k;
for(k=0;k<8;k++)
{
b[k]=0;
c[k]=0;
d[k]=0;
}
ptry(0);
getch();
}
6.汉诺塔问题.这是一个古典的数学问题,是一个用递归方法解题的典型例子.问题是这样的:古代有下梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上.有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上.在移动过程中可以利用B座,要求编程序输出移动的步骤.
程序:
#include<stdio.h>
int sum=0;
void display(char a,char b)
{
printf("%c-->%c/n",a,b);
if(++sum%5==0)
printf("/n");
}
void hanoi(int n,char one,char two,char three)
{
if(n==1)
display(one,three);
else
{
hanoi(n-1,one,three,two); /*把A针的n-1个盘子通过C针移到B针*/
display(one,three); /*把A针的第n个盘子移到针,打印出来*/
hanoi(n-1,two,one,three); /*把B针的n-1个盘子通过A针移到C针*/
}
}
main()
{
int m;
printf("input the number of diskes:");
scanf("%d",&m);
printf("the step to moving %3d diskes:/n",m);
hanoi(m,'A','B','C');
getch();
}