注册 登录
编程论坛 C++教室

C语言实验题——最节省材料

风雨123 发布于 2013-02-23 16:40, 969 次点击
描述

一个长度为L米的材料,需要截成长度为a米和b米的短材料,求两种短材料各截多少根时,剩余的材料最少。

输入

数据有多行,每行三个整数,分别是L,a,b;

输出


每行输出截出a长度和截出b长度材料的根数,结果有多个时,只输出总根数最少或最长材料根数最少的数据。


样例输入


10 2 3

样例输出


2 2
12 回复
#2
Susake2013-02-23 16:54
看上去蛮简单的...试下
#3
Susake2013-02-23 17:08
程序代码:
#include <stdio.h>
#define M 1000+10

int main() {
    int L, a, b, n, m, t;
    while(scanf("%d %d %d", &L, &a, &b) != EOF) {
        t = L / 2;
        for(n = 0; n < M; n++)
            for(m = 0; m < M; m++)
                if(n * a + m * b == L && n + m < t)
        printf("%d %d\n", n, m);
    }
    return 0;
}
写好了,用了时间还是太多了吧
#4
Susake2013-02-23 17:08
15分钟
#5
风雨1232013-02-24 12:12
大哥,能为小弟解释一下,谢谢了。
#6
Susake2013-02-24 12:22
好吧,我就跟你解释一下....
#7
Susake2013-02-24 12:44
程序代码:
1.看题的输入:
输入

数据有多行,每行三个整数,分别是L,a,b;
就可以写出
#include <stdio.h>

int main() {
    int L, a, b;
    while(scanf("%d %d %d", &L, &a, &b) != EOF) {
      
    }
    return 0;
}
2.看题的输出
输出


每行输出截出a长度和截出b长度材料的根数,结果有多个时,只输出总根数最少或最长材料根数最少的数据。
先不分析这句话
#include <stdio.h>

int main() {
    int L, a, b, n, m;
    while(scanf("%d %d %d", &L, &a, &b) != EOF) {
      
        printf("%d %d\n", n, m);
    }
    return 0;
}
然后分析这句话:结果有多个时,只输出总根数最少或最长材料根数最少的数据。
先不分析这句话
最多的情况是L / 2,并且任何>2的数都可以由2和3组成,所以只需要小于L/2就可以了
且总长度=长2的*根数+长3的*根数

#include <stdio.h>

int main() {
    int L, a, b, n, m, t;
    while(scanf("%d %d %d", &L, &a, &b) != EOF) {
        t = L / 2;

        if(n * a + m * b == L && n + m < t)
        printf("%d %d\n", n, m);
    }
    return 0;
}

好了,这里就只要解决根数的问题了
我运用的是用两个for语句给根数限定范围....直到计算机找到符合所有条件的根数
#include <stdio.h>
#define M 1000+10

int main() {
    int L, a, b, n, m, t;
    while(scanf("%d %d %d", &L, &a, &b) != EOF) {
        t = L / 2;
        for(n = 0; n < M; n++)
            for(m = 0; m < M; m++)
                if(n * a + m * b == L && n + m < t)
        printf("%d %d\n", n, m);
    }
    return 0;
}


不知道讲得怎么样,见笑了.....




#8
风雨1232013-02-24 12:45
谢谢大哥指导
#9
Susake2013-02-24 12:46
把分给我就好了....哈哈
#10
风雨1232013-02-24 13:32
大哥  我注册不久,没有什么分,在吗
我还有一些想求你帮忙。
那个同构数问题。(为我讲一下思路),谢谢。

所谓“同构数”是指这样一个数,它出现在它的平方数的右侧,例如5的平方是25,25的平方是625,故5和25都是同构数,求[x,y]之间所有同构数之和。x,y由键盘输入。

输入样例:

2 1000

输出样例:

1113

 

#11
风雨1232013-02-24 13:34
回复 7楼 Susake
这个#define M 1000+10什么意思?
 
#12
rjsp2013-02-25 10:25
我随便拿个例子,比如 29 7 3
先将 29/7 = 4,也就是 4*7 + 0*3 余 1
现在要缩减7的数目,使得余数为0,也就是求 (n*7 + 1) % 3 = 0
(n*7 + 1) % 3 = 0
化简为
(n*7) % 3 = 2
n最小为2
所以最终结果就是 2×7 + 5×3 = 29

假如求的n大于一开始的29/7,那么就可以肯定不会有正好余0的情况出现,那就退而求其次,求余1的情况,若还没有,再球余2的情况……
比如求余1的情况就是 (n*7 + 1) % 3 = 1
化简为
(n*7) % 3 = 0
n最少值为0
所以若要求余1,则结果就是 4*7 + 0*3 = 29 - 1


[ 本帖最后由 rjsp 于 2013-2-25 10:35 编辑 ]
#13
a5507835422013-02-25 16:52
新手初来匝道
1