搜索
查看: 5171|回复: 17
打印 上一主题 下一主题

C语言一天一练--22.august

[复制链接]
跳转到指定楼层
楼主
发表于 2012-8-22 15:50:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
编程题——雷劈数
---------------------------------------------------------------------------------------------------------------------------------
印度数学家卡布列克(Dattaraya Ramchandra Kaprekar, 1905 - 1986)在一次旅行中,遇到猛烈的暴风雨,他看到路边一块牌子被劈成了两半:一半上写着30,另一半写着25。这时,卡布列克忽然发现30+25=55,55^2=3025,把劈成两半的数加起来,再平方,正好是原来的数字。从此他就专门搜集这类数字。

现在请你编一个程序,找出所有12位以下的雷劈数
---------------------------------------------------------------------------------------------------------------------------------

沙发
发表于 2012-8-22 16:04:09 | 只看该作者
看见挑战,我就瞬间蛋碎了。。。。  

点评

挺住  发表于 2013-8-26 19:39
淡定,些!楼主出的题太给力了,偶电脑太落伍,按思路写出来也不敢调试,12位数耶,,,O oooo  发表于 2012-8-22 20:40
板凳
 楼主| 发表于 2012-8-22 16:28:16 | 只看该作者
wjj760024621 发表于 2012-8-22 16:04
看见挑战,我就瞬间蛋碎了。。。。

童鞋,但是这···不是挑战
地板
发表于 2012-8-22 16:43:07 | 只看该作者
我想知道 (100 + 00)^2 == 10000算不算

评分

参与人数 1啊哈币 +2 收起 理由
李掌柜 + 2 高人......很给力

查看全部评分

5#
 楼主| 发表于 2012-8-22 16:47:51 | 只看该作者
RTNelo 发表于 2012-8-22 16:43
我想知道 (100 + 00)^2 == 10000算不算

(10+0)^ 2=100算
6#
发表于 2012-8-22 21:41:42 | 只看该作者
#include <stdio.h>
int main()
{
        int a;
    int b=0;
    for(a=1;a<=99999999999;a++)
    {
     for(b=0;b<=99999999999;b++)
    b=(b+a)*(b+a);
     printf("%d",b);
    }
        sleep(500000000000000);
        return 0;

评分

参与人数 1啊哈币 +1 收起 理由
李掌柜 + 1 申明类型有误....

查看全部评分

7#
发表于 2013-2-5 22:48:49 | 只看该作者
woxxxxxxxx
8#
发表于 2013-2-8 14:24:34 | 只看该作者
12位以下的所有霹雳数:
9#
发表于 2013-2-28 14:04:34 | 只看该作者
本帖最后由 gloomyakon 于 2013-2-28 14:16 编辑

计算起来还蛮费劲儿的,所以只等它算出个部分结果。不知道有没有更快的计算方法,求教。
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. /*
  5. 1.12位以下的雷劈数,则超出int的表示范围了。使用long long才行
  6. 2.如果是雷劈数则(a+b)^2=a*[log10(b)]+b,其中[]是向上取整。
  7. 3.但是C语言里的log10等函数没有针对long long类型的所以要强制转换。*/
  8. int main()
  9. {

  10.         long long sum;
  11.         long long product;
  12.         long long a,b;
  13.         for (a=1;a<999999999999;a++)
  14.         {
  15.                 for(b=0;b<999999999999;b++)
  16.                 {
  17.                         product = (a+b)*(a+b);
  18.                         if(log10((long double)product)>12)
  19.                                 break;
  20.                         sum=a*pow(10,floor(log10((long double)b)+1))+b;
  21.                         if(product==sum)
  22.                                 printf("a=%lld,b=%lld,\t%lld\n",a,b,product);
  23.                 }
  24.         }
  25.         system("pause");
  26.         return 0;
  27. }
复制代码

leipi.PNG (16.96 KB, 下载次数: 19)

部分结果

部分结果
10#
发表于 2013-3-11 22:11:18 | 只看该作者
#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{    int x,y;
   for(x=1;x<=999999999999;x++){
           for(y=1;y<=999999999999;y++){
                   if(((x+y)*(x+y))==(x*10+y)){

                           printf("x=%d",x);
                           printf("y=%d",y);
                           printf("雷劈数=%d",(x+y)*(x+y));
                   }
           }
   }
        return 0;
}
但是出数的速度太慢了 求高人指点一下  谢谢
11#
发表于 2013-3-11 22:15:42 | 只看该作者
zacks 发表于 2013-3-11 22:11
#include "stdafx.h"

两重循环肯定慢啊
此外你机器上int型能到999999999999的吗,一般不能的
12#
发表于 2013-3-11 22:28:17 | 只看该作者
rosynirvana 发表于 2013-3-11 22:15
两重循环肯定慢啊
此外你机器上int型能到999999999999的吗,一般不能的

那怎么破??
13#
发表于 2013-3-11 23:00:21 | 只看该作者
zacks 发表于 2013-3-11 22:28
那怎么破??

(10^6 + 0)^2=10^12
已经是13位数了
所以没必要扫描那么多
14#
发表于 2013-3-12 20:56:51 | 只看该作者
rosynirvana 发表于 2013-3-11 23:00
(10^6 + 0)^2=10^12
已经是13位数了
所以没必要扫描那么多

对不起啊 有点没明白
15#
发表于 2013-3-23 11:05:54 | 只看该作者
我觉得一个扫描到999999(6位数),一个扫描到99999(5位数)就够了。如果两个都是6位数就超出题目要求了。12位以下最大的雷劈数是991218   40892(11位数)。
编一个程序,找出所有12位以下的雷劈数
*/
#include <stdio.h>
int main()
{
    long int a,b;
    printf("开始输出0-100000000000内的霹雳数: 8,1 10,0\n");           /*0-10内的霹雳数*/  
    for(a=1;a<=999999;a++)
    {
    for(b=2;b<=99999;b++)               
    if(a*10+b==(a+b)*(a+b)||a*100+b==(a+b)*(a+b)||a*1000+b==(a+b)*(a+b)||a*10000+b==(a+b)*(a+b)||a*100000+b==(a+b)*(a+b))                                                                                                               
       printf("%ld,%ld ",a,b);   
    }
    printf("计算结束!");
        getchar();
        return 0;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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