鱼C论坛

 找回密码
 立即注册
查看: 2403|回复: 5

题目206:隐藏的平方数

[复制链接]
发表于 2016-11-22 19:05:40 | 显示全部楼层 |阅读模式

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

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

x
Concealed Square

Find the unique positive integer whose square has the form 1_2_3_4_5_6_7_8_9_0,
where each “_” is a single digit.


题目:

找出唯一一个符合如下条件的数字:它的平方是具有 1_2_3_4_5_6_7_8_9_0 形式的数。

每个 _ 都代表了单个数字。



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-4 19:53:19 | 显示全部楼层
  1. #coding:utf-8
  2. i = int(1929394959697989990**0.5)
  3. while i>=int(1020304050607080900**0.5):
  4.     s = str(i*i)
  5.     if (s[0],s[2],s[4],s[6],s[8],s[10],s[12],s[14],s[16],s[18]) == ('1','2','3','4','5','6','7','8','9','0'):
  6.         print (i,i*i)
  7.         break
  8.     i -= 1
复制代码

输出:
1389019170 1929374254627488900
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-22 08:05:11 | 显示全部楼层
  1. from math import sqrt
  2. import time
  3. amax = 1929394959697989990
  4. amin = 1020304050607080900
  5. #print(int(sqrt(amin)), int(sqrt(amax))) #1010101010 1389026623 10^9

  6. st = time.time()

  7. waitinglist=[]
  8. for a in range(10):
  9.         if a*a % 10 == 0:
  10.                 waitinglist.append(a)
  11. maxDigit = len(str(int(sqrt(amin))))-1
  12. if maxDigit%2 == 0: #9
  13.         maxDigit -= 1

  14. #n=a+b ==>n^2 = a^2+2ba+b^2
  15. #low 3 digit
  16. #let b = n%1000, a=(n//1000)*1000
  17. #so a^2 's lower 3 digit is n^3 's lower 3 digit
  18. for digit in range(3, maxDigit+1, 2):
  19.         wl = []
  20.         for x in waitinglist:
  21.                 for b1 in range(0, 100):
  22.                         b = b1*(10**(digit-2))+x
  23.                         if (b*b % 10**digit)//10**(digit-1) == (10 - digit//2):
  24.                                 wl.append(b)
  25.         waitinglist = wl
  26.         #print(digit,len(waitinglist)) #24000

  27. def check(n):
  28.         n = str(n)
  29.         if (len(n)==19):
  30.                 for i in range(5+1): #67890 have checked
  31.                         if n[i*2]!=str(i+1):
  32.                                 return False
  33.         else:
  34.                 return False
  35.         return True

  36. r = 0
  37. for h in range(int(sqrt(amin))//10**maxDigit, int(sqrt(amax))// 10**maxDigit +1):
  38.         for x in waitinglist:       
  39.                 b = h* 10**9 + x
  40.                 if check(b*b):
  41.                         print(b, b*b)
  42.                         r = b
  43.                         break
  44.         if r != 0:
  45.                 break
  46. #1389019170 1929374254627488900
  47. print(time.time()-st) #0.75s
复制代码


1389019170 1929374254627488900
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-26 10:32:46 | 显示全部楼层
这个题目可以先做一些数学上的简单分析:平方后的数最后一个数字是0,那么原数的最后一位一定是0;所以平方后的数最后二位一定都是0;去掉这两个零后平方后的数最后一位是9,故原数的最后一位一定是3或7。然后开方10203040506070809和19293949596979899得10101010和13890266。而最后一个数只能是3或7。所以搜索范围为:1010101030到1389026670之间。如果在加上平行编程可以把时间控制在1秒以下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-29 11:46:53 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-5-4 09:54 编辑

C++ 680ms
  1. #include<iostream>
  2. using namespace std;


  3. int main() {
  4.     unsigned long long i, n;
  5.     unsigned char j;

  6.     for (i = 101010103;;) {
  7.         n = i * i;

  8.         for (j = 9; j; j--) {
  9.             if (n % 10 != j) {
  10.                 goto next;
  11.             }
  12.             n /= 100;
  13.         }

  14.         cout << i * 10 << endl;
  15.         return 0;

  16.     next:
  17.         i++;
  18.     }
  19. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 10:37:08 | 显示全部楼层
1389019170

Process returned 0 (0x0)   execution time : 0.555 s
Press any key to continue.
4#的c++实现~
  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4. typedef long long ll;

  5. const int lb = (int)sqrt((double)10203040506070809);
  6. const int ub = (int)sqrt((double)19293949596979899);

  7. bool judge(ll x){
  8.   for (int i = 9;i >= 1;i--){
  9.     if (x % 10 != i)  return false;
  10.     x /= 100;
  11.   }
  12.   return true;
  13. }

  14. int main(){

  15.   for (int i = lb;i <= ub;i++){
  16.     ll t = (ll)i*i;
  17.     int r = i % 10;
  18.     if (r != 3 && r != 7) continue;

  19.     if (judge(t)) {cout << i << 0 << endl; break;}
  20.   }
  21.   return 0;
  22. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 17:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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