算法——穷举

【题目一】把一元钞票换成一分、二分、五分硬币(每种至少一枚),有哪些种换法?


#include <stdio.h>
void main()
{
 int i,j,k,num=0;
 for(i=1;i<=19;i++)
  for(j=1;j<=47;j++)
  {
   k=100-5*i-2*j;
   if(k>0)
    num++;
  }
   
 printf("%d\n",num);
  
}

【题目二】将1,2...99个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数.

#include <stdio.h>
void main()
{
 int i,j,k,l,m,n=1,a[10]={0},x;
 for(i=1;i<=3;i++)
  for(j=1;j<=9;j++)
  {
   if(j!=i)
    for(k=1;k<=9;k++)
    {  
     if(k!=i&&k!=j)
        {
      x=100*i+10*j+k;
      for(l=1;l<=3;l++)
      {
       a[(l*x)%10]++;
       a[(l*x)/10%10]++;
       a[(l*x)/100]++;
      }
      for(m=1;m<=9;m++)
      {
       if(a[m]!=1)
        n=0;
      }
      if(n)
       printf("%5d%5d%5d\n",x,2*x,3*x);
      for(n=1;n<=9;n++)
       a[n]=0;
      n=1;
      
     }
    }
  }
}

【题目三】:穷举法中穷举方案的选择

陈婷有一个E-MAIL邮箱的密码是一个5位数。但因为有一段比较长的日子没有打开这个邮箱了,陈婷把这个密码给忘了。不过陈婷自己是81日出生,而她妈妈的生日则是91日,她特别喜欢把同时是8l9l的倍数用作密码。陈婷还记得这个密码的中间一位(百位数)l。你能设计一个程序帮她找回这个密码吗?

#include <stdio.h>
#define N 81
#define M 91
int a(int x,int y)
{
 int temp;
 if(y>x)
 {
  temp=x;
  x=y;
  y=temp;
 }
 temp=x%y;
 if(temp==0)
  return y;
 else
  a(y,temp);
}
void main()
{
 int i,x,y;
 x=N*M/a(N,M);
 y=x;
 for(i=1;y<100000;i++)
 {
  y=x*i;
  if(y>=10000)
  {
   if(y/100%10==1&&y<=99999)
    printf("%6d\n",y);
  }
 }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章