7-16 求符合给定条件的整数集
分数 15
作者 徐镜春
单位 浙江大学
给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。

输入格式:
输入在一行中给出A。

输出格式:
输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。

输入样例:
2
输出样例:
234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543



import java.sql.SQLOutput;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
int A = 0;
int x,y,z;
int count = 0;
Scanner sc = new Scanner(System.in);

A = sc.nextInt();
sc.close();
if(A>0&&A<7){
for(x = A;x<A+4;x++){
for(y = A;y<A+4;y++){
for(z = A;z<A+4;z++){
if(x!=y&&y!=z&&z!=x){
System.out.printf("%d%d%d",x,y,z);
count++;
if(count!=0&&count%6==0){
System.out.println();
}else{
System.out.print(" ");
}
}
}
}
}
}

}
}

7-17 爬动的蠕虫
分数 15
作者 C课程组
单位 浙江大学
一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?

这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。

输入格式:
输入在一行中顺序给出3个正整数N、U、D,其中D<U,N不超过100

输出格式:
在一行中输出蠕虫爬出井的时间,以分钟为单位。

输入样例:
12 3 1
输出样例:
11



import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

int N = sc.nextInt();
int U = sc.nextInt();
int D = sc.nextInt();

sc.close();

int time = 0;
int height = 0;

while(height<N){
height+=U;
time++;
if(height>=N){
break;
}
height -= D;
time++;


}
System.out.println(time);
}
}

7-18 二分法求多项式单根
分数 20
作者 杨起帆
单位 浙大城市学院
二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0

二分法的步骤为:

检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2,b],令a=(a+b)/2,重复循环;
如果f((a+b)/2)与f(b)同号,则说明根在区间[a,(a+b)/2],令b=(a+b)/2,重复循环。
本题目要求编写程序,计算给定3阶多项式f(x)=a
3

x
3
+a
2

x
2
+a
1

x+a
0

在给定区间[a,b]内的根。

输入格式:
输入在第1行中顺序给出多项式的4个系数a
3

、a
2

、a
1

、a
0

,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。

输出格式:
在一行中输出该多项式在该区间内的根,精确到小数点后2位。

输入样例:
3 -1 -3 1
-0.5 0.5
输出样例:
0.33

import java.util.Scanner;

public class Main {

// 定义多项式函数 f(x) = a3*x^3 + a2*x^2 + a1*x + a0
public static double polynomial(double x, double a3, double a2, double a1, double a0) {
return a3 * x * x * x + a2 * x * x + a1 * x + a0;
}

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

// 读取多项式系数
double a3 = scanner.nextDouble();
double a2 = scanner.nextDouble();
double a1 = scanner.nextDouble();
double a0 = scanner.nextDouble();

// 读取区间端点
double a = scanner.nextDouble();
double b = scanner.nextDouble();

// 计算多项式在端点的值
double fa = polynomial(a, a3, a2, a1, a0);
double fb = polynomial(b, a3, a2, a1, a0);

// 检查区间端点是否是根
if (Math.abs(fa) < 1e-7) {
System.out.printf("%.2f\n", a);
return;
}
if (Math.abs(fb) < 1e-7) {
System.out.printf("%.2f\n", b);
return;
}

// 检查端点值的符号是否异号
if (fa * fb >= 0) {
System.out.println("The function does not have a root in the given interval.");
return;
}

// 设置精度阈值
double epsilon = 1e-6; // 精度阈值,确保结果精确到小数点后两位

// 二分法过程
double mid = a;
while ((b - a) / 2 > epsilon) {
mid = (a + b) / 2;
double fmid = polynomial(mid, a3, a2, a1, a0);

if (Math.abs(fmid) < 1e-7) { // 如果中点的值非常接近0
break;
} else if (fa * fmid < 0) {
b = mid;
fb = fmid;
} else {
a = mid;
fa = fmid;
}
}

// 输出结果,精确到小数点后两位
System.out.printf("%.2f\n", mid);
}
}

7-19 支票面额
分数 15
作者 杨起帆
单位 浙大城市学院
一个采购员去银行兑换一张y元f分的支票,结果出纳员错给了f元y分。采购员用去了n分之后才发觉有错,于是清点了余额尚有2y元2f分,问该支票面额是多少?

输入格式:
输入在一行中给出小于100的正整数n。

输出格式:
在一行中按格式y.f输出该支票的原始面额。如果无解,则输出No Solution。

输入样例1
23
输出样例1
25.51
输入样例2
22
输出样例2
No Solution

#include<iostream>
using namespace std;
int main(){
int n,flag=1;
cin>>n;
for(int i=0;i<50;i++){
for(int j=0;j<100;j++){
if(i+j*100-n==j*2+i*2*100){
cout<<i<<'.'<<j,flag=0;
}
}
}if(flag)cout<<"No Solution";
return 0;
}
7-20 打印九九口诀表
分数 15
作者 徐镜春
单位 浙江大学
下面是一个完整的下三角九九口诀表:

1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
本题要求对任意给定的一位正整数N,输出从1*1到N*N的部分口诀表。

输入格式:
输入在一行中给出一个正整数N(1≤N≤9)。

输出格式:
输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。

输入样例:
4
输出样例:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

// 读取输入的正整数 N
int N = scanner.nextInt();
scanner.close();

// 遍历每一行
for (int i = 1; i <= N; i++) {
// 遍历每一列
for (int j = 1; j <= i; j++) {
// 计算乘法表的结果
int result = i * j;
// 打印乘法表的格式,结果占4个字符宽度并左对齐
System.out.printf("%d*%d=%-4d", j, i, result);
}
// 打印每一行之后换行
System.out.println();
}
}
}