| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 708 人关注过本帖
标题:蓝桥杯题解2
只看楼主 加入收藏
zhu_zhi
Rank: 2
来 自:广西百色
等 级:论坛游民
帖 子:129
专家分:92
注 册:2013-4-25
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
蓝桥杯题解2
假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)
能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?
如:36 * 495 = 396 * 45 = 17820
我的代码如下:
#include<stdio.h>//求符合36*495=396*45的列式总数
void main()
{
    int i,t,m,q,j=0;
    int a[5];//定义一个有数组用于分别存放5个个位数
    for(i=10000;i<=99999;i++)//利用循环在所有五位数中寻找符合条件的整数i
    {
        t=i;
        m=t%10;
        q=4;
        while(t>0)//利用循环分别求出组成整数i的5个个位数;
        {
            a[q]=m;
            
            t=(t-m)/10;
            m=t%10;
            q--;
        }
        if(a[0]!=0&&a[1]!=0&&a[2]!=0&&a[3]!=0&&a[4]!=0&&a[0]!=a[1]&&a[0]!=a[2]&&a[0]!=a[3]&&a[0]!=a[4]&&a[1]!=a[2]&&a[1]!=a[3]&&a[1]!=a[4]&&a[2]!=a[3]&&a[2]!=a[4]&&a[3]!=a[4])//利用if语句将5个个位数中含0的和两两相等的整数i剔除
        {
            if((10*a[0]+a[1])*(100*a[2]+10*a[3]+a[4])==(100*a[0]+10*a[3]+a[1])*(10*a[2]+a[4])) //利用if语句将符合ab * cde = adb * ce条件的整数i找出
            {
                j=j+1;//计数器
                printf("%d\n",i);//打印符合条件的整数
            }
        
        }         
    }
    printf("符合条件的列式有:%d个\n",j);//打印结果
}
请分享,如有更简洁的方法,请展出共享。
搜索更多相关主题的帖子: include 
2014-01-09 09:55
xiaozi2013
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:四川成都
等 级:蒙面侠
威 望:6
帖 子:830
专家分:4331
注 册:2013-12-13
收藏
得分:0 
分享~~

--整天敲那些破代码能找着媳妇儿吗。。。---
2014-01-09 10:51
ljx小子
Rank: 8Rank: 8
来 自:星星
等 级:蝙蝠侠
威 望:2
帖 子:222
专家分:916
注 册:2013-10-7
收藏
得分:10 
贴上我的代码,,希望高手指正
程序代码:
#include <stdio.h>
#include <string.h>
int check(int c[5])
{ int b[5],j,i;
  for(i=0;i<5;i++)
      b[i]=c[i];
  for(i=0;i<5;i++)
      if(b[i]==0)
          return 1;
  for(i=0;i<5;i++)
      for(j=i+1;j<5;j++)
          if(b[i]==c[j])
              return 1;

 return 0;
}
void main()
{
int i,j,a[5],m,n,t,s=0;
for(i=10;i<100;i++)
{

 for(j=100;j<1000;j++)

 {
  a[0]=i/10;
  a[1]=i%10;
  a[2]=j/100;
  a[3]=j%100/10;
  a[4]=j%10;
  m=a[0]*100+a[3]*10+a[1];
  n=a[2]*10+a[4];
   t=check(a);
    if(n*m==i*j&&t==0)
    {s++; 
          printf("%d*%d=%d*%d\n",i,j,m,n);}


 } 
}
printf("%d",s);
}

。。。。。。。。。。。
2014-01-09 14:57
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:10 
【先一股脑产生一堆数,然后剔除重复】不如【直接产生不重复的数】

程序代码:
#include <stdio.h>

int main()
{
    unsigned num = 0;
    for( unsigned i=0; i<9*8*7*6*5; ++i ) // 一共这么多个组合
    {
        // 求得每一个组合下分别是哪5个数
        unsigned n[5];
        {
            unsigned long long m = 0x987654321ull;
            for( unsigned b=8*7*6*5,j=0; j<5; b/=9-++j )
            {
                unsigned v = i/b%(9-j) * 4;
                n[j] = m>>v & 0xF;

                unsigned long long mask = (1ull<<v) - 1;
                m = m>>4&~mask | m&mask;
            }
        }

        // 判断 ab * cde == adb * ce
        if( (n[0]*10+n[1])*(n[2]*100+n[3]*10+n[4]) == (n[0]*100+n[3]*10+n[1])*(n[2]*10+n[4]) )
        {
            printf( "%u %u %u %u %u\n", n[0], n[1], n[2], n[3], n[4] );
            ++num;
        }
    }
    printf( "num = %u\n", num ); //142

    return 0;
}

