永发信息网

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

答案:2  悬赏:0  手机版
解决时间 2021-03-07 10:20
  • 提问者网友:情歌越听越心酸
  • 2021-03-07 03:56
C语言穷举法 abcde/fghij=n,其中a~j为数字0~9的不同排列.n的值从2到79。统计这样的组合一共有多少个。
最佳答案
  • 五星知识达人网友:空山清雨
  • 2021-03-07 05:24
#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了
全部回答
  • 1楼网友:北方的南先生
  • 2021-03-07 05:43

根据题意,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
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