目录
P1217 [USACO1.5] 回文质数 Prime Palindromes
P4956 [COCI2017-2018#6] Davor
P5718 【深基4.例2】找最小值
import java.math.MathContext;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a,b = 1000;
int n = sc.nextInt();
for(int i = 0;i<n;i++) {
a = sc.nextInt();
b= b<a?b:a;
}
System.out.println(b);
}
}
因为题中给出了,最大的值是1000,故最小值肯定不大于1000,所以将b设为1000
P5719 【深基4.例3】分类平均
import java.math.MathContext;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
double a = 0 ,b = 0;
int n1 = 0, n2 = 0;
for(int i = 1;i<=n;i++) {
if(i%k == 0) {
a += i;
n1++;
}
else {
b += i;
n2++;
}
}
System.out.printf("%.1f %.1f",a/n1,b/n2);
}
}
P5720 【深基4.例4】一尺之棰
import java.math.MathContext;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double a = sc.nextInt();
int n = 1;
while(true) {
if(Math.floor(a/2) == 1) {
n++;
break;
}
else if(a==1) {
break;
}
else {
n++;
a = Math.floor(a/2);
}
}
System.out.println(n);
}
}
P5721 【深基4.例6】数字直角三角形
import java.math.MathContext;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int b = 1;
for(int i = n;i>=1;i--) {
for(int a = 1;a<=i;a++) {
System.out.printf("%02d",b);
b++;
}
System.out.println();
}
}
}
外层循环控制行数,内层控制数字递增
P1009 [NOIP1998 普及组] 阶乘之和
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
BigInteger a = new BigInteger("0");
BigInteger c = BigInteger.valueOf(1);
for(int i =1;i<=n;i++) {
for(int b = i;b<=i;b++) {
c = c.multiply(BigInteger.valueOf(b));
}
a = a.add(c);
}
if(n==0)
System.out.println(0);
else
System.out.println(a);
}
}
外层循环需要相加的阶乘数量,内层计算阶乘
高精度到【算法1-1】补充喵~
P1980 [NOIP2013 普及组] 计数问题
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int d = 0;
char b = sc.next().charAt(0);
int a = 0;
for(int i = 1;i<=n;i++) {
String e = String.valueOf(i);
String c = e.replaceAll(b+"","");
int a1 = e.length() - c.length();
d += a1;
}
System.out.println(d);
}
}
循环内部将从1开始的每个数依次都转换为字符串,再替换掉所需要查找的字符,最后两者的长度差就是所查字符占据的位数。
P1035 [NOIP2002 普及组] 级数求和
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
double sum = 0;
for(int i = 1;;i++){
sum += 1.0/i;
if(k<sum) {
k = i;
break;
}
}
System.out.println(k);
}
}
P2669 [NOIP2015 普及组] 金币
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = 1;
int sum = 0;
int i = 0;
int k = sc.nextInt();
for(;;){
for(int l = 1;l<=m;l++){
sum += m;
i++;
if(l == m){
m++;
break;
}
if(i == k)
break;
}
if(i == k)
break;
}
System.out.println(sum);
}
}
i:总天数
l:发放这次工资的天数
m:发放这次工资每天得到的金币数
思路:外部循环:更新m,l;内部循环:计算总共得到的钱数,以及总天数(i)
内外循环结束条件均为:达到题目指定循环总天数
P5722 【深基4.例11】数列求和
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int sum = 0;
int a = sc.nextInt();
for(int i = 0;i<=a;i++){
sum+=i;
}
System.out.println(sum);
}
}
P5723 【深基4.例13】质数口袋
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
int sum = 0;
int n = 0;
for(int m = 2;;m++){
if(b(m)){
sum+=m;
if(sum>k)
break;
n++;
System.out.println(m);
}
}
System.out.println(n);
}
static boolean b(int q){
for(int a = 2;a<=Math.sqrt(q);a++){
if(q%a == 0)
return false;
}
return true;
}
}
b方法用来判断这个数是否为质数,在主循环中,如果这个数为质数,放入口袋,如果不超过口袋的荷载量,就打印,超过就跳出循环。
P1217 [USACO1.5] 回文质数 Prime Palindromes
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int pa = 0;
String sb = String.valueOf(b);
int bl = sb.length();
for(int i = 1;i<=bl;i++) {
switch (i) {
case 1:
//质数一定不是二的倍数,简化掉以2的倍数结尾的数
for (int a1 = 1; a1 <= 9; a1 += 2) {
pa = a1;
if (pa >= a && pa <= b && zhishu(pa))
System.out.println(pa);
}
break;
case 2:
for (int a1 = 1; a1 <= 9; a1 += 2) {
pa = a1 * 10 + a1;
if (pa >= a && pa <= b && zhishu(pa))
System.out.println(pa);
}
break;
case 3:
for (int a1 = 1; a1 <= 9; a1 += 2) {
for (int b1 = 0; b1 <= 9; b1++) {
pa = a1 * 100 + b1 * 10 + a1;
if (pa >= a && pa <= b && zhishu(pa))
System.out.println(pa);
}
}
break;
// case 4:
// for (int a1 = 1; a1 <= 9; a1 += 2) {
// for (int b1 = 0; b1 <= 9; b1++) {
// pa = a1 * 1000 + b1 * 100 + b1 * 10 + a1;
// if (pa >= a && pa <= b && zhishu(pa))
// System.out.println(pa);
// }
// }
// break;
//偶数次回文数没有质数,除11外
case 5:
for (int a1 = 1; a1 <= 9; a1 += 2) {
for (int b1 = 0; b1 <= 9; b1++) {
for (int c1 = 0; c1 <= 9; c1++) {
pa = a1 * 10000 + b1 * 1000 + c1 * 100 + b1 * 10 + a1;
if (pa >= a && pa <= b && zhishu(pa))
System.out.println(pa);
}
}
}
break;
case 6:
for (int a1 = 1; a1 <= 9; a1 += 2) {
for (int b1 = 0; b1 <= 9; b1++) {
for (int c1 = 0; c1 <= 9; c1++) {
pa = a1 * 100000 + b1 * 10000 + c1 * 1000 + c1*100+ b1 * 10 + a1;
if (pa >= a && pa <= b && zhishu(pa))
System.out.println(pa);
}
}
}
break;
case 7:
for (int a1 = 1; a1 <= 9; a1 += 2) {
for (int b1 = 0; b1 <= 9; b1++) {
for (int c1 = 0; c1 <= 9; c1++) {
for(int d1 = 0;d1<=9;d1++) {
pa = a1 * 1000000 + b1 * 100000 + c1 * 10000+ d1*1000+ c1 * 100 + b1 * 10 + a1;
if (pa >= a && pa <= b && zhishu(pa))
System.out.println(pa);
}
}
}
}
break;
case 8:
for (int a1 = 1; a1 <= 9; a1 += 2) {
for (int b1 = 0; b1 <= 9; b1++) {
for (int c1 = 0; c1 <= 9; c1++) {
for(int d1 = 0;d1<=9;d1++) {
pa = a1 * 10000000 + b1 * 1000000 + c1 * 100000+ d1*10000 +d1*1000+ c1 * 100 + b1 * 10 + a1;
if (pa >= a && pa <= b && zhishu(pa))
System.out.println(pa);
}
}
}
}
break;
// case 9:
// for (int a1 = 1; a1 <= 9; a1 += 2) {
// for (int b1 = 0; b1 <= 9; b1++) {
// for (int c1 = 0; c1 <= 9; c1++) {
// for(int d1 = 0;d1<=9;d1++) {
// for(int e1 = 0;e1<=9;e1++) {
// pa = a1 * 100000000 + b1 * 10000000 + c1 * 1000000 + d1 * 100000+e1*10000 + d1 * 1000 + c1 * 100 + b1 * 10 + a1;
// if (pa >= a && pa <= b && zhishu(pa))
// System.out.println(pa);
// }
// }
// }
// }
// }
// break;
//一亿并不是回文数,也不是质数
}
}
}
static boolean zhishu(int a){
if(a<5)
return false;
for(int b = 2;b <= Math.sqrt(a);b++){
if( a % b == 0)
return false;
}
return true;
}
}
在判断质数时注意,题目范围时5-100000000,所以5之前的质数不考虑
思路:以五位回文质数为例,其形式为: abcba,所以可以利用三次循环分别给abc赋值来得到这个数。
P1423 小玉在游泳
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double a = sc.nextDouble();
double b = 2;
double c = 2;
int n = 1;
for(;;){
if(c<a) {
b *= 0.98;
c += b;
n++;
}
else{
System.out.println(n);
break;
}
}
}
}
P1307 [NOIP2011 普及组] 数字反转
import java.util.Scanner;
//此题坑点 : 需考虑0的情况
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
char[] arr = new char[str.length()];
boolean is = false;
boolean a = false;
if(str.length() == 1)
System.out.println(str.charAt(0));
else if(str.charAt(0) == '-')
arr = new char[str.length() - 1 ];
for(int i = 0 ; i<arr.length;i++){
if (str.charAt(0) == '-'){
is = true;
arr[i] = str.charAt(i+1);
}
else{
arr[i] = str.charAt(i);
}
}
if(is)
System.out.printf("-");
for(int i = 0;i<arr.length;i++) {
if(arr[arr.length - i -1] != '0' || a){
System.out.printf("%c",arr[arr.length - i - 1]);
a = true;
}
}
}
}
思路:正着输入,倒着输出。
先看输入的字符串有没有符号,来决定数组的长度,输出的时候从最后一位往前输出,并且需要判断首位是否是零,但是除首位外,其他的零都需要保留
这题直接用字符串做会更简单,可以看之后【入门5-字符串】中的数字反转
P1720 月落乌啼算钱(斐波那契数列)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
double a = Math.sqrt(5);
double b = (Math.pow((1+a),n)-Math.pow((1 - a),n))/(Math.pow(2,n)*a);
System.out.printf("%.2f",b);
}
}
这题好像能化简,但是直接输这个公式也行
所以说,这题跟斐波那契数列有啥关系喵?真没看出来qwq
P5724 【深基4.习5】求极差 / 最大跨度值
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int min = 1000,max = 0;
for(int i = 0;i<n;i++) {
int a = sc.nextInt();
if(a>max)
max = a;
if(a<min)
min = a;
}
int c = max - min;
System.out.println(c);
}
}
P1420 最长连号
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int b = sc.nextInt();
int max = 1;
int m = 1;
for(int i = 0; i<n-1;i++){
int a = sc.nextInt();
if(b+1 == a){
m++;
}
else{
m = 1;
}
if(m>max)
max = m;
b = a;
}
System.out.println(max);
}
}
思路:直接先读入一个数,再读入下一个数,看看后一个数是否等于前一个数加一,若等,连号数加一,若不等,初始化连号数,每次操作完连号数都需要将a,b重新赋值,以便下一次循环使用
P1075 [NOIP2012 普及组] 质因数分解
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = 2;
for(int i = 1;2*i+1<Math.sqrt(a);i++){
if(a%b==0){
break;
}
b = 2*i+1;
}
System.out.println(Math.max(b, a / b));
}
}
P5725 【深基4.习8】求三角形
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int n1 = 0;
int c = 1;
for(int i = 1; i<= n*n;i++){
System.out.printf("%02d",i);
if(i%n == 0)
System.out.println();
}
System.out.println();
for(int i = 1;i<=n;i++){
for(int a = 1;a<=(n-i)*2;a++)
System.out.printf(" ");
for(int b = 1;b<=i;b++){
System.out.printf("%02d",c);
n1++;c++;
if(n1 == i) {
System.out.println();
n1 = 0;
}
}
}
}
}
正方形直接打印即可,三角形的需要打印空格占位
P5726 【深基4.习9】打分
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int max = 0,min = 10;
int sum = 0;
for(int i = 0;i<n;i++){
int a = sc.nextInt();
sum+=a;
if(a<min)
min = a;
if(a>max)
max = a;
}
sum = sum - min - max;
double n1 = n-2;
double avg = sum/n1;
System.out.printf("%.2f",avg);
}
}
P4956 [COCI2017-2018#6] Davor
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int sum = sc.nextInt();
int x = 1;
int xm = 0;
int k = 0;
int km = 0;
for(;x<=100;x++){
km = sum - 7*52*x;
if(km%(52*21) == 0 && km>0) {
xm = x;
k = km / (52 * 21);
}
}
System.out.println(xm);
System.out.println(k);
}
}
思路:在筹集到的总钱数里,一部分是7*52*x另一部分是52*(1+2+3+4+5+6)*k,且注意x,k均为正整数。
P1089 [NOIP2004 提高组] 津津的储蓄计划
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int b = 0;
int sum = 0;//结余
int save = 0;
int m = 0;
boolean d = true;//钱是否够用
for(int i = 1;i<=12;i++){
int a = sc.nextInt();
b = 300 + sum - a;
if(b/100>=0){
save += b/100;//存入整百的个数
sum = b - b/100*100;//目前结余减去整百的金额
}
if(b<0) {
m = i;
System.out.println("-" + m);
d = false;
break;
}
}
if(d){
int e = (int) (sum+save*100*1.2);
System.out.printf("%d",e);
}
}
}
很简单的一个小模拟,不好懂的地方已经标注在代码里了
有问题欢迎大家来评论区留言
我们下次见喵~