永发信息网

C语言穷举法 abcde/fghij=n,其中a~j为数字0~9的不同排列.n的值从2到79。统计这样的组合一共有多少个。

答案:2  悬赏:0  手机版
解决时间 2021-03-07 10:20
C语言穷举法 abcde/fghij=n,其中a~j为数字0~9的不同排列.n的值从2到79。统计这样的组合一共有多少个。
最佳答案
#include

int ans = 0;
int a[10];
bool used[10];

void dfs(int k) {
if (k == 10) {
int v0 = 0, v1 = 0;
for (int i = 0; i < 5; ++i) {
v0 = v0*10+a[i];
v1 = v1*10+a[i+5];
}
if (v0 >= 2*v1 && v0 <= 79*v1) {
ans++;
}
}

for (int i = 0; i < 10; ++i) {
if (!used[i]) {
a[k] = i;
used[i] = 1;
dfs(k+1);
used[i] = 0;
}
}
}

int main() {
dfs(0);
printf("%d\n", ans);
return 0;
}追问运行结果就不正确啊追答#include

int ans = 0;
int a[10];
bool used[10];
int v0, v1;

void dfs(int k) {
if (k == 10) {
v0 = 0, v1 = 0;
for (int i = 0; i < 5; ++i) {
v0 = v0*10+a[i];
v1 = v1*10+a[i+5];
}
if (v0%v1 == 0 && v0/v1 >= 2 && v0/v1 <= 97) {
ans++;
}
}

for (int i = 0; i < 10; ++i) {
if (!used[i]) {
a[k] = i;
used[i] = 1;
dfs(k+1);
used[i] = 0;
}
}
}

int main() {
dfs(0);
printf("%d\n", ans);
return 0;
}

//这样跟楼下的答案一下了,281,他的方法比这个方法优追问嗯额,谢啦!还想问一下程序执行速度啊?怎样可以更快?追答现在的算法复杂度是 O(10!) 而且系数还不小
splashchaos给出的方法就不错,复杂度是O(80*10^5)
也就是你枚举一半,比如枚举fghij,然后挨着乘以2到n看看得到的abcde是否是满足条件的,条件就是fghij abcde是不是0~9

这样子就ok了
全部回答

根据题意,abcde最大的可能值为98765;而fghij最小的可能值是01234, 因此结合n=2~79, 作两个循环判断所有的取值; 判断的标准就是:把abcde和fghij按字符串合并,排序后和字符串0123456789比较即可。代码如下:#include 
#include 
#include 
int isunique(const size_t abcde, const size_t fghij);
int compare(const void * a, const void * b);
int main(int argc, char** argv) 
{
    size_t count = 0;
    int abcde, fghij, n;
    size_t n_min, n_max;
    size_t abcde_max;
    size_t fghij_min;
    
    n_min = 2;
    n_max = 79;
    fghij_min = 1234; 
    abcde_max = 98765; 
    
    for (n = n_min; n <= n_max; n++)
    {
        fghij = fghij_min;
        do {
            abcde = n * fghij;
               
            if (isunique(abcde, fghij) == 0)
            {            
               printf(" %05d = %05d * %d ", abcde, fghij, n);
               count ++;
            }
            
            fghij ++;   
        } while (abcde < abcde_max);
        
    }
    
    printf("Total found: %d ", count);
    
    return 0;
}
int isunique(const size_t a, const size_t b)
{
    char buffer[10];
    int c1, c2;
       
    if ((a > 99999) || (b > 99999))
       return -2;
       
    c1 = snprintf(buffer, 5, "%05d", a);       
    c2 = snprintf(buffer+c1, 5, "%05d", b);
       
    qsort(buffer, sizeof(buffer)/sizeof(buffer[0]), sizeof(char), compare);
    
    return strncmp(buffer, "0123456789", 10);    
}
int compare(const void * a, const void * b)
{
    return ( *(char*)a - *(char*)b );    
}
输出: 13458 = 06729 * 2
...
 98736 = 01452 * 68
Total found: 281
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
五年级上第十二课《假如没有灰尘》的主要内容
罗汉鞋有6个洞,有什么含义
2019年提分教练八年级物理上册沪粤版答案
减脂期每日要摄入多少蔬菜
avaya CM 录音方式有哪几种,怎么实现录音的
2013年华晨宇参加了哪些公益活动
额吉纳蒙古风味卢龙店在什么地方啊,我要过去
现察下图,关于美苏修建以下两个公共工程目的
康洁洗衣信阳总店我想知道这个在什么地方
三角形ABC中,A,B为锐角,角A,B,C所对的边为a,b
淋浴房移门滑轮怎样调整,家具移门滑轮破了维
比亚迪g61.5t发动机能油改气
从故宫后门出来,去北海公园怎么走?
小型鸽子孵化机 鸽子孵化机多少钱一台
周公解梦鈥斆渭
推荐资讯
一叶一菩提,处处莲花开是什么意思
说下方太嵌入式烤箱好还是老板比较好
请详细的说出你的想法,要合情合理!196(25)3
葱怎么保存
排除白血病的血液检查结果要多久才能检查出来
网名,薄的奥力奥是什么意思
为什么企业共赊销产品(不含税)3000万元最后却
神奇的“致幻植物”阅读答案
老兵酒家地址在什么地方,想过去办事
这个五千值多少人民币
微信怎样在电脑和电话上同时使用方法
眉目的比喻义是什么
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?