搜索
查看: 1447|回复: 24
打印 上一主题 下一主题

解题求助

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-4 16:37:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面的乘法算式中,字母E代表偶数,字母P代表奇数。请依据该算式,填写出正确的数学算式(横式)及最后的计算结果:______
       P E E
X)      E  E
----------------
   E P E E
   E P E
----------------
   P P E E
推荐
发表于 2014-10-4 19:45:51 | 只看该作者
leilei0412 发表于 2014-10-4 18:24
真是高手啊,非常感谢O(∩_∩)O~,代码收藏了,希望经过继续学习后,以后能看懂。

其实唯一的难点就是拆分数字吧
a / 1000 得到千位上的数字
a % 1000 / 100 得到百位上的数字

如果你有耐心可以试着用最普通的穷举法写一写

点评

高手诶 看完之后我也大概懂了...  发表于 2014-10-6 16:58
推荐
发表于 2014-10-4 18:03:10 | 只看该作者
最后整理好的代码
  1. #include <stdio.h>

  2. void next(int*);
  3. int check1(int);
  4. int check2(int);
  5. int check_result(int);

  6. int main()
  7. {
  8.         int p, j=20, k=20;

  9.         for(p=1; p<=9; p+=2){
  10.                 j = 20;
  11.                 while(j<=88){
  12.                         k = 20;
  13.                         while(k<=88){
  14.                                 int a = (p*100 + j) * (k % 10);
  15.                                 int b = (p*100 + j) * (k / 10) * 10;
  16.                                 if(check1(a) && check2(b) && check_result(a+b)){
  17.                                         printf("%d%d %d %d %d %d\n", p, j, k, a, b, a+b);
  18.                                         printf("%d%d x %d = %d\n", p, j, k, a+b);
  19.                                 }
  20.                                 next(&k);
  21.                         }
  22.                         next(&j);
  23.                 }
  24.         }

  25.         return 0;
  26. }

  27. void next(int* num)
  28. {
  29.         (*num) += 2;
  30.         if(*num / 10 % 2 == 1)
  31.                 (*num) += 10;
  32. }

  33. int check1(int num)
  34. {
  35.         int thou, hun, tens;
  36.         if(num < 1000 || num > 9999)
  37.                 return 0;

  38.         thou = num / 1000;
  39.         hun = num % 1000 / 100;
  40.         tens = num % 100 / 10;

  41.         return thou % 2 == 0 && hun % 2 == 1 && tens % 2 == 0;
  42. }

  43. int check2(int num)
  44. {
  45.         int thou, hun;
  46.         if(num < 1000 || num > 9999)
  47.                 return 0;

  48.         thou = num / 1000;
  49.         hun = num % 1000 / 100;

  50.         return thou % 2 == 0 && hun % 2 == 1;
  51. }

  52. int check_result(int num)
  53. {
  54.         int thou, hun;
  55.         if(num < 1000 || num > 9999)
  56.                 return 0;

  57.         thou = num / 1000;
  58.         hun = num % 1000 / 100;

  59.         return thou % 2 == 1 && hun % 2 == 1;
  60. }
复制代码
沙发
发表于 2014-10-4 16:52:09 | 只看该作者
这个条件是矛盾的,无解
板凳
 楼主| 发表于 2014-10-4 16:55:02 | 只看该作者
#include <stdio.h>
#include <stdlib.h>
int main()
{
        int p,e;
    for(p=1;p<=9;p++)
    {
                for(e=0;e<=8;e++)
        {
                        if(p%2==1&&e%2==0&&(p*100+e*10+e)*(e*10+e)==(p*1000+p*100+e*10+e))
                        printf("%d %d\n",p,e);
        }
    }
        system("pause");
        return 0;
}
这样写正确吗?程序运行后只显示“请按任意键继续……”
地板
 楼主| 发表于 2014-10-4 16:56:02 | 只看该作者
rosynirvana 发表于 2014-10-4 16:52
这个条件是矛盾的,无解

题目无解,请问这样的解题思路对吗?
5#
发表于 2014-10-4 16:59:42 | 只看该作者
leilei0412 发表于 2014-10-4 16:56
题目无解,请问这样的解题思路对吗?

思路对的,但是你还少用了2个约束条件
PEE x E = EPEE
EPE x 10E = 10EPE  
6#
 楼主| 发表于 2014-10-4 17:03:16 | 只看该作者
