| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 825 人关注过本帖
标题:练习题 7
只看楼主 加入收藏
hjywyj
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:1114
专家分:2611
注 册:2010-4-14
收藏
得分:5 
61*21=1260
93*15=1395
41*35=1435
51*30=1530
87*21=1827
81*27=2187
86*80=6880
2011-07-07 11:20
wjm22
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:44
专家分:118
注 册:2011-7-5
收藏
得分:15 
#include<stdio.h>
int deal(int n);
void main()
{
    int n,m;
    for(n=1000;n<10000;n++)
    {
        deal(n);
    }
}
int deal(int n)
{
    int i,s=1000,a[4],temp=n;
    int j=1;
    int c=4;
    int b=4;
    for(i=0;i<4;i++)  //分离数字
    {
        a[i]=n/s;
        n=n%s;
        s=s/10;
    }
    for(i=0;i<4;i++)
    {
        for(j=0;j<=4;j++)
        {
            if(j==i)
                continue;
            b=3;c=3;
            if(a[i]==0||a[j]==0)
                continue;
            while(b==i||b==j)
                b--;
            while(c==i||c==j||c==b)
                c--;
            if(((a[i]*10+a[b])*(a[j]*10+a[c]))==temp)//满足条件
            {
                printf("%d=%d*%d\n",temp,a[i]*10+a[b],a[j]*10+a[c]);
                return 0;
            }
            if(((a[i]*10+a[c])*(a[j]*10+a[b]))==temp)
            {
                printf("%d=%d*%d\n",temp,a[i]*10+a[c],a[j]*10+a[b]);
                return 0;
            }
        }
    }   
}//修改版
2011-07-07 12:11
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
回复 楼主 lz1091914999
啊,我做的太慢了。我用了正向和反向两种方法。

第一种,反向的。
程序代码:
#include <string.h>
#include <stdio.h>
char    cNum [ 24 ][ 5 ] = {"\0"};            //用于存放产生的24种排列组合
char    cNumber [10][5] = {"\0"};            //用于存放吸血鬼数字
int        iNum = 0;
int        iNumber = 0;
void Swap(char * a, char * b)
{
    // 交换a和b
    char temp = *a;
    *a = *b;
    *b = temp;
}

void Perm(char list[], int k, int m)
{

    //生成list [k:m ]的所有排列方式
    int i;
    if (k == m)
    {           

        strcpy (cNum [iNum], list);
        iNum ++;
        if (iNum > 23)
            iNum = 0;
    }
    else                                // list[k:m ]有多个排列方式, 递归地产生这些排列方式
        for (i=k; i <= m; i++)

        {
            Swap (&list[k], &list[i]);
            Perm (list, k+1, m);
            Swap (&list[k], &list[i]);
        }
}

void  main()
{
    int        temp;
    int        i, j, k, l;
    int        c[10], d[10];
    char    a[5] = {"\0"}, b[5] = {"\0"};
    for (i = 11; i < 100; i ++)
        for (j = 11; j < 100; j ++)
        {
            temp = i * j;
            if (temp < 1001)
                continue;
            a[0] = temp / 1000 + 48;            //数字分解成字符串
            temp = temp % 1000;
            a[1] = temp / 100 + 48;
            temp = temp % 100;
            a[2] = temp / 10 + 48;
            a[3] = temp % 10 + 48;
            b[0] = i / 10 + 48;                    //两位数分解成字符串
            b[1] = i % 10 + 48;
            b[2] = j / 10 + 48;
            b[3] = j % 10 + 48;
            Perm (b, 0, 3);                        //排列所有可能的字符串
            for (k = 0; k < 24; k ++)            //逐个比较字符串
            {
                if (strcmp (a, cNum [k]) == 0)    //如果匹配
                {
                    for (l = 0; l < 10; l ++)    //判断此串是否已经存在字串数组中
                    {
                        if (strcmp (cNum [k], cNumber [l]) == 0)
                            break;
                    }
                    if (l == 10)                //如果不在数组中,就添加进去
                    {
                        strcpy (cNumber [iNumber], cNum [k]);
                        c[iNumber] = i;
                        d[iNumber] = j;
                        iNumber ++;
                    }
                }
            }
        }
    i = 0;
    while (cNumber [i][0] != '\0')        //输出字串
    {
        printf("%s = %d * %d\n", cNumber[i], c[i], d[i]);
        i ++;
    }
} 
图片附件: 游客没有浏览图片的权限,请 登录注册


冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-07-07 19:33
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
回复 楼主 lz1091914999
第二种,正向的。
程序代码:
/*
    吸血鬼数字:    1260 = 21 * 60
                    1827 = 21 * 87
                    2187 = 27 * 81

*/

#include<stdio.h>
void  Vampire(int n);
void main()
{
    int n = 1001;
    while (n++ < 10000)
        Vampire(n);
}

void  Vampire(int n)
{
    int        i, j, k, l, temp;
    int        a[4];
    int        iflag = 0;            //标志位,防止重复输出
    temp = n;
    a[0] = temp / 1000;            //数字分离
    temp = temp % 1000;
    a[1] = temp / 100;
    temp = temp % 100;
    a[2] = temp / 10;
    a[3] = temp % 10;
    for( i = 0; i < 4; i ++)    //四重循环嵌套找数字
    {
        for( j = 0; j < 4; j ++)
        {
            if(j == i)
                continue;
            for( k = 0; k < 4; k ++)
            {
                if(k == i  ||  k == j)
                    continue;
                for(l = 0; l < 4; l ++)
                {
                    if(l == k || l == i || l == j)
                        continue;
                    if((a[i] * 10 + a[j]) * (a[k] * 10 + a[l]) == n)
                    {    //吸血鬼数字的条件
                        printf("%d = %d * %d\n", n, a[i] * 10 + a[j], a[k] * 10 + a[l]);
                        iflag = 1;
                        break;
                    }
                    if( iflag == 1)
                        break;
                }
                if (iflag == 1)
                    break;
            }
            if (iflag == 1)
                break;
        }
        if (iflag == 1)
        {
            iflag = 0;
            break;
        }
    }

}
图片附件: 游客没有浏览图片的权限,请 登录注册

个人认为还是正向的方便,不过反向虽然复杂,不失为一种思路。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-07-07 19:36
youbaowa
Rank: 1
等 级:新手上路
帖 子:7
专家分:1
注 册:2011-7-5
收藏
得分:0 
我都看不懂
2011-07-07 23:19
ppfly
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:297
专家分:1956
注 册:2009-5-17
收藏
得分:0 
处理是否匹配时,用这么多循环应该不算好法子,可以定义一个int data[11]={0};
a[3] = temp % 10;后面改为data[a[0]]++;data[a[1]]++;data[a[2]]++;data[a[3]]++;
然后再data[b[0]]--;data[b[1]]--;data[b[2]]--;data[b[3]]--;看看最后data是否全为0



********多贴代码,少说空话*******
2011-07-08 09:05
快速回复:练习题 7
数据加载中...
 
   



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

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