算法——模拟

来源:互联网 发布:sass for mac打开很慢 编辑:程序博客网 时间:2024/05/17 06:28

第一题九九乘法表

输出格式整齐的九九乘法表样例输出:
1x1=1
1x2=2  2x2=4
1x3=3  2x3=6  3x3=9
1x4=4  2x4=8  3x4=12 4x4=16
1x5=5  2x5=10 3x5=15 4x5=20 5x5=25
1x6=6  2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7  2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8  2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9  2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

程序:

#include <stdio.h>
void main()
{
 int i,j,x;
 for(i=1;i<=9;i++)
 {
  for(j=1;j<=i;j++)
  {
   x=i*j;
   printf("%d×%d=%d ",j,i,x);
  }
  printf("\n");
 }
}

第二题 方块的转换

一块N x N1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始
图案按照以下列转换方法转换成新图案的最小方式:
#1:转90度:图案按顺时针转90度。
#2:转180度:图案按顺时针转180度。
#3:转270度:图案按顺时针转270度。
#4:反射:图案在水平方向翻转(形成原图案的镜像)。
#5:组合:图案在水平方向翻转,然后按照#1-#3之一转换

#6:不改变:原图案不改变。
#7:无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个

程序:

#include <stdio.h>
int n;
char b[11][11];
void fan()
{
 int i,j;
 char d[11][11];
 for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
   d[i][j]=b[i][j];
 for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
   b[i][n-i+1]=d[i][j];
}
int bijiao(char f[11][11],char d[11][11])
{
 int i,j;
 for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
   if(f[i][j]!=d[i][j])
    return 0;
 return 1;
}
void fun()
{
 int i,j;
 char d[11][11];
 for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
   d[i][j]=b[i][j];
 for(i=1;i<=n;i++)  
  for(j=1;j<=n;j++)   
   b[j][n-i+1]=d[i][j];
}
void main()
{
 int i,j,p=0;
 char a[11][11],c[11][11];
 scanf("%d",&n);
 getchar();
 for(i=1;i<=n;i++)
 { 
  for(j=1;j<=n;j++)
  {
   scanf("%c",&a[i][j]);
   b[i][j]=a[i][j];
  }
  getchar();
 }
 printf("\n");
 for(i=1;i<=n;i++)
 {
  for(j=1;j<=n;j++)
   scanf("%c",&c[i][j]);
  getchar();
 }
 if(bijiao(b,c)==1)
  printf("6");
 else
 {
  for(i=1;i<=4;i++)
  {
   fun();
   if(bijiao(b,c))
    break;
  }
  if(i<4)
   printf("%d",i);
  else
  {
   fan();
   if(bijiao(b,c))
    printf("4");
   else
   {
    for(i=1;i<4;i++)
    {
     fun();
     if(bijiao(b,c))
      break;
    }
    if(i<4)
     printf("5");
    else
     printf("7");
   }
  }
 }

}

第三题 循环数

循环数是那些不包括0这个数字的没有重复数字的整数 (比如说, 81362) 并且同时具有一个有趣的性质就像这个例子:

·        如果你从最左边的数字开始 在这个例子中是8) 数最左边这个数字个数字到右边(回到最左边如果数到了最右边),你会停止在另一个新的数字(如果没有停在一个不同的数字上,这个数就不是循环数). 就像: 8 1 3 6 2 从最左边接下去数8个数字: 1 3 6 2 8 1 3 6 所以下一个数字是6.

·        重复这样做 (这次从“6”开始数6个数字并且你会停止在一个新的数字上: 2 8 1 3 6 2, 也就是2.

·        再这样做 (这次数两个): 8 1

·        再一次 (这次一个): 3

·        又一次: 6 2 8 这是你回到了起点在从每一个数字开始数1次之后如果你在从每一个数字开始数一次以后没有回到起点你的数字不是一个循环数。

给你一个数字 M (18位之间), 找出第一个比 M大的循环数

 

程序:

 

#include <stdio.h>
int a[9]={0},n;
int fun()
{
 int i,j,x1;
 int b[9]={0};
 printf("测试\n");
 for(i=1,j=0;i<=n;i++)
 {
  printf("%4d",a[j]);
  if(b[j])
   break;
  else
  {
   b[j]++;
   j=(j+a[j])%n;
  }
 }
 printf("\n");
 for(i=0;i<n;i++)
 {
  printf("%4d",b[i]);
  if(b[i]!=1)
   return 0;
 }
 if(j==0)
  return 1;
 else
  return 0;
}
int main()
{
 int x,i,j,f=1,d,k;
 scanf("%d",&x);
 do
 {
  f=1;
  x++;
  printf("%d\n",x);
  k=x;
  n=0;
  for(i=0;i<9;i++)
  {
   if(k!=0)
   {
    n++;
    k=k/10;
   }
     }
  k=x;
  for(i=n-1;i>=0;i--)
  {
   a[i]=k%10;
   k=k/10;
  }
  for(i=0;i<n-1;i++)
  {
   for(j=i+1;j<n;j++)
   {
    if(a[i]==a[j]||a[i]==0||a[j]==0)
     f=0;
   }
  }
  if(f!=0)
   d=fun();
  else
   d=0;
  printf("\n%d\n",d);
 }
 while(!d);
 printf("%d\n%d\n",x,d);
}

 

原创粉丝点击