| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 825 人关注过本帖
标题:练习题 7
只看楼主 加入收藏
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
结帖率:94.64%
收藏
已结贴  问题点数:100 回复次数:15 
练习题 7
                                                            吸血鬼数字
"吸血鬼数字"是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。以两个0结尾的数字是不允许的,例如,下列数字都是"吸血鬼数字":
1260 = 21 * 60
1827 = 21 * 87
2187 = 27 * 81
写一个程序,找出4位数的所有吸血鬼数字(摘自Thinking in Java 4th Edition 第4章,练习题10)

我最近因受老师压迫,去学习Java EE了,所以只能抛开我挚爱的C,不过练习题还会继续发下去,今天在书上看到这题(当然代码我已经写出来了),这题对新手应该颇具挑战性,老手也可以复习一下。。。


参考答案:
程序代码:
#include <stdio.h>
#include <stdlib.h>

int get(int v, int index) {
    switch(index) {
    case 0 :
        return v / 1000 % 10;
    case 1 :
        return v / 100 % 10;
    case 2 :
        return v / 10 % 10;
    case 3:
        return v % 10;
    }
}

int main(void) {
    int v, r1, r2, r3, r4, r5, temp, compare[4];
    for(v = 1001; v < 10000; v++) {
        if(v % 100 == 0)
            continue;
        for(r1 = 10; r1 < 100; r1++) {
            for(r2 = 10; r2 < 100; r2++) {
                if(r1 * r2 == v) {
                    for(r3 = 0; r3 < 4; r3++)
                        compare[r3] = get(v, r3);
                    temp = r1 * 100 + r2;
                    for(r4 = 0; r4 < 4; r4++) {
                        for(r5 = 0; r5 < r3; r5++) {
                            if(compare[r5] == get(temp, r4)) {
                                while(r5 < r3 - 1) {
                                    compare[r5] = compare[r5 + 1];
                                    r5++;
                                }
                                r3--;
                                break;
                            }
                        }
                    }
                    if(!r3) {
                        printf("%d = %d * %d\n", v, r1, r2);
                    }
                }
            }
        }
    }
    system("pause");
    return 0;
}
其实这道题的主要目的是为了练习循环,因为这道题是流程控制的练习题。


[ 本帖最后由 lz1091914999 于 2011-7-7 16:53 编辑 ]
搜索更多相关主题的帖子: 学习Java 吸血鬼 练习题 
2011-07-06 20:50
yangfanconan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:10
帖 子:397
专家分:541
注 册:2009-9-22
收藏
得分:5 
1260, 1395, 1435, 1530, 1827, 2187, 6880
2011-07-06 21:38
西元前的D调
Rank: 2
等 级:论坛游民
帖 子:15
专家分:78
注 册:2011-6-20
收藏
得分:5 
难道我是新手?一年的C白学了
2011-07-06 23:22
qldxsun
Rank: 4
等 级:业余侠客
帖 子:125
专家分:240
注 册:2011-6-4
收藏
得分:5 
回复 楼主 lz1091914999
结果只有这几个吗?要是确定位数可以穷举,不用穷举不会做啊
2011-07-06 23:30
bccn_0934
Rank: 2
等 级:论坛游民
帖 子:35
专家分:56
注 册:2011-5-9
收藏
得分:20 
图片附件: 游客没有浏览图片的权限,请 登录注册
#include "stdio.h"
#include "algorithm"
main()
{using namespace std;
 int i,test[4],flag=1;
 for(i=1000;i<100000;i++)
 {test[0]=i/1000;
 test[1]=i%1000/100;
 test[2]=i%100/10;
 test[3]=i%10;
  do
  {
   if(i==(test[0]*10+test[1])*(test[2]*10+test[3])||i==(test[1]*10+test[0])*(test[3]*10+test[2])
      ||i==( test[0]*10+test[2])*(test[1]*10+test[3])||i==(test[2]*10+test[0])*(test[3]*10+test[2])
        ||i==( test[0]*10+test[3])*(test[1]*10+test[2])||i==(test[3]*10+test[0])*(test[2]*10+test[1])
          || i==(test[1]*10+test[2])*(test[0]*10+test[3])||i==(test[2]*10+test[1])*(test[3]*10+test[0])
            || i==(test[1]*10+test[3])*(test[0]*10+test[2])||i==(test[3]*10+test[1])*(test[2]*10+test[0]))
            printf("%d\n",i);
  
  }while(flag==next_permutation(test,test+3));
 }
}

[ 本帖最后由 bccn_0934 于 2011-7-7 00:05 编辑 ]
2011-07-07 00:04
蛋疼的校验码
Rank: 2
等 级:论坛游民
帖 子:4
专家分:30
注 册:2011-7-6
收藏
得分:25 
//leechnum.c
#include <stdio.h>
int main()
{
    int i, a, b, c, d, e, f;
    for(i = 1260; i <= 9999; i++)
    {
        a = i/1000;
        b = (i-a*1000)/100;
        c = (i-a*1000-b*100)/10;
        d = i-a*1000-b*100-c*10;
        if(i%100!=0)
        {
            e = a*10+b;
            f = c*10+d;
            if(e*f==i)
            {
                printf("%d is leechnum.\n",i);
                printf("%d * %d = %d\n", e, f, i);
                continue;
            }
            e = b*10+a;
            f = c*10+d;
            if(e*f==i)
            {
                printf("%d is leechnum.\n",i);
                printf("%d * %d = %d\n", e, f, i);
                continue;
            }
            e = a*10+b;
            f = d*10+c;
            if(e*f==i)
            {
                printf("%d is leechnum.\n",i);
                printf("%d * %d = %d\n",e, f, i);
                continue;
            }
            e = b*10+a;
            f = d*10+c;
            if(e*f==i)
            {
                printf("%d is leechnum.\n",i);
                printf("%d * %d = %d\n",e, f, i);
                continue;
            }
        }
    }
    getchar();
    return 0;
}

2011-07-07 00:21
蛋疼的校验码
Rank: 2
等 级:论坛游民
帖 子:4
专家分:30
注 册:2011-7-6
收藏
得分:0 
枚举的初始值为1001
设成1260是为了调试验证
2011-07-07 00:23
蛋疼的校验码
Rank: 2
等 级:论坛游民
帖 子:4
专家分:30
注 册:2011-7-6
收藏
得分:5 
N年+1月新手
只会简单的语句,求其他解法。
2011-07-07 00:26
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++)
    {
        m=deal(n);
        if(m==0)
            printf("%-5d",n);
    }
}
int deal(int n)
{
    int i,s=1000,a[4],temp=n;
    int m;
    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||(a[i]*10+a[c])*(a[j]*10+a[b])==temp)//满足条件
                return 0;
        }
    }
    return -1;
}
2011-07-07 00:50
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
输出格式应该是:
%d = %d * %d

My life is brilliant
2011-07-07 08:36
快速回复:练习题 7
数据加载中...
 
   



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

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