1.计算输入数据的阶乘值
这里有两种方法,循环在此不做介绍
递归
程序调用自身的编程技巧称为递归。一个过程或函数在其定义或说明中有直接或间接嗲用自身的一种方法,他通常把一个大型阀组的问题层层转化为一个于原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大的减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当递归条件满足时,递归返回。
例如汉诺塔问题、斐波那契数列
递归的两个条件
1.可以通过递归调用来缩小问题规模,且新问题与原问题有着相同的形式
2.存在一种简单情景,可以使递归在简单情景下退出
递归三要素
1.一定有一种可以退出程序额情况
2.总是在尝试将一个问题化简到更小的规模
3.父问题与子问题不能有重叠的部分
//循环方法
long sum = 1;
for(int i =1;i<=10;i++ ) {
sum = i*sum;
}
System.out.println(sum);
//递归方法
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数");
int num = sc.nextInt();
int res = A(num);
System.out.println(res);
}
//递归算法解决
public static int A(int len) {
if(len == 1)
return 1;
return len*A(len-1);
}
?调用递归是循环操作的最后一道防线
2.互换两个数的值(不允许使用中间变量) ?
思路:考核变量的概念
int a = 3,b = 2;
a = a+b; //此时a = 5
b = a-b; //此时b = 5-2 = 3
a = a-b; //此时a = 5-3 = 2
System.out.println(a);
System.out.println(b);
3.输出三个数中的最大值和最小值
三目运算符
思路:获取前两个数值中较大的数
获取第三个数和上一步较大数中最大的数
Scanner sc = new Scanner(System.in);
System.out.println("请输入三个整数:");
int num1 = sc.nextInt();
int num2 = sc.nextInt();
int num3 = sc.nextInt();
System.out.println(((num1 > num2) ? num1 : num2)>num3 ? ((num1 > num2) ? num1 : num2):num3 );
//直接在控制台输出最大值 不建议这种写法,但是这种方法可以锻炼三目运算符的逻辑 可以拆开来写
int temp = num1 > num2 ? num1 : num2; //如果num1 > num2,则返回num1,否则返回num2
int max = temp > num3 ? temp : num3; //temp获取的是num1和num2中较大的数,然后和num3进行比较就可获取到三个数中最大的数
System.out.ptintln(max);
三目运算符的考点
int k1 = 12, k2 = 5;
int num = (k1>k2) ? ++k1 : k2++;
//这里需要注意 ++k是先+1在获取k的值 k++是先获取k的值在进行+1操作
System.out.println("num="+k1+"———"+k2);
//输出结果为: num=13———5
还可以用Math.max获取两个数中的最大值
Scanner sc = new Scanner(System.in);
int[] arr = new int[3];
for(int i = 0;i < arr.length;i ++){
System.out.println("输入整数:");
int a = sc.nextInt();
arr[i] = a;
}
int temp = Math.max(arr[0],arr[1]);
int max = Math.max(temp,arr[2]);
System.out.println(max);
4.输出1-100的奇数 每行输出6个
public static void main(String[] args) {
int a = 0;
for (int i = 0; i < 100; i++) {
if (i % 2 != 0) {
System.out.print(i + "\t");
if (++a % 6 == 0) {
System.out.println();//每行输出6个 注意这个判断语句的位置
}
}
}
}
5.1-100求和(for while以及do/while的写法)
//for循环
int res = 0;
for(int i = 1;i <= 100;i ++){
res = res+i;
}
System.out.println(res);
System.out.println("-----------");
//do...while循环
int res1 = 0;
int k = 0;
do {
res1 +=k++ ;
}while(k <= 100); {
System.out.println(res1);
}
System.out.println("-----------");
//while循环
int res2 = 0;
int k1 = 0;
while(k1 < 100) {
k1++;
res2 += k1;
}
System.out.println(res2);
以上三种写法(不止针对本题)对于刚开始学习的小白来说极为重要,关键在于弄清楚各种算数运算符的含义,以及锻炼循环的逻辑思维。
6.1-100奇数和
//for循环
//第一种方法
int res = 0;
for(int i = 0;i < 100;i ++){
if(i%2 != 0){
res += i;
}
System.out.println(res);
}
//第二种方法
for(int i = 1;i < 100;i+=2){ //for循环中第三表达式不一定只能加1
res+=i;
}
System.out.println(res);
//练习continue和break的用法
//for循环里判断
int sum = 0;
for(int i = 0;i < 100;i ++){
if(i%2 == 0){
continue;
}
sum += i;
}
System.out.println(sum);
//while循环
int temp = 0;
int k = 0;
while(true){
if(++k > 100){
break; //避免死循环 立即终止程序
}
if(i%2 == 0){
continue; //当为偶数的时候跳过不执行下边语句
}
res += i;
}
System.out.println(temp);
7.输出1-100可以被三整除的数,每行输出6个
8.求100以内可以被三整除但不能被5整除的数,每行输出6个
两个题的思路是一样的,同时满足两个条件就是用到逻辑运算符--&&--
//1-100以内可以被三整除的数
int count = 0;
for(int i = 0;i < 100;i ++){
if(i%3 == 0){
System.out.print(i);
if(++count%6 ==0){
sSystem.out.println();
}
}
}
//1--100以内可以被三整除同时不能被5整除的数就是if条件判断的时候 ‘并且’ 第二个条件
//if(i%3 == 0 && i%5 != 0)
9.打印出所有的水仙花数
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。
//由于提前知道水仙花数是三位数 所以这里进行判断是可以减少循环次数
for(int i = 100;i < 1000;i++){
int a = i / 100; //获取百位数
int b = (i /10)%10; //获取十位数
int c = i % 10; //获取个位数
if(a*a*a + b*b*b +c*c*c == i){
System.out.print(i+"\t");
}
}
10.判断一个数是否为质数
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
/*
* Scanner sc = new Scanner(System.in);
System.out.println("请输入一个自然数:");
int temp = sc.nextInt();
for(int i = 2;i < temp;i++){
if(temp%i == 0){
System.out.println("这个数不是质数");
break;
}else{
System.out.println("这个数是质数");
break;
}
}
*/
/*
* 注意这个逻辑是错误的 对于刚学习代码的小白这里是大坑(本人刚开始学习代码 各路大神勿喷)
这里的if else结构判断没有错误 正常理解就是如果if成立就输出不是质数,如果不成立就直接
输出是质数 但是重点是这是在一个for循环里边,举例如果我们输入要判断的数是21,那么在i=2
的时候就是temp%i!=0,也就是if不成立 直接就会跳转到else 输出是质数 然后就break结束
但本身21不是质数 所以会出现逻辑错误
那么我们在考虑没有else的情况,if里边的判断语句会随着i++的操作一直进行判断,满足条件的时候
就会输出 这个数不是质数 就上边这个错误的代码来说 控制台没有任何输出(if里边的判断逻辑是正确的)
也就是这个数是质数
所以个人认为在 “有些情况下” for循环里嵌套if else结构会出现一些逻辑错误
那么直接没有else判断语句此代码就没有逻辑错误 下边展示的是正确代码
*/
Scanner sc = new Scanner(System.in);
int temp = sc.nextInt();
int count = 0;
for(int i = 2;i < temp;i ++) {
if(temp%i == 0) {
System.out.println("这个数不是质数");
count++;
break;
}
}
if(count == 0) {
System.out.println("这个数是质数");
}
sc.close();
//这里的临时变量count就是为了判断并且在控制台输出 “这个数是质数” 没有其他用处
?11.编程输出101-205之间的所有质数
public static void main(String[] args) {
for (int i = 101; i < 205; i++) {
boolean temp = function(i); //调用方法进行判断在此范围内的质数
if (temp) {
System.out.println(i);
}
}
}
//分装一个方法,用于实现指定数据是否为质数的判断
public static boolean function(int i) {
boolean num = true; //默认为为true,默认值为质数
for (int k = 2; k < i; k++) {
if (i % k == 0) {
num = false;
break;
}
}
return num;
}
12.输入两个正整数n和m,求其最大公约数和最小公倍数
最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个
两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。
//求最大公约数
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
int min = Math.min(m,n);
for(int i = min;i > 0;i --){
if(m%i == 0 && n%i == 0){
System.out.println(i);
}
}
//求最大公约数
public static void main(String[] args){
int m,n;
Scanner sc = new Scanner(System.in);
System.out.println("请输入整数:")
while(true){
m = sc.nextInt();
if(m < 2){
System.out.println("输入有误!请重新输入:");
}else
break;
}
System.out.println("请输入整数:")
while(true){
n = sc.nextInt();
if(n < 2){
System.out.println("输入有误!请重新输入:");
}else
break;
}
int f = few(m,n)
if(f > 1){
System.out.println("两个整数"+m+","+n+"最大公约数为:"+f);
}
}
public static int few(int num1,int num2){
int res = 1;
for(int i = min;i > 0;i --){
if(m%i == 0 && n%i == 0){
res = i;
break;
}
}
return res;
}
//求最小公倍数
//其实和求最大公约数的方法一样,最大公约数就是从两个整数中较小的一个整数开始判断,整数的因数最大不会超过其本身,所以判断的最大范围就是较小的那个整数的本身,依次判断即可。从最大范围开始一次--(减减)操作,如果在此范围内的一个数可以被输入的两个数同时整除,那么这个数就是两个整数的最大公约数。相同的想法,按照最小公倍数的定义,特殊情况下最小公倍数刚好就是两个数中最大那个数的本身,但是无上限,所以判断条件的范围最小就是两个数中最大的,最大无上限。这里只展示判断时执行的代码语句
public static int multiple(int num1,int num2){
int max = Math.max(num1,num2);
int res = 1;
for(int i =max;i > 0;i ++){
if(i%num1 == 0 && i%num2 == 0){
res = i;
break;
}
}
return res;
}
(最小公倍数) 其实和求最大公约数的方法一样,最大公约数就是从两个整数中较小的一个整数开始判断,整数的因数最大不会超过其本身,所以判断的最大范围就是较小的那个整数的本身,依次判断即可。从最大范围开始一次--(减减)操作,如果在此范围内的一个数可以被输入的两个数同时整除,那么这个数就是两个整数的最大公约数。相同的想法,按照最小公倍数的定义,特殊情况下最小公倍数刚好就是两个数中最大那个数的本身,但是无上限,所以判断条件的范围最小就是两个数中最大的,最大无上限。这里只展示判断时执行的代码语句
13.100-50000之间有多少整数,其每个位上的数字之和为5,分别是哪些整数(例如:1211 1+2+1+1=5),并统计满足条件的整数有多少个
//范围是100-50000 所以分开判断
int count = 0;
int temp = 0;
for(int i = 100;i < 1000;i++){
int a = i / 100; //获取百位数字
int b = (i/10)%10; //获取十位数字
int c = i%10; //获取个位数字
if(a+b+c == 5){
System.out.print(i+" ");
count ++; //统计一共有多少个满足条件的个数
if(++temp % 10 == 0) { //每十个输出一行
System.out.println();
}
}
}
for(int i = 1001; i < 10000;i ++){
int a = i / 1000; //获取千位数字
int b = (i / 100) % 10; //获取百位数字
int c = (i / 10) % 10; //获取十位数字
int d = i % 10; //获取个位数字
if(a+b+c+d == 5){
System.out.print(i+" ");
count ++;
if(++temp % 10 == 0) {
System.out.println();
}
}
}
for(int i = 10001;i < 50000;i ++){
int a = i / 10000;
int b = (i / 1000) % 10;
int c = (i / 100) % 10;
int d = (i / 10) % 10;
int e = i % 10;
if(a+b+c+d+e == 5){
System.out.print(i+" ");
count ++;
if(++temp % 10 == 0) {
System.out.println();
}
}
}
System.out.println();
System.out.println("满足条件的整数一共有"+count+"个");
14.鸡兔同笼
共80个头,208只脚,鸡和兔各有几只
for(int i = 0;i < 80;i ++){
for(int k =0;k < 80;k ++){
if(i+k == 80 && i*2+k*4 == 208){
System.out.println("鸡有:"+i);
System.out.println("兔有:"+k);
}
}
}
}
15.百鸡百钱
鸡翁一值五钱,鸡母一值钱三,鸡雏三值一钱。百钱买百鸡,问鸡翁、鸡母、鸡雏各有几只?
for (int i = 1; i < 20; i++) {
for (int k = 1; k < 300; k++) {
int j = 100 - i - k;
if (j < 0)
continue;
if (i * 5 + k / 3 + j * 3 == 100) {
System.out.print(i + " ");
System.out.print(k + " ");
System.out.print(j);
System.out.println();
}
}
}
|