2014-01-09 16:20
zhu_zhi
Rank: 2
来 自:广西百色
等 级:论坛游民
帖 子:129
专家分:92
注 册:2013-4-25
收藏
得分:0 
回复 4楼 rjsp
楼主的算法好简洁!达到这种境界需要修炼了几年?
2014-01-09 16:41
zhu_zhi
Rank: 2
来 自:广西百色
等 级:论坛游民
帖 子:129
专家分:92
注 册:2013-4-25
收藏
得分:0 
回复 3楼 ljx小子
不错的算法!
2014-01-09 16:42
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:0 
回复 4楼 rjsp
能不能对比一下和楼主的算法的运行时间?
我运行了下, 用clock()好像时间差不多.有没有别的测试方法?
2014-01-09 18:37
GaZn_3130
Rank: 2
等 级:论坛游民
帖 子:4
专家分:17
注 册:2014-1-11
收藏
得分:0 
LZ这种算法可以有点小优化:
既然是1~9的整数,LZ不必用10000开始for循环。
下面代码运行时间比LZ的方法略短,在不打印所有数字只打印结果时,快50%左右,同时也不用初始化太多的变量了。
程序代码:
#include <stdio.h>
#include <time.h>
#define SGNUM 5

int _numEqual1(int *array);
void _calcEqual(int *array, int *count);

int main(void)
{
    int a[5] = {1, 1, 1, 1, 1}, count = 0;
    clock_t start, done;
    start = clock();
    while(a[0] < 10) {
        while(a[2] < 10) {
                        _calcEqual(a, &count);
            a[2]++;
        }
        a[0]++;
        a[2] = 1;
    }
    printf("%d\n", count);
    done = clock();
    printf("Elapsed time:%f secs.\n",(double)(done - start)/CLOCKS_PER_SEC);
    getchar();
    return 0;
}

int _numEqual(int *array)
{
     int i, j;
    for(i = 0; i < SGNUM - 1; i++) {
        for(j = i + 1; j < SGNUM; j++) {
            if(array[i] == array[j]) {
                return 0;
            }
        }
    }
    return 1;
}

void _calcEqual(int *array, int *count)
{
    while(array[1] < 10) {
        while(array[3] < 10) {
             while(array[4] < 10) {
                if(_numEqual(array) == 1) {
                    if((array[0] * 10 + array[1]) * (array[2] * 100 + array[3] * 10 + array[4]) == (array[2] * 10 + array[4]) * (array[0] * 100 + array[3] * 10 + array[1])) {
                        
                        *count = *count + 1;
                    }
                }
                array[4] = array[4] + 1;
               }
            array[3] = array[3] + 1;
            array[4] = 1;
        }
        array[1] = array[1] + 1;
        array[3] = array[4] = 1;
    }
    array[1] = array[3] = array[4] = 1;
}
2014-01-11 23:23
xp0213
Rank: 7Rank: 7Rank: 7
来 自:湖北武汉
等 级:黑侠
威 望:1
帖 子:222
专家分:524
注 册:2011-10-26
收藏
得分:0 
贴一个很简单的,只求算出来,不注重运算效率。水平低,不要见笑啊


#include<stdio.h>
main()
{
    int a,b,c,d,e;
    int cnt=0;
    for(a=1;a<10;a++)
    {
        for(b=1;b<10;b++)
        {
            for(c=1;c<10;c++)
            {
                for(d=1;d<10;d++)
                {
                    for(e=1;e<10;e++)
                    {
                        if(a!=b && a!=c && a!=d && a!=e && b!=c && b!=d && b!=e && c!=d && c!=e && d!=e)
                        {
                            if((a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e))
                            {
                                printf("%d * %d = %d * %d \n",a*10+b,c*100+d*10+e,a*100+d*10+b,c*10+e);
                                cnt++;
                            }
                        }
                    }
                }
            }
        }
    }
    printf("一共有:%d 个.\n",cnt);
}
2014-01-12 16:33
快速回复:蓝桥杯题解2
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.058624 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved