7-1 厘米换算英尺英寸 (15 分)
如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。
输入格式:
输入在一行中给出1个正整数,单位是厘米。
输出格式:
在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。
输入样例:
170
输出样例:
5 6
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
float cm=sc.nextInt();
/*错误思路:
* 刚开始,陷入公式,一直跳不出来:以下是错误推导
*0.01cm=(foot+inch/12)×0.3048;foot=inch/12
*-->cm=(foot+inch/12)×30.48
*-->inch=(cm-30.48*foot)/30.48*12;
*/
/*
* 正确思路:
* cm/30.48:就是带小数的英尺,直接取整便是英尺数
* 将小数部分*12:就是英寸数
*/
int foot, inch;//英尺;英寸
foot=(int) (cm/30.48);
inch=(int) (12*(cm/30.48-foot));
System.out.println(foot+" "+inch);
}
}
7-2 然后是几点 (15 分)
有时候人们用四位数字表示一个时间,比如1106表示11点零6分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,即5点30分表示为530。注意,第二个数字表示的分钟数可能超过60,也可能是负数。
输入格式:
输入在一行中给出2个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即5点30分表示为530;流逝的分钟数可能超过60,也可能是负数。
输出格式:
输出四位数字表示的终止时间。题目保证起始时间和终止时间在同一天内。
输入样例:
1120 110
输出样例:
1310
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int start=sc.nextInt();
int come=sc.nextInt();
int end;
//(start%100)+come可能为负数,正数等
int m=(start/100)*60+(start%100)+come;
end=(m/60)*100+m%60;
System.out.println(end);
}
}
7-7 12-24小时制 (15 分)
编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。
输入格式:
输入在一行中给出带有中间的:符号(半角的冒号)的24小时制的时间,如12:34表示12点34分。当小时或分钟数小于10时,均没有前导的零,如5:6表示5点零6分。
提示:在scanf的格式字符串中加入:,让scanf来处理这个冒号。
输出格式:
在一行中输出这个时间对应的12小时制的时间,数字部分格式与输入的相同,然后跟上空格,再跟上表示上午的字符串AM或表示下午的字符串PM。如5:6 PM表示下午5点零6分。注意,在英文的习惯中,中午12点被认为是下午,所以24小时制的12:00就是12小时制的12:0 PM;而0点被认为是第二天的时间,所以是0:0 AM。
输入样例:
21:11
输出样例:
9:11 PM
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String time=sc.next();
int flag=0;
for(int i=0;i<time.length();i++){
//找到':'的位置
if(time.charAt(i)==':'){
flag=i;
break;
}
}
String hour= time.substring(0, flag);
String other=time.substring(flag, time.length());
int h = Integer.parseInt(hour);
if(h<12){
System.out.println(h+other+" AM");
}else if(h==12){
System.out.println(h+other+" PM");
}else{
h=h-12;
System.out.println(h+other+" PM");
}
}
}
7-10 计算工资 (15 分)
某公司员工的工资计算方法如下:一周内工作时间不超过40小时,按正常工作时间计酬;超出40小时的工作时间部分,按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工,进公司不少于5年的员工为老职工,5年以下的为新职工。新职工的正常工资为30元/小时,老职工的正常工资为50元/小时。请按该计酬方式计算员工的工资。
输入格式:
输入在一行中给出2个正整数,分别为某员工入职年数和周工作时间,其间以空格分隔。
输出格式:
在一行输出该员工的周薪,精确到小数点后2位。
输入样例1:
5 40
输出样例1:
2000.00
输入样例2:
3 50
输出样例2:
1650.00
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int year=sc.nextInt();
int week=sc.nextInt();
double time;
double salary;
if(week>40){
time=1.50*(week-40)+40;
}else{
time=week;
}
if(year<5){
salary=30*time;
}else{
salary=50*time;
}
System.out.println(new java.text.DecimalFormat("0.00").format(salary));
}
}
7-13 日K蜡烛图 (15 分)
股票价格涨跌趋势,常用蜡烛图技术中的K线图来表示,分为按日的日K线、按周的周K线、按月的月K线等。以日K线为例,每天股票价格从开盘到收盘走完一天,对应一根蜡烛小图,要表示四个价格:开盘价格Open(早上刚刚开始开盘买卖成交的第1笔价格)、收盘价格Close(下午收盘时最后一笔成交的价格)、中间的最高价High和最低价Low。
如果Close
输入格式:
输入在一行中给出4个正实数,分别对应Open、High、Low、Close,其间以空格分隔。
输出格式:
在一行中输出日K蜡烛的类型。如果有上、下影线,则在类型后加上with 影线类型。如果两种影线都有,则输出with Lower Shadow and Upper Shadow。
输入样例1:
5.110 5.250 5.100 5.105
输出样例1:
BW-Solid with Lower Shadow and Upper Shadow
输入样例2:
5.110 5.110 5.110 5.110
输出样例2:
R-Cross
输入样例3:
5.110 5.125 5.112 5.126
输出样例3:
R-Hollow
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
float Open=sc.nextFloat();
float High=sc.nextFloat();
float Low=sc.nextFloat();
float Close=sc.nextFloat();
int flag=0;
StringBuilder sb=new StringBuilder();
if (Close<Open){
sb.append("BW-Solid");
} else if(Close>Open){
sb.append("R-Hollow");
} else{
sb.append("R-Cross");
}
if(Low<Open && Low<Close){
flag=1;
sb.append(" with Lower Shadow");
}
if(High>Open &&High>Close){
if(flag==1){
sb.append(" and Upper Shadow");
}else{
sb.append(" with Upper Shadow");
}
}
System.out.println(sb);
}
}
7-14 求整数段和 (15 分)
给定两个整数A和B,输出从A到B的所有整数以及这些数的和。
输入格式:
输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。
输出格式:
首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X。
输入样例:
-3 8
输出样例:
-3 -2 -1 0 1
2 3 4 5 6
7 8
Sum = 30
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 sum=0;
int j=0;
for(int i=A;i<=B;i++){
StringBuilder sb=new StringBuilder();
sum+=i;
j++;
String s=i+"";
for(int t=5-s.length();t>0;t--){
sb.append(" ");
}
System.out.print(sb);
System.out.print(i);
if(j%5==0){
System.out.println();
}
}
if((B+1-A)%5!=0||B-A==0){
System.out.println();
}
System.out.println("Sum = "+sum);
}
}
7-15 计算圆周率 (15 分)
根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。
输入格式:
输入在一行中给出小于1的阈值。
输出格式:
在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。
输入样例:
0.01
输出样例:
3.132157
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
double num=sc.nextDouble();
double P,res=0;
int i=0;
while(true) {
res+=jiec(i)/xiamian(i);
if((jiec(i)/xiamian(i))<num){
P=2*res;
break;
}
i++;
}
System.out.println(new java.text.DecimalFormat("#.000000").format(P));
}
public static double jiec(double n) {
double res=1;
if(n==0)
return res;
for(int i=1;i<=n;i++) {
res*=i;
}
return res;
}
public static double xiamian(double n) {
double res=1;
if(n==0)
return res;
for(int i=1;i<=n;i++) {
res*=(2*i+1);
}
return res;
}
}
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.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int A=sc.nextInt();
int num;
int t=0;
for(int i=A;i<=A+3;i++) {
for(int j=A;j<A+4;j++) {
for(int k=A;k<A+4;k++) {
if(i==j||i==k||j==k)
continue;
num=i*100+j*10+k;
t++;
if(t==1) {
System.out.print(num);
}else if(t%6==0) {
System.out.print(" "+num);
System.out.println();
t=0;
}else {
System.out.print(" "+num);
}
}
}
}
}
}
7-17 爬动的蠕虫 (15 分)
一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?
这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。
输入格式:
输入在一行中顺序给出3个正整数N、U、D,其中D
输出格式:
在一行中输出蠕虫爬出井的时间,以分钟为单位。
输入样例:
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();
int time=1;
int l=U;
if(U>=N) {
System.out.println(time);
}else {
while(true) {
time+=2;
l+=-D+U;
if(l>=N) {
System.out.println(time);
break;
}
}
}
}
}
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
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int y;
int f;
int flag=0;
for(y=0;y<100;y++) {
for(f=0;f<100;f++) {
if(98*f==199*y+n) {
//f+y*0.01-n*0.01==2*y+2*f*0.01
//-->100f+y-n==200y+2f-->98f==199y+n
flag=1;
System.out.println(y+"."+f);//输出
return;
}
}
}
if(flag==0) {
System.out.println("No Solution");
}
}
}
7-20 打印九九口诀表 (15 分)
下面是一个完整的下三角九九口诀表:
本题要求对任意给定的一位正整数N,输出从11到NN的部分口诀表。
输入格式:
输入在一行中给出一个正整数N(1≤N≤9)。
输出格式:
输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。
输入样例:
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
for(int i=1;i<=N;i++){
for(int j=1;j<=i;j++){
StringBuilder sb=new StringBuilder();
System.out.print(j+"*"+i+"="+i*j);
for(int t=4-(int) (Math.log10(i*j)+1);t>0;t--){
sb.append(" ");
}
System.out.print(sb);
}
System.out.println();
}
}
}
7-21 求特殊方程的正整数解 (15 分)
本题要求对任意给定的正整数N,求方程
的全部正整数解。
输入格式:
输入在一行中给出正整数N(≤10000)。
输出格式:
输出方程的全部正整数解,其中X≤Y。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution。
输入样例1:
884
输出样例1:
10 28
20 22
输入样例2:
11
输出样例2:
No Solution
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
int flag=0;
for(int x=0;x*x<=5000;x++){
for(int y=x+1;y*y<10000;y++){
if(x*x+y*y==N){
flag=1;
System.out.println(x+" "+y);
}
}
}
if(flag==0){
System.out.println("No Solution");
}
}
}
7-24 约分最简分式 (15 分)
分数可以表示为分子/分母的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。
输入格式:
输入在一行中给出一个分数,分子和分母中间以斜杠/分隔,如:12/34表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。
提示:在scanf的格式字符串中加入/,让scanf来处理这个斜杠。
输出格式:
在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用分子/分母的形式表示分数。如 5/6表示6分之5。
输入样例:
66/120
输出样例:
11/20
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.next();
int flag=0;
for(int i=0;i<str.length();i++){
if(str.charAt(i)=='/'){
flag=i;//找到'/'的位置
// System.out.println("i:"+i);
break;
}
}
String str1=str.substring(0,flag);
String str2=str.substring(flag+1,str.length());
int num1=Integer.parseInt(str1);
int num2=Integer.parseInt(str2);
int num=f(num1,num2);
System.out.println(num1/num+"/"+num2/num);
}
//找最大公约数
public static int f(int a,int b){
if(a%b==0){
return b;
}
return f(b,a%b);
}
}
7-25 念数字 (15 分)
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:
0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
输入格式:
输入在一行中给出一个整数,如:1234。
提示:整数包括负数、零和正数。
输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si。
输入样例:
-600
输出样例:
fu liu ling ling
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.next();
String[] string={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
char[] num=str.toCharArray();
if(num[0]=='-'){
System.out.print("fu");
}else{
System.out.print(string[num[0]-'0']);
}
for(int i=1;i<num.length;i++){
System.out.print(" "+string[num[i]-'0']);
}
}
}
7-26 单词长度 (15 分)
你的程序要读入一行文本,其中以空格分隔为若干个单词,以.结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it’s算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.不计算在内。
输入格式:
输入在一行中给出一行文本,以.结束
提示:用scanf("%c",…);来读入一个字符,直到读到.为止。
输出格式:
在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。
输入样例:
It’s great to see you here.
输出样例:
4 5 2 3 3 4
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
StringBuilder sb=new StringBuilder();
int i=0;
while(true){
String str=sc.next();
int len=str.length();
if(str.charAt(len-1)=='.'){
if(len>1){
sb.append(len-1);
}else{
sb.deleteCharAt(sb.length()-1);
}
break;
}
sb.append(len+" ");
i=1;
}
System.out.println(sb);
}
}
7-33 有理数加法 (15 分)
本题要求编写程序,计算两个有理数的和。
输入格式:
输入在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。
输出格式:
在一行中按照a/b的格式输出两个有理数的和。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
输入样例1:
1/3 1/6
输出样例1:
1/2
输入样例2:
4/3 2/3
输出样例2:
2
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String[] str=new String[2];
int[] num1=new int[2];//分子
int[] num2=new int[2];//分母
int flag=0;
for(int j=0;j<2;j++){
str[j]=sc.next();
for(int i=0;i<str[j].length();i++){
if(str[j].charAt(i)=='/'){
flag=i;//找到'/'的位置
num1[j]=Integer.parseInt(str[j].substring(0,flag));
num2[j]=Integer.parseInt(str[j].substring(flag+1,str[j].length()));
break;
}
}
}
//相加
int res_num1=num1[0]*num2[1]+num1[1]*num2[0];
int res_num2=num2[0]*num2[1];
//找最大公约数
int num=f(res_num1,res_num2);
if(res_num2/num==1){
System.out.println(res_num1/num);
}else{
System.out.println(res_num1/num+"/"+res_num2/num);
}
}
//找最大公约数
public static int f(int a,int b){
if(a%b==0){
return b;
}
return f(b,a%b);
}
}
7-36 复数四则运算 (15 分)
本题要求编写程序,计算2个复数的和、差、积、商。
输入格式:
输入在一行中按照a1 b1 a2 b2的格式给出2个复数C1=a1+b1i和C2=a2+b2i的实部和虚部。题目保证C2不为0。
输出格式:
分别在4行中按照(a1+b1i) 运算符 (a2+b2i) = 结果的格式顺序输出2个复数的和、差、积、商,数字精确到小数点后1位。如果结果的实部或者虚部为0,则不输出。如果结果为0,则输出0.0。
输入样例1:
2 3.08 -2.04 5.06
输出样例1:
(2.0+3.1i) + (-2.0+5.1i) = 8.1i
(2.0+3.1i) - (-2.0+5.1i) = 4.0-2.0i
(2.0+3.1i) * (-2.0+5.1i) = -19.7+3.8i
(2.0+3.1i) / (-2.0+5.1i) = 0.4-0.6i
输入样例2:
1 1 -1 -1.01
输出样例2:
(1.0+1.0i) + (-1.0-1.0i) = 0.0
(1.0+1.0i) - (-1.0-1.0i) = 2.0+2.0i
(1.0+1.0i) * (-1.0-1.0i) = -2.0i
(1.0+1.0i) / (-1.0-1.0i) = -1.0
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
float[] a=new float[2];
float[] b=new float[2];
float[] res=new float[2];//实部,虚部
StringBuilder sb1=new StringBuilder();
StringBuilder sb2=new StringBuilder();
for(int i=0;i<2;i++){
a[i]=sc.nextFloat();
//a[i]=
b[i]=sc.nextFloat();
}
if(b[0]<0){
sb1.append("(").append(toTwo(a[0])).append(toTwo(b[0])).append("i)");
}else{
sb1.append("(").append(toTwo(a[0])).append("+").append(toTwo(b[0])).append("i)");
}
if(b[1]<0){
sb2.append("(").append(toTwo(a[1])).append(toTwo(b[1])).append("i)");
}else{
sb2.append("(").append(toTwo(a[1])).append("+").append(toTwo(b[1])).append("i)");
}
for(int i=1;i<=4;i++){
switch(i){
case 1:{//加
res[0]=a[0]+a[1];
res[1]=b[0]+b[1];
System.out.print(sb1+" + "+sb2+" = ");
res(res[0],res[1]);
break;
}
case 2:{//剪
res[0]=a[0]-a[1];
res[1]=b[0]-b[1];
System.out.print(sb1+" - "+sb2+" = ");
res(res[0],res[1]);
break;
}
case 3:{//乘
res[0]=a[0]*a[1]-b[0]*b[1];
res[1]=a[0]*b[1]+a[1]*b[0];
System.out.print(sb1+" * "+sb2+" = ");
res(res[0],res[1]);
break;
}
case 4:{//除
float denominator=(float) (Math.pow(a[1],2)+Math.pow(b[1],2));//分母
res[0]=(a[0]*a[1]+b[0]*b[1])/denominator;
res[1]=(a[1]*b[0]-a[0]*b[1])/denominator;
System.out.print(sb1+" / "+sb2+" = ");
res(res[0],res[1]);
break;
}
}
}
}
public static String toTwo(float a){
return new java.text.DecimalFormat("0.0").format(a);
}
public static void res(float res1,float res2){
//Math.abs:绝对值
if(Math.abs(res1)<0.05&&Math.abs(res2)<0.05){
System.out.println("0.0");
}else if(Math.abs(res1)<0.05){
System.out.println(toTwo(res2)+"i");
}else if(Math.abs(res2)<0.05){
System.out.println(toTwo(res1));
}else {
System.out.print(toTwo(res1));
if(res2<0){
System.out.println(toTwo(res2)+"i");
}else{
System.out.println("+"+toTwo(res2)+"i");
}
}
}
}