个人觉得很经典的程序题

 

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();
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值