目前共有7篇帖子。 内容转换:不转换▼
 
点击 回复
305 6
【试题】带分数
一派护法 十九级
1楼 发表于:2016-3-13 17:48
#include <stdio.h>
#include <string.h>

int number, count = 0;

int getn(char *str, int n)
{
    int i, r = 0;
    for (i = 0; i < n; i++)
    {
        r *= 10;
        r += str[i] - '0';
    }
    return r;
}

void cb(char arr[], int n)
{
    int p, d;
    int a, b, c;
    for (p = 0; p < n - 1; p++) // 加号的位置
    {
        for (d = p + 1; d < n - 1; d++) // 除号的位置
        {
            b = getn(arr + p, d - p);
            c = getn(arr + d, n - d);
            if (b % c == 0)
            {
                a = getn(arr, p);
                if (a + b / c == number)
                {
                    //printf("%d = %d + %d / %d\n", number, a, b, c);
                    count++;
                }
            }
        }
    }
}

void swap(char *a, char *b)
{
    char t = *a;
    *a = *b;
    *b = t;
}

// 以下为全排列算法
void fun(char arr[], int n, int k)
{
    int i;
    if (k >= n)
    {
        /*for (i = 0; i < n; i++)
            printf("%d ", arr[i]);
        putchar('\n');*/
        cb(arr, n); // 调用回调函数
        return;
    }
    
    for (i = k; i < n; i++)
    {
        swap(arr + i, arr + k);
        fun(arr, n, k + 1);
        swap(arr + i, arr + k);
    }
}

int main()
{
    char arr[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};
    scanf("%d", &number);
    fun(arr, 9, 0);
    printf("%d\n", count);
    return 0;
}
一派护法 十九级
2楼 发表于:2016-3-13 17:49
详细记录 评测点序号评测结果得分CPU使用内存使用下载评测数据
1  错误  0.00  187ms  1.601MB  输入 输出  
2  正确  33.33  187ms  1.601MB  VIP特权  
3  正确  33.33  202ms  1.601MB  VIP特权 


当输入为2013时结果错误。

得分只有66分。。。
一派护法 十九级
3楼 发表于:2016-3-13 17:49
2013
2013 = 14 + 75962 / 38
2013 = 5 + 184736 / 92
2013 = 56 + 27398 / 14
2013 = 75 + 81396 / 42
4

--------------------------------
Process exited after 1.52 seconds with return value 0
Press any key to continue . . .
一派护法 十九级
4楼 发表于:2016-3-13 17:53
还有一种情况:
2013
2013=5+184736/92
2013=14+75962/38
2013=56+27398/14
2013=75+81396/42
2013=1287+6534/9
一派护法 十九级
6楼 发表于:2016-3-13 18:08
【错误原因】
加号位置的范围是1~n-1(n=9)
所以应该for (p = 1; p < n; p++)
p=0: +012345678 (错误)
p=1: 0+12345678
p=2: 01+2345678
p=3: 012+345678
p=4: 0123+45678
p=5: 01234+5678
p=6: 012345+678
p=7: 0123456+78
p=8: 01234567+8
一派护法 十九级
7楼 发表于:2016-3-13 18:08
提交时间  03-13 18:09   评测结果  正确  
得分  100  
CPU使用  171ms  
内存使用  1.601MB 
【代码】
#include <stdio.h>
#include <string.h>

int number, count = 0;

int getn(char *str, int n)
{
    int i, r = 0;
    for (i = 0; i < n; i++)
    {
        r *= 10;
        r += str[i] - '0';
    }
    return r;
}

void cb(char arr[], int n)
{
    int p, d;
    int a, b, c;
    for (p = 1; p < n; p++) // 加号的位置
    {
        for (d = p + 1; d < n; d++) // 除号的位置
        {
            b = getn(arr + p, d - p);
            c = getn(arr + d, n - d);
            if (b % c == 0)
            {
                a = getn(arr, p);
                if (a + b / c == number)
                {
                    //printf("%d = %d + %d / %d\n", number, a, b, c);
                    count++;
                }
            }
        }
    }
}

void swap(char *a, char *b)
{
    char t = *a;
    *a = *b;
    *b = t;
}

// 以下为全排列算法
void fun(char arr[], int n, int k)
{
    int i;
    if (k >= n)
    {
        /*for (i = 0; i < n; i++)
            printf("%d ", arr[i]);
        putchar('\n');*/
        cb(arr, n); // 调用回调函数
        return;
    }
   
    for (i = k; i < n; i++)
    {
        swap(arr + i, arr + k);
        fun(arr, n, k + 1);
        swap(arr + i, arr + k);
    }
}

int main()
{
    char arr[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};
    scanf("%d", &number);
    fun(arr, 9, 0);
    printf("%d\n", count);
    return 0;
}
一派护法 十九级
8楼 发表于:2016-3-13 18:09
memcpy后再atoi的速度太慢,不如getn函数的速度快。

回复帖子

内容:
用户名: 您目前是匿名发表
验证码:
(快捷键:Ctrl+Enter)
 

本帖信息

点击数:305 回复数:6
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2016-3-13 18:09
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。