一.%运算符
1.使用形如a%b形式的语句来调用%运算符。其中:
-
变量a,b必须为整型变量,如int,short等,而不能为浮点数;
- 变量b必须为非零值,若出现模零错误,程序会因为该异常意外终止。
2.运算特点:
首先计算出|a|被|b|除所得的余数,再使该余数的符号与a保持一致。
若a为正数,则该表达式结果必为非负数(可能为0);
若a为负数,则该表达式结果必为非正数(可能为0);
表达式结果与b的符号没有直接关系,即a%-b与a%b的结果相同。
3.余数存在负数的可能的处理办法:
在该负余数上加上除数再对除数求一次余即可。
4.运算规律:
(a*b)%c = (a%c*b%c)%c
(a+b)%c = (a%c+b%c)%c
二.数位拆解
数位拆解,及把一个给定的数字(如3241)各个数位上的数字拆开,即拆成3、2、4、1。
数位拆解步骤:
以一个四位整数x为例,假定x的千位为a,百位为b,十位为c,各位为d。x=a*1000+b*100+c*10+d,则有:
1. d=x%10;
2. x/10 = a*100+b*10+c
3. 重复上述1,2步,依次得到c,b,a
示例代码:
/*输入两个整数,输出它们的特殊运算结果
*eg. a=123,b=45,result=1*4+1*5+2*4+2*5+3*4+3*5=54
* */
/*方法一*/
import java.util.Scanner;
public class Main {
public static int result(int a,int b){
int aIndex=0;
int bIndex=0;
int sum = 0;
int[] alist = new int[20];
int[] blist = new int[20];
while (a!=0){
int i = a%10;
alist[aIndex++] = i;
a/=10;
}
while (b!=0){
int j=b%10;
blist[bIndex++] = j;
b/=10;
}
for (int i=0;i<=aIndex;i++){
for (int j=0;j<=bIndex;j++){
sum+=alist[i]*blist[j];
}
}
return sum;
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
int a = scanner.nextInt();
int b = scanner.nextInt();
int result = result(a,b);
System.out.println(result);
}
}
}
/*方法二*/
import java.util.Scanner;
public class Main {
public static int result(String a,String b){
int sum = 0;
for (int i=0;i<a.length();i++){
for (int j=0;j<b.length();j++){
//通过将每个字符与字符'0'的ASCII码相减,得到字符对应数字的数值
sum+=(a.charAt(i)-'0')*(b.charAt(j)-'0');
}
}
return sum;
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
//将输入按照字符串对待
String a = scanner.next();
String b = scanner.next();
int result = result(a,b);
System.out.println(result);
}
}
}
三.进制转换
1.以十进制数为中间桥梁,将m进制转换为n进制时,只需要两步:
1.将m进制转换为十进制
2.将十进制转换为n进制
2.将十进制数x转为m进制的步骤:
while(x!=0){
i = x%m;//i为m进制数由右之左的数值
x = x/m;
}
示例代码:
/*题目:输入: 每行:m A B
* 输出:A+B的m进制结果
* 当m==0则结束输入*/
import java.util.Scanner;
public class Main {
//方法一
public static StringBuffer conversion(int m,int number){
//使用StringBuffer来存储转换后的各位数值,最后将其进行反转即得到最终结果
StringBuffer result = new StringBuffer();
//使用do-while保证当number==0时,还是会被处理一次
do {
int i = number%m;
result.append(i);
number/=m;
}while (number!=0);
return result.reverse();
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
int decimal = scanner.nextInt();
if (decimal==0){break;}
int a = scanner.nextInt();
int b = scanner.nextInt();
int sum = a+b;
StringBuffer decimal_result = conversion(decimal,sum);
System.out.println(decimal_result);
}
}
}
//方法二
public static int decimalTobinary(int n){
int t = 0; //用来记录位数
int bin = 0; //用来记录最后的二进制数
int r = 0; //用来存储余数
while(n != 0){
r = n % 2;
n = n / 2;
bin += (int) (r*Math.pow(10,t));//Math.pow(double a,double b)返回a^b
t++;
}
return bin;
}
3.将m进制数x转换为十进制数的步骤:
对每一位数,将其乘以其对应的进制次方,再求和
for(int i=0;i<x.length();i++){sum+=(x.charAt(i)-'0')*m^i;}
四.最大公约数(GreatestCommonDivisor)
- 若a==b==0,则a,b无最大公约数(任意数都能整除a,b);
- 若a!=0,b==0,则a为a,b的最大公约数;
- 若a!=0&&b!=0,则a,b的最大公约数==b,a%b的最大公约数
示例代码:
//求两个数的最大公约数。
//输入:A B
//输出:A,B的最大公约数
import java.util.Scanner;
public class Main {
public static int gcd(int a,int b){
if (b==0){return a;}
else {return gcd(b,a%b);}
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
int a = scanner.nextInt();
int b = scanner.nextInt();
int gcd = gcd(a,b);
System.out.println(gcd);
}
}
}
五.最小公倍数(LeastCommonMultiple)
a、b两数的最小公倍数为两数的乘积除以它们的最大公约数。
证明:
假定k=a*b为a、b的一个公倍数,那么最小公倍数一定不大于k,若有a、b的公约数c,则有:
k/c = a*b/c = a*(b/c) = b*(a/c),其中b/c、a/c均为整数,即k/c同时为a、b的倍数;
反之,若c不是a、b的公约数,则b/c、a/c至少有一个不是整数,则k/c不是a、b的公倍数;
当要求a、b的最大公倍数时,需要k/c最大,则需要c最小,故取c为a、b的最小公约数即可。