Given an integer N,you should come up with the minimum
nonnegative integer M.M meets the follow condition: M
2%10
x=N (x=0,1,2,3....)
For each case, each line contains one integer N(0<= N <=10 9), indicating the given number.
3 3 21 25
None 115
分析:首先我们在纸上模拟一下平方的计算过程,就可以明白,所求的数的n第几位是怎么通过m的计算过程求出来的。
假设n为36,那么我们首先要寻找第一位(倒着找)6,那么谁的平方是个位为6呢?显然4,6,之类的可以,由于要寻找最小的,那么就可以确定为4,假设m为ab,即b为4,那么如何求得a呢?由计算过程ab*ab%100=n可知,(b*b/10+2*a*b%10)%10即得到n的第二位3。具体解释一下就是:b*b/10为末位的进位加上这一位2*a*b%10(除去本位进位)再取模即得本位数字
如果有第三位c,那么为(2*cb+a*a+(b*b/10+2*a*b)/10)%10,以此类推,.....即可
同时。如果n有x位,那么m最多也有x位。
上代码:
import java.util.*; public class Main { static Scanner in = new Scanner(System.in); static long res,min,r; static int len; static long[] num = new long[20]; //p代表第几位,w代表x(题目中x),res代表结果m static void dfs(int p,long w,long res){ if(p>len){ min=Math.min(min, res); return; } for (long i = 0; i < 10; i++) { if((res*res/10+r*i%10)%10==num[p]){ dfs(p+1,w*10,i*w+res); } } } public static void main(String[] args) { int k = in.nextInt(); while(k-->0){ res=0;min=Long.MAX_VALUE;r=1; long n = in.nextLong(); len=0; while(n!=0){ num[++len]=n%10; n/=10; } if(num[1]==2||num[1]==3||num[1]==7||num[1]==8){ System.out.println("None"); continue; } for (long i = 0; i < 10; i++) { if(i*i%10==num[1]){ r=i*2;//即2b部分 dfs(2,10,i); } } if(min==Long.MAX_VALUE) System.out.println("None"); else System.out.println(min); } } }
总结:取模运算就是将数字的每一位取出来,除运算就是将数字每一位数除去同时商就是这位数字要根据需求来进行除数的选取