61*21=1260
93*15=1395
41*35=1435
51*30=1530
87*21=1827
81*27=2187
86*80=6880
	
	
	      93*15=1395
41*35=1435
51*30=1530
87*21=1827
81*27=2187
86*80=6880
程序代码:
#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 ++;
    }
} 
	
		
			
		
	

程序代码:/*
    吸血鬼数字:    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;
        }
    }
}
	
		
			
		
	
