啊哈磊_编程从这里起步

标题: C语言一天一练--22.august [打印本页]

作者: 凡夫俗子    时间: 2012-8-22 15:50
标题: C语言一天一练--22.august
编程题——雷劈数
---------------------------------------------------------------------------------------------------------------------------------
印度数学家卡布列克(Dattaraya Ramchandra Kaprekar, 1905 - 1986)在一次旅行中,遇到猛烈的暴风雨,他看到路边一块牌子被劈成了两半:一半上写着30,另一半写着25。这时,卡布列克忽然发现30+25=55,55^2=3025,把劈成两半的数加起来,再平方,正好是原来的数字。从此他就专门搜集这类数字。

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

作者: wjj760024621    时间: 2012-8-22 16:04
看见挑战,我就瞬间蛋碎了。。。。  
作者: 凡夫俗子    时间: 2012-8-22 16:28
wjj760024621 发表于 2012-8-22 16:04
看见挑战,我就瞬间蛋碎了。。。。

童鞋,但是这···不是挑战
作者: RTNelo    时间: 2012-8-22 16:43
我想知道 (100 + 00)^2 == 10000算不算
作者: 凡夫俗子    时间: 2012-8-22 16:47
RTNelo 发表于 2012-8-22 16:43
我想知道 (100 + 00)^2 == 10000算不算

(10+0)^ 2=100算
作者: 2420015589    时间: 2012-8-22 21:41
#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;
作者: 4k-Rn    时间: 2013-2-5 22:48
woxxxxxxxx
作者: kekegcs    时间: 2013-2-8 14:24
12位以下的所有霹雳数:

作者: gloomyakon    时间: 2013-2-28 14:04
本帖最后由 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)

部分结果

部分结果

作者: zacks    时间: 2013-3-11 22:11
#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;
}
但是出数的速度太慢了 求高人指点一下  谢谢
作者: rosynirvana    时间: 2013-3-11 22:15
zacks 发表于 2013-3-11 22:11
#include "stdafx.h"

两重循环肯定慢啊
此外你机器上int型能到999999999999的吗,一般不能的
作者: zacks    时间: 2013-3-11 22:28
rosynirvana 发表于 2013-3-11 22:15
两重循环肯定慢啊
此外你机器上int型能到999999999999的吗,一般不能的

那怎么破??
作者: rosynirvana    时间: 2013-3-11 23:00
zacks 发表于 2013-3-11 22:28
那怎么破??

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

对不起啊 有点没明白
作者: kekegcs    时间: 2013-3-23 11:05
我觉得一个扫描到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;
}

作者: ceysd116    时间: 2013-3-26 17:11
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
        int i,w;
    long a,b,sum,p;
    for (a=1;a<1000000;a++)
    {
                for(b=1;b<1000000;b++)
                {
                        for(i=1;i<10;i++)
                        {
                                w=(int)ceil(pow(10,i));  
                                if(b/w==0)
                                        {
                                                //printf("%d\n",i);
                                                break;
                                        }
            }
            sum=a*w+b;
            p=(a+b)*(a+b);
            if(sum==p&&p<=999999999999)
                        printf("a=%ld  b=%ld  ab=%ld\n",a,b,sum);      
        }
    }
   
        system("pause");
        return 0;
}




对log10()函数不太了解,用稍微熟悉的方法写了个,应该没错。
只是出答案的速度太慢了点。呵呵三重循环。


作者: baobao    时间: 2013-8-22 21:55
#include <stdio.h>
#include<math.h>

int func(int z)
{
       int x ,  y ;
       for (int i=10;z% i !=z ;i*=10)
       y = z % sqrt(i);
       x=( z - y ) / sqrt(i) ;
       if( (x+y) * (x+y)==z)
             return(z);
       else   return 0;
}

void main()
{
       int  a=10,b;
       while(a<99999999999)
       {
               b=func(a);
               if(b!=0)
                     printf("%d\n",a);
       }
}
作者: baobao    时间: 2013-8-22 21:55
#include <stdio.h>
#include<math.h>

int func(int z)
{
       int x ,  y ;
       for (int i=10;z% i !=z ;i*=10)
       y = z % sqrt(i);
       x=( z - y ) / sqrt(i) ;
       if( (x+y) * (x+y)==z)
             return(z);
       else   return 0;
}

void main()
{
       int  a=10,b;
       while(a<99999999999)
       {
               b=func(a);
               if(b!=0)
                     printf("%d\n",a);
       }
}




欢迎光临 啊哈磊_编程从这里起步 (https://bbs.codeaha.com/) Powered by Discuz! X3.2