关于java的问题,有一个数12,怎么才能用它的个位加上它的十位。也就是:2+1

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于java的问题,有一个数12,怎么才能用它的个位加上它的十位。也就是:2+1相关的知识,希望对你有一定的参考价值。

参考技术A

计算一个整数各个位上的数字和的Java程序如下

public class Test121 
 public static int summary(int n) //计算一个整数各个位上的数字和的函数
  int sum=0;
  while(n>0)
   sum=sum+n%10;
   n=n/10;
  
  return sum;
 
 public static void main(String[] args) 
  System.out.println("一个整数各个位上的数字和是"+summary(12));
 

运行结果

一个整数各个位上的数字和是3

本回答被提问者和网友采纳
参考技术B 12%10+12/10就可以了。

luogu 5426

题目链接

题意

给定1个长度为2n的01数组。你可以交换相邻的元素。询问最少交换次数,使得前n个元素组成的子数组中的逆序对个数等于后n个元素组成的子数组中的逆序对个数。\(1 \leq n\leq 10^5\)

题解

普通的数组中,数的种类繁多,逆序对的求解及动态维护是很复杂的情况。

考虑利用01数组的性质,探寻逆序对个数的本质

对于1个长度为n的子数组而言,它的逆序对个数的计算方法为,对于每个1,累加其后0的个数。而该0的个数又只与该1的下标、其后1的个数有关。

不妨采用数学方法进行化简

设长度为\(n\)的数组中,所有1出现的位置为\(a_i\),总共有\(x\)个1。

则逆序对总数为\(n-a_1-(x-1) + n-a_2-(x-2) + ...+n-an-(x-x) = xn - \fracx(x-1)2-\sum_i=1^xa_i\)

应用到两个子数组逆序对个数相等的情况,设对应的位置1的个数为\(b_i\)\(y\),可得\(xn - \fracx(x-1)2-\sum_i=1^xa_i = yn - \fracy(y-1)2-\sum_i=1^xb_i\)

经历艰苦卓绝的进一步化简,可得\(\frac\sum a_i-\sum b_iy-x=k\),其中常数\(k=\fracx+y-1-2n2\)

因此,只要我们确定了\(x\)\(y\)的大小,即可确定最终目标;也可以确定两边的1位位置和的变化范围(全部最靠左/全部最靠右)。简单计算即可判断目标是否能够实现。

枚举\(x\),则\(y\)易求。然后求达成目标的最小交换次数。考虑分步处理

(不妨以从右至左为例)

首先,要以最少的步数将\(move\)个1从右边过渡到左边。

过渡的途径唯一:交换第n与第n+1位。因此,只有它们分别为0 1时,1次交换才能达成过渡的目的。

如果要继续过渡,则应将第n位的1向左交换。结合\(move\)个元素进行过渡的情况,发现本质是:左边数组末尾空出\(move\)个0,右边数组将\(move\)个1集中到最左端,再将它们顺次过渡。

如何以最少的步数空出\(move\)个0?经过数学推导,只需找到从右往左的第\(move\)个0的位置,将原本该位置以后的1从该位开始顺次排列。步数即为这些1的目标位置和与原位置和的差值。通过简单的预处理可以快速求解。

如何以最少的步数将\(move\)个1集中到最左端。同理,找到第\(move\)个1的位置,原位置和减去目标位置和即可。

再者,要以最少的位置实现目标的坐标和差。

不难想到,任何1个子数组的坐标和要改变1,只需将某个与0相邻的1交换1次。因此其坐标和变化范围内的任何1个值都可以达到,且每改变1只需交换1次。因此,计算将元素成功过渡后的坐标和差,将其与目标的坐标和差的差值累加入本次答案中。

时间复杂度:\(O(n)\)代码见此

回顾与思考

问题较为奇怪烦琐时,不妨利用其性质简化问题,探寻其性质。

在面对复杂问题时要有分步思考的意识和耐心,才能抵达真理的彼岸。

以上是关于关于java的问题,有一个数12,怎么才能用它的个位加上它的十位。也就是:2+1的主要内容,如果未能解决你的问题,请参考以下文章

如何用c语言表示一个三位数的个十百位

bzoj1345 序列问题 (贪心)

50分!请问个java基础问题

luogu 5426

关于动态规划的思考

一个问题:关于finally中return吞掉catch块中抛出的异常