rosynirvana 发表于 2014-10-4 16:59
思路对的,但是你还少用了2个约束条件
PEE x E = EPEE
EPE x 10E = 10EPE

在printf上一行再用if语句判断这两个条件?
额,编程真不容易
谢谢指教,感激O(∩_∩)O~
7#
发表于 2014-10-4 17:04:27 | 只看该作者
leilei0412 发表于 2014-10-4 16:56
题目无解,请问这样的解题思路对吗?

我觉得这个不用编程,条件给太多了一下子子就能导出矛盾
首先E x E的个位数是E,那么E必然是0,1,5,6之一
E不能是0,否则P为0,和P是奇数矛盾
所以E只能是6

然后又有E+E得个位数是P,得到P等于2,和P是奇数矛盾

或者

P + P的尾数是 P,P只能是0,和P是奇数矛盾
8#
发表于 2014-10-4 17:05:24 | 只看该作者
leilei0412 发表于 2014-10-4 17:03
在printf上一行再用if语句判断这两个条件?
额,编程真不容易
谢谢指教,感激O(∩_∩)O~

是的
9#
 楼主| 发表于 2014-10-4 17:07:51 | 只看该作者
rosynirvana 发表于 2014-10-4 17:04
我觉得这个不用编程,条件给太多了一下子子就能导出矛盾
首先E x E的个位数是E,那么E必然是0,1,5,6 ...

题目只说E代表偶数 Ex E 的个位数是E,也可能是2 x 4=8
10#
发表于 2014-10-4 17:13:56 | 只看该作者
leilei0412 发表于 2014-10-4 17:07
题目只说E代表偶数 Ex E 的个位数是E,也可能是2 x 4=8

算E x E, 2 x 4是怎么一回事……你得到的8和之前的俩E还都不一样
11#
发表于 2014-10-4 17:16:47 | 只看该作者
如果不保证所有的P相等那么代码就不是那么写了,而且题目应该特别说明的……
12#
 楼主| 发表于 2014-10-4 17:17:42 | 只看该作者
rosynirvana 发表于 2014-10-4 17:13
算E x E, 2 x 4是怎么一回事……你得到的8和之前的俩E还都不一样

题目只说E代表偶数,没说E只能是同一个数,所以想不出编程思路。网上搜了一下,这个题目是2002年江苏省青少年信息学奥赛的题目,应该不会没答案吧。可就是不会做
13#
 楼主| 发表于 2014-10-4 17:20:52 | 只看该作者
rosynirvana 发表于 2014-10-4 17:13
算E x E, 2 x 4是怎么一回事……你得到的8和之前的俩E还都不一样

如果省去中间那两个条件:PEE*EE=PPEE,只要求E是偶数,P是奇数,类似128*28=3584就符合。
请问如果把所有条件都加进去,按题目要求,这个编程该怎么写啊?实在想不出任何思路
14#
 楼主| 发表于 2014-10-4 17:25:32 | 只看该作者
rosynirvana 发表于 2014-10-4 17:16
如果不保证所有的P相等那么代码就不是那么写了,而且题目应该特别说明的……

如果只保证P是奇数,E是偶数,不管他么是否相等,请问这个代码怎么写啊?
15#
发表于 2014-10-4 17:28:20 | 只看该作者
leilei0412 发表于 2014-10-4 17:20
如果省去中间那两个条件:PEE*EE=PPEE,只要求E是偶数,P是奇数,类似128*28=3584就符合。
请问如果把所 ...

忽略中间两个条件
  1. #include <stdio.h>

  2. int is_even(int);

  3. int main()
  4. {
  5.         int p, j, k;
  6.         for(p=1; p<=9; p+=2){
  7.                 for(j=20; j<=88; j+=2){
  8.                         if(j / 10 % 2 == 1)
  9.                                 j += 10;
  10.                         for(k=20; k<=88; k+=2){
  11.                                 if(k / 10 % 2 == 1)
  12.                                         k += 10;
  13.                                 int temp = (p*100 + j) * k;
  14.                                 if(temp < 10000 &&
  15.                                         !is_even(temp / 1000) &&
  16.                                         !is_even(temp % 1000 / 100) &&
  17.                                         is_even(temp % 100 / 10))
  18.                                 printf("%d%d %d %d\n", p, j, k, temp);
  19.                         }
  20.                 }
  21.         }
  22.         return 0;
  23. }

  24. int is_even(int a)
  25. {
  26.         return a % 2 == 0;
  27. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表