鱼C论坛

 找回密码
 立即注册
查看: 2924|回复: 4

题目145:10亿以下有多少可反数?

[复制链接]
发表于 2016-8-31 16:07:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
How many reversible numbers are there below one-billion?

Some positive integers n have the property that the sum [ n + reverse(n) ] consists entirely of odd (decimal) digits. For instance, 36 + 63 = 99 and 409 + 904 = 1313. We will call such numbers reversible; so 36, 63, 409, and 904 are reversible. Leading zeroes are not allowed in either n or reverse(n).

There are 120 reversible numbers below one-thousand.

How many reversible numbers are there below one-billion (109)?


题目:

一些正整数 n 有这样一个性质:n 与 n取“相反”之和的所有位皆为奇数。例如: 36 + 63 = 99 以及 409 + 904 = 1313。我们将这样的数成为可反数;所以,36,63,409,904 都是可反数。在 n 和 n 取相反的最前面都不允许有 0。

一千以下共有 120 个可反数。

10 亿(109)以下共有多少个可反数?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-31 18:23:48 | 显示全部楼层
608720个吧
跑了我好久的说
  1. #include <myLib/myLib.h>


  2. //判断是否为可反数
  3. bool isz(int z)
  4. {
  5.         char buf[10]={0};
  6.         char b[10]={0},c[10]={0};
  7.         itoa(z,buf,10);
  8.         int len = strlen(buf);
  9.          memcpy(b,buf,len);
  10.          memcpy(c,buf,len);
  11.          ;//c是反过来的数  b是没反的
  12.         reverse(c,c+len);
  13.         if(c[0]=='0') return false;
  14.        
  15.         //2个数字的和
  16.         int value = atoi(b) + atoi(c);

  17.     while (value)
  18.     {
  19.                 if((value%10)%2==0)
  20.                         return false;
  21.                 value/=10;
  22.     }

  23.         return true;///*******************
  24. }
  25. int main()
  26. {
  27.         int m = 0;
  28.          
  29.         //10亿 干 2^31 = 2147483648
  30.         //10Y          = 1000000000
  31.         for (int z = 1;z<=1000000000;z++)
  32.         {
  33.                 if(isz(z))
  34.                 {
  35.                         m++;
  36.                         //std::cout<<z<<endl;
  37.                 }
  38.         }
  39.         std::cout<<m;
  40.         return 0;
  41. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-26 11:17:25 | 显示全部楼层
  1. from numba import jit, autojit
  2. from math import log10
  3. from time import process_time

  4. @jit("int32(int32)")
  5. def reverse_add(n):
  6.         m = n
  7.         l = int(log10(n))
  8.         s = 0
  9.         for i in range(l+1):
  10.                 s = s*10 + n%10
  11.                 n //= 10
  12.         return s+m

  13. @jit("boolean(int32)")
  14. def judge_odd(n):
  15.         while n > 0:
  16.                 if n % 2 == 0:
  17.                         return False
  18.                 n //= 10
  19.         return True

  20. @jit("int32(int32)")
  21. def solve(limit):
  22.         c, i = 0, 11
  23.         while i < limit:
  24.                 if (i // (10**int(log10(i)))) % 2:
  25.                         i += 10**int(log10(i))
  26.                 if judge_odd(reverse_add(i)):
  27.                         c += 2
  28.                 i += 2
  29.         return c

  30. print(solve(1000000000))
  31. print(process_time())
复制代码

608720
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 08:52:33 | 显示全部楼层
  1. #include<stdio.h>


  2. bool isreversible(int n) {
  3.     if (!(n % 10)) {
  4.         return false;
  5.     }

  6.     int temp = n, res = 0;

  7.     while (temp) {
  8.         res = res * 10 + temp % 10;
  9.         temp /= 10;
  10.     }

  11.     res += n;

  12.     while (res) {
  13.         if (!(res & 1)) {
  14.             return false;
  15.         }
  16.         res /= 10;
  17.     }

  18.     return true;
  19. }


  20. int main() {
  21.     int sum = 0;
  22.     for (int i = 1000000000; --i; sum += isreversible(i));
  23.     printf("%d", sum);
  24.     return 0;
  25. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 21:46:46 | 显示全部楼层
本帖最后由 guosl 于 2022-9-21 19:04 编辑

/*
608720
1.48196秒 (AMD R5 5600G)
*/
#include <iostream>
#include <omp.h>
using namespace std;

int main(void)
{
  double t = omp_get_wtime();
  int nCount = 0;
#pragma omp parallel for reduction(+:nCount)
  for (long long i = 11; i < 1000000000ll; ++i)
  {
    if (i % 10 == 0)
      continue;
    long long k = i, j = 0;
    while (k != 0)
    {
      j = 10 * j + k % 10;
      k /= 10;
    }
    k = i + j;
    bool bFlag = true;
    while (k != 0)
    {
      if (((k % 10) & 1) == 0)
      {
        bFlag = false;
        break;
      }
      k /= 10;
    }
    if (bFlag)
      ++nCount;
  }
  t = omp_get_wtime() - t;
  cout << nCount << endl << t << endl;
  return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-20 02:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表