注册 登录
编程论坛 JAVA论坛

哪位大佬,给我看下这个用java如何写?

saberlily 发布于 2018-05-22 20:05, 4523 次点击
有一工人甲,工资是三位数ABC元(一个字母代表0-9中一个数字),组内其它五个工人的工资可以这样表示:ACB,BAC,BCA,CAB,CBA,且这五个工人的工资总额为3194元。请问工人甲的工资具体是多少?
16 回复
#2
疯狂的小a2018-05-22 20:20
自己想想再问,这么简单
#3
saberlily2018-05-22 20:21
数学不好,脑壳痛
#4
疯狂的小a2018-05-22 20:31
程序代码:
package com.xiaoa.test;

/**

 * 有一工人甲,工资是三位数ABC元(一个字母代表0-9中一个数字),组内其它五个工人的工资可以这样表示:ACB,BAC,BCA,CAB,CBA,且这五个工人的工资总额为3194元。请问工人甲的工资具体是多少?

 *

 *

 
*/
public class Demo3 {
    public static void main(String[] args) {
        for (int i = 0; i <= 9; i++) {
            for (int j = 0; j <= 9; j++) {
                for (int k = 0; k <= 9; k++) {
                    int ABC = i * 100 + j * 10 + k;
                    int ACB = i * 100 + k * 10 + j;
                    int BAC = j * 100 + i * 10 + k;
                    int BCA = j * 100 + k * 10 + i;
                    int CAB = k * 100 + i * 10 + j;
                    int CBA = k * 100 + j * 10 + i;
                    int sum = ABC + ACB + BAC + BCA + CAB + CBA;
                    if (sum == 3194) {
                        System.out.println("工人甲的工资: " + ABC);
                    }
                }
            }
        }
    }
}
好像没找到结果,你看看是不是我的代码有问题
#5
saberlily2018-05-22 20:33
好好,我看下
#6
saberlily2018-05-22 20:55
sum中多了个ABC+,本来就是求abc的,
#7
疯狂的小a2018-05-22 21:19
原来如此,那你,改改,应该可以了
#8
疯狂的小a2018-05-22 21:20
程序代码:
package com.xiaoa.test;

/**

 * 有一工人甲,工资是三位数ABC元(一个字母代表0-9中一个数字),组内其它五个工人的工资可以这样表示:ACB,BAC,BCA,CAB,CBA,且这五个工人的工资总额为3194元。请问工人甲的工资具体是多少?

 *

 *

 
*/
public class Demo3 {
    public static void main(String[] args) {
        for (int i = 0; i <= 9; i++) {
            for (int j = 0; j <= 9; j++) {
                for (int k = 0; k <= 9; k++) {
                    int ABC = i * 100 + j * 10 + k;
                    int ACB = i * 100 + k * 10 + j;
                    int BAC = j * 100 + i * 10 + k;
                    int BCA = j * 100 + k * 10 + i;
                    int CAB = k * 100 + i * 10 + j;
                    int CBA = k * 100 + j * 10 + i;
                    int sum = ACB + BAC + BCA + CAB + CBA;

                    if (sum == 3194) {
                        System.out.println("工人甲的工资: " + ABC);
                    }
                }
            }
        }
    }
}

工人甲的工资: 358
#9
林月儿2018-05-22 22:25
程序代码:
class Untitled {
    /**
     * 分析:特殊五位数加和:ACB,BAC,BCA,CAB,CBA表示为
     *    100A+200*(B+C)+10B+20*(A+C)+C+2*(A+B)=3194;
     *    122A+212B+221C=3194
     *  由于简单判断,122A+212B为偶数,故只有C为偶数等式成立
     *  则C的步长可以为2
     *  其他特征不明显,可后期优化。
     *
*/
    public static void main(String[] args) {
        find(0,0,0);
        System.out.println("统计次数:"+count);
        
    }
    /** 次数统计 */
    static int count;
    /**
     * 嵌套判断
     *
*/
    public static void find(int a, int b, int c){
        count++;
        if(122*a+212*b+221*c==3194){
            System.out.println("统计结果:"+(a*100+b*10+c));
        }
        // 步长为2,有前期分析得到
        c+=2;
        if(c>9){
            c=0;
            b+=1;
        }
        if(b>9){
            b=0;
            a+=1;
        }
        if(a>9)
            return;
        find(a,b,c);
    }   
}

只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2018-5-22 22:27编辑过]

#10
林月儿2018-05-22 22:41
程序代码:
class Untitled {
    /**
     * 分析:三角阵的起点可模拟坐标系实现,简化代码
     *
*/
    public static void main(String[] args) {
        for(int i=-9;i<=9;i++){
            for(int j=-9;j<=9;j++){
                if((i>j&&i+j>0)||(j>i&&i+j<0)){
                    int r = Math.abs(i);
                    int c = Math.abs(j);
                    System.out.print(r>c?r-c:c-r);
                }
                else
                    System.out.print(" ");   
            }
            System.out.println();
        }
    }
}
只有本站会员才能查看附件,请 登录
#11
疯狂的小a2018-05-22 23:06
回复 9楼 林月儿
你的这种方法,在我脑海中有一丝飘过,但是还是java的思想比较简单
#12
林月儿2018-05-22 23:08
回复 11楼 疯狂的小a
以下是引用疯狂的小a在2018-5-22 21:20:41的发言:

package com.xiaoa.test;

/**
 * 有一工人甲,工资是三位数ABC元(一个字母代表0-9中一个数字),组内其它五个工人的工资可以这样表示:ACB,BAC,BCA,CAB,CBA,且这五个工人的工资总额为3194元。请问工人甲的工资具体是多少?
 *
 *
 */
public class Demo3 {
    public static void main(String[] args) {
        for (int i = 0; i <= 9; i++) {
            for (int j = 0; j <= 9; j++) {
                for (int k = 0; k <= 9; k++) {
                    int ABC = i * 100 + j * 10 + k;
                    int ACB = i * 100 + k * 10 + j;
                    int BAC = j * 100 + i * 10 + k;
                    int BCA = j * 100 + k * 10 + i;
                    int CAB = k * 100 + i * 10 + j;
                    int CBA = k * 100 + j * 10 + i;
                    int sum = ACB + BAC + BCA + CAB + CBA;

                    if (sum == 3194) {
                        System.out.println("工人甲的工资: " + ABC);
                    }
                }
            }
        }
    }
}

工人甲的工资: 358


这个就是java思想吗?受教了
#13
疯狂的小a2018-05-22 23:12
回复 12楼 林月儿
真的,你的这种是C语言的思想,指导你的这种解法!而我首先想到的就是遍历,所以用了for循环。我以前搞matlab的时候,也还是你这种思想!
#14
林月儿2018-05-22 23:16
以下是引用疯狂的小a在2018-5-22 23:12:29的发言:

真的,你的这种是C语言的思想,指导你的这种解法!而我首先想到的就是遍历,所以用了for循环。我以前搞matlab的时候,也还是你这种思想!


嗯,真厉害,不早了,明天还要上课呢...下了
#15
疯狂的小a2018-05-22 23:24
good nigth!
#16
九转星河2018-05-23 03:39
引用了9楼的解释~
以下是引用林月儿在2018-5-22 22:25:12的发言:
   /**
     * 分析:特殊五位数加和:ACB,BAC,BCA,CAB,CBA表示为
     *    100A+200*(B+C)+10B+20*(A+C)+C+2*(A+B)=3194;
     *    122A+212B+221C=3194
     *  由于简单判断,122A+212B为偶数,故只有C为偶数等式成立
     *  则C的步长可以为2
     *  其他特征不明显,可后期优化。
     * */



C=(3194-(122A+212B))/221;

3194%221=100;

也就是说

(122A+212B)=100+221*k

(122A+212B)%221=100;

设x=122,y=212

y-x=90;

x-(y-x)=2x-y=122-90=32;

((y-x)-2*(2x-y))=3y-5x=90-2*32=26;

(2x-y)-(3y-5x)=7x-4y=6;

(3y-5x)-4*(7x-4y)=19y-33x=2;

50*(19y-33x)=100

950y-1650x=100;

又从19y-33x=2;可以推得

221*(19y-33x)%221=0;

也就是
(4199y-7293x)%221=0;

设k为通项表达式系数~

((4199+122k)y-(7293+212k)x%221)=0;

((4199+61k)y-(7293+106k)x+(950y-1650x))%221=100;

((5149+61k)y-(8943+106k)x)%221=100;

当k取-84时,有

(25y-39x)%221=100;

到这里,由于x为负数,所以这就走不下去了,要再用另一种方法~

回到式子
(A*x+B*y)%221=100;

可以让

(A*x+B*y)%221=0;

这样目的是让A和B的解找到通项系数~

具体解法,可以让
A*x%221=B*y

2x%221=23;

(2x*10)%221=20x%221=9;

(20x*25)%221=500x%221=(500%221)x%221=58x%221=4;

(58x*56)%221=(3248%221)x%221=154x%221=3;

(154x*74)%221=(11396%221)x%221=125x%221=1;

(125x*212)%221=201x%221=212=y;

(201x-y)%221=0;

(-20x-y)%221=0;

(y+20x)%221=0;

到这里,结合

(25y-39x)%221=100;

得,2*(y+20x)+(25y-39x)=(x+27y)%221=100;

到这里,求得A和B都等于正整数解了,但B的取值范围是27不符合题意,因此要求出符合题意的解~

因为
221/20=11余1;

所以有((1-k)x+(27+11k)y)%221=100;

让1-k保证为正数,则加上(x+20y)有

(((1-k)x+(27+11k)y)+(20x+y))%221=((21-k)x+(28+11k)y)%221=100;

由于A和B的取值范围只能是1~9,并且1已经搜索过了
所以k从19开始,也就是21-k=2开始

当k=19时,有

(2x+237y)%221=100;

也就是
(2x+(237%221)y)%221=(2x+16y)%221=100;

所以当A=2时,B=16;
因为16要大于9,因此还要继续搜索~

当k=18时,直接用前面得出的y的系数16减去11,得,B=5;

因此当A=3时,B有解为5

当A=4时,B=(5-11)+221=215;
当A=5时,B=215-11=204;
当A=6时,B=204-11=193;
当A=7时,B=193-11=182;
当A=8时,B=182-11=171;
当A=9时,B=171-11=160;

可以从解集中得知,只有当A=3时,B在1~9的范围内才有解,为5
故A,B都在1~9的范围内存在唯一解,为:

A=3
B=5

代入
A=3
B=5



C=(3194-(122A+212B))/221;



C=(3194-(122*3+212*5))/221=8;

所以ABC的结果是:

A=3;
B=5;
C=8;

所以最后得出工人甲的工资是358

------------------------------------------------------------

说个题外话:~

职员/工资

甲 358
乙 385
丙 538
丁 583
戊 835
己 853

为啥工资相差那么大,这还不说,那个工资不知道是按天算还是按月算的,嗯,我可以去看看具体情况~

[此贴子已经被作者于2018-5-23 04:33编辑过]

#17
林月儿2018-05-23 07:12
以下是引用九转星河在2018-5-23 03:39:40的发言:

引用了9楼的解释~



C=(3194-(122A+212B))/221;

3194%221=100;

也就是说

(122A+212B)=100+221*k

(122A+212B)%221=100;

设x=122,y=212

y-x=90;

x-(y-x)=2x-y=122-90=32;

((y-x)-2*(2x-y))=3y-5x=90-2*32=26;

(2x-y)-(3y-5x)=7x-4y=6;

(3y-5x)-4*(7x-4y)=19y-33x=2;

50*(19y-33x)=100

950y-1650x=100;

又从19y-33x=2;可以推得

221*(19y-33x)%221=0;

也就是
(4199y-7293x)%221=0;

设k为通项表达式系数~

((4199+122k)y-(7293+212k)x%221)=0;

((4199+61k)y-(7293+106k)x+(950y-1650x))%221=100;

((5149+61k)y-(8943+106k)x)%221=100;

当k取-84时,有

(25y-39x)%221=100;

到这里,由于x为负数,所以这就走不下去了,要再用另一种方法~

回到式子
(A*x+B*y)%221=100;

可以让

(A*x+B*y)%221=0;

这样目的是让A和B的解找到通项系数~

具体解法,可以让
A*x%221=B*y

2x%221=23;

(2x*10)%221=20x%221=9;

(20x*25)%221=500x%221=(500%221)x%221=58x%221=4;

(58x*56)%221=(3248%221)x%221=154x%221=3;

(154x*74)%221=(11396%221)x%221=125x%221=1;

(125x*212)%221=201x%221=212=y;

(201x-y)%221=0;

(-20x-y)%221=0;

(y+20x)%221=0;

到这里,结合

(25y-39x)%221=100;

得,2*(y+20x)+(25y-39x)=(x+27y)%221=100;

到这里,求得A和B都等于正整数解了,但B的取值范围是27不符合题意,因此要求出符合题意的解~

因为
221/20=11余1;

所以有((1-k)x+(27+11k)y)%221=100;

让1-k保证为正数,则加上(x+20y)有

(((1-k)x+(27+11k)y)+(20x+y))%221=((21-k)x+(28+11k)y)%221=100;

由于A和B的取值范围只能是1~9,并且1已经搜索过了
所以k从19开始,也就是21-k=2开始

当k=19时,有

(2x+237y)%221=100;

也就是
(2x+(237%221)y)%221=(2x+16y)%221=100;

所以当A=2时,B=16;
因为16要大于9,因此还要继续搜索~

当k=18时,直接用前面得出的y的系数16减去11,得,B=5;

因此当A=3时,B有解为5

当A=4时,B=(5-11)+221=215;
当A=5时,B=215-11=204;
当A=6时,B=204-11=193;
当A=7时,B=193-11=182;
当A=8时,B=182-11=171;
当A=9时,B=171-11=160;

可以从解集中得知,只有当A=3时,B在1~9的范围内才有解,为5
故A,B都在1~9的范围内存在唯一解,为:

A=3
B=5

代入
A=3
B=5



C=(3194-(122A+212B))/221;



C=(3194-(122*3+212*5))/221=8;

所以ABC的结果是:

A=3;
B=5;
C=8;

所以最后得出工人甲的工资是358

------------------------------------------------------------

说个题外话:~

职员/工资

甲 358
乙 385
丙 538
丁 583
戊 835
己 853

为啥工资相差那么大,这还不说,那个工资不知道是按天算还是按月算的,嗯,我可以去看看具体情况~




厉害厉害
1