一、求两个数的和与差。程序填空,不要改变与输入输出有关的语句。 输入整数a和b,计算并输出a、b的和与差。 import java.io.*; import java.util.Scanner; public class Test20001{ public static void main(String args[]){ int a, b, sum, diff; Scanner in=new Scanner(System.in); a=in.nextInt(); b=in.nextInt(); /*------------------*/ sum=a+b; diff=a-b; System.out.println("The sum is "+sum); System.out.println("The difference is "+diff); } } 二、求平方根。程序填空,不要改变与输入输出有关的语句。 输入1个实数x,计算并输出其平方根。 例:输入1.21输出The square root of 1.21 is 1.1 import java.io.*; import java.util.Scanner; public class Test20002{ public static void main(String args[]){ double x, root; Scanner in=new Scanner(System.in); x=in.nextDouble(); /*------------------*/ root=Math.sqrt(x); System.out.println("The square root of "+x+" is "+root); } } 三、华氏温度转换为摄氏温度。程序填空,不要改变与输入输出有关的语句。 输入华氏温度f,计算并输出相应的摄氏温度c。c = 5/9(f-32). 例:括号内是说明:输入17.2 (华氏温度)输出The temprature is -8.222222222222223 import java.util.Scanner; public class Test20003 { public static void main(String[] args) { Scanner in=new Scanner(System.in); double f, c; f=in.nextDouble(); /*------------------*/ c=5.0/9*(f-32); System.out.println("The temprature is "+c); } } 四、计算旅途时间。程序填空,不要改变与输入输出有关的语句。 输入2个整数time1和time2,表示火车的出发时间和到达时间,计算并输出旅途时间。 有效的时间范围是0000到2359,不需要考虑出发时间晚于到达时间的情况。 例:括号内是说明:输入712 1411(出发时间是7:12,到达时间是14:11) 输出The train journey time is 6 hrs 59 mins. import java.util.Scanner; public class Test20004 { public static void main(String[] args) { Scanner in=new Scanner(System.in); int time1, time2, hours, mins; time1=in.nextInt(); time2=in.nextInt(); /*------------------*/ /*计算两个时间之间的小时数和分钟数*/ hours=time2/100-time1/100; mins=time2%100-time1%100; /*当计算得到的分钟数为负数时进行如下处理*/ hours=mins>0?hours:hours-1; mins=mins>0?mins:mins+60; System.out.println("The train journey time is "+hours+" hrs "+ mins+" mins."); } } 五、数字加密。程序填空,不要改变与输入输出有关的语句。 输入1个四位数,将其加密后输出。方法是将该数每一位上的数字加9,然后除以10取余,做为该位上的新数字,最后将第1位和第3位上的数字互换,第2位和第4位上的数字互换,组成加密后的新数。 例:括号内是说明:输入1257输出The encrypted number is 4601(每一位上的数字加9除以10取余后,得0146,交换后得到4601) import java.util.Scanner; public class Test20005 { public static void main(String[] args) { Scanner in=new Scanner(System.in); int number, digit1, digit2, digit3, digit4, newnum; number=in.nextInt(); /*------------------*/ /*先分离出各位上的数字*/ digit1=number/1000;(是这样来取得位数的) digit2=number/100%10; //或 digit2=(number-digit1*1000)/100; digit3=number/10%10; //或 digit3=(number-digit1*1000-digit2*100)/10; digit4=number%10; /*再调整各位上的数字*/ digit1=(digit1+9)%10; digit2=(digit2+9)%10; digit3=(digit3+9)%10; digit4=(digit4+9)%10; /*最后组成加密后的新数*/ newnum=digit3*1000+digit4*100+digit1*10+digit2;(注意这里是这样来实现交换的) System.out.println("The encrypted number is "+newnum); } } 六、大写字母转换成小写字母。程序填空,不要改变与输入输出有关的语句。 输入一个大写英文字母,输出相应的小写字母。 例:输入G输出g import java.io.*; public class Test20006 { public static void main(String[] args) throws IOException { char ch; ch=(char)System.in.read(); /*------------------*/ ch=(char)(ch+32); System.out.println(ch); } } 七、计算三门课程的平均成绩。程序填空,不要改变与输入输出有关的语句。 已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分,求该生3门课程的平均分。 本题无输入。输出示例:math = 87, eng = 72, comp = 93 ,average = 84 public class test20007 { public static void main(String[] args) { int math, eng, comp, average; /**********/ math=87; eng=72; comp=93; average=(math+eng+comp)/3; System.out.println("math = "+math+", eng = "+eng+", comp = "+comp); System.out.println("average = "+ average); } } 八、计算存款利息。程序填空,不要改变与输入输出有关的语句。 输入存款金额 money、存期 year 和年利率 rate,根据下列公式计算存款到期时的利息 interest(税前),输出时保留2位小数。 interest = money(1+rate)^year - money 输入输出示例:括号内为说明 输入1000 3 0.025 (money = 1000, year = 3, rate = 0.025) 输出interest = 76.89 import java.util.Scanner; public class test20008 { public static void main(String[] args) { int money, year; double interest, rate; Scanner in=new Scanner(System.in); /*使用in.nextDouble()和in.nextInt()输入double和int型数据*/ /**********/ money=in.nextInt(); year=in.nextInt(); rate=in.nextDouble(); interest=money*Math.pow((1+rate), year )- money; 表示的是1+rate的year方幂 System.out.println("interest = "+ (int)(interest*100+0.5)/100.0); //保留两位小数 } } 实验5 分支结构程序的设计 一、显示两级成绩,程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个学生的数学成绩,如果它低于60,输出“Fail”,否则,输出“Pass”。 输出使用System.out.println("Pass");及System.out.println("Fail"); 例:括号内是说明:输入2 (repeat=2) 60 59输出Pass Fail import java.util.Scanner; public class Test30001{ public static void main(String[] args){ int ri, repeat; int mark; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ mark=in.nextInt(); /*------------------*/ if (mark<60) System.out.println("Fail"); else System.out.println("Pass"); } } } 二、找最小值,程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入四个整数,输出其中的最小值。 例:括号内是说明 输入 3 (repeat=3) 12 6 1 90 10 40 30 20 -1 -3 -4 -5 输出 min is 1 (12 6 1 90 中的最小值是1) min is 10 (10 40 30 20 中的最小值是10) min is -5 (-1 -3 -4 -5中的最小值是-5) import java.util.Scanner; public class Test30002 { public static void main(String[] args){ int ri, repeat; int a, b, c, d, min; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ a=in.nextInt(); b=in.nextInt(); c=in.nextInt(); d=in.nextInt(); /*------------------*/ min=a; if(min>b) min=b; if(min>c) min=c; if(min>d) min=d; System.out.println("min is "+min); } } } 三、求三角形的面积和周长,程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入三角形的三条边a, b, c,如果能构成一个三角形,输出面积area和周长perimeter;否则,输出“These sides do not correspond to a valid triangle”。 在一个三角形中,任意两边之和大于第三边。 三角形的面积计算公式: aere*area = s(s-a)(s-b)(s-c) 其中:s = (a+b+c)/2 输出代码: System.out.println("area="+(int)(area*100+0.5)/100.+";perimeter="+(int)(perimeter*100+0.5)/100.); System.out.println("These sides do not correspond to a valid triangle"); 例:括号内是说明 输入 2 (repeat=2) 5 5 3 1 1 4 输出 area=7.15;perimeter=13.0 These sides do not correspond to a valid triangle import java.util.Scanner; public class Test30003 { public static void main(String[] args){ int ri, repeat; float a, b, c, area, perimeter, s; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ a=in.nextFloat(); b=in.nextFloat(); c=in.nextFloat(); /*------------------*/ if (a+b>c&&a+c>b&&b+c>a) { s=(a+b+c)/2; area=(float)Math.sqrt(s*(s-a)*(s-b)*(s-c)); perimeter=a+b+c; System.out.println("area="+(int)(area*100+0.5)/100.+";perimeter="+(int)(perimeter*100+0.5)/100.); } else System.out.println("These sides do not correspond to a valid triangle"); } } } 四、判断数的符号,程序填空,不要改变与输入输出有关的语句。 输入整数x,若x大于0,y=1;若x等于0,y=0;否则,y=-1,最后输出y。 import java.util.Scanner; public class Test30004{ public static void main(String[] args){ int ri, repeat; int x, y; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ x=in.nextInt(); /*------------------*/ if (x>0)y=1; else if(x==0)y=0; else y=-1; System.out.println(y); } } } if(x>0) y=1; if(x<0) y=-1; else y=0; (这样是错的。。这是为什么?) 五、计算个人所得税,程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个职工的月薪salary,输出应交的个人所得税tax。 tax = rate * (salary-850) 当 salary <= 850 时,rate = 0%; 当 850 < salary <= 1350 时,rate = 5%; 当 1350 < salary <= 2850 时,rate = 10%; 当 2850 < salary <= 5850 时,rate = 15%; 当 5850 < salary 时,rate = 20%; 例:括号内是说明 输入 5 (repeat=5) 1010.87 32098.76 800 4010 2850 输出 tax=8.04 tax=6249.75 tax=0.0 tax=474.0 tax=200.0 import java.util.Scanner; public class Test30005 { public static void main(String[] args){ int ri, repeat; float rate, salary, tax; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ salary=in.nextFloat(); /*------------------*/ if(salary<=850) rate=0; else if(salary<=1350) rate=0.05f; else if(salary<=2850) rate=0.1f; else if(salary<=5850) rate=0.15f; else rate=0.2f; tax=rate*(salary-850); System.out.println("tax="+(int)(tax*100+0.5)/100.0); } } } 六、显示水果的价格,程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 以下4种水果的单价分别是3.00元/公斤,2.50元/公斤,4.10元/公斤,10.20元/公斤。 [1] apples [2] pears [3] oranges [4] grapes 输入水果的编号,输出该水果的单价。如果输入不正确的编号,显示单价为0。 例:括号内是说明 输入 1 (repeat=1) 3 (oranges的编号) 输出 [1] apples [2] pears [3] oranges [4] grapes price=4.1 import java.util.Scanner; public class Test30006{ public static void main(String[] args){ int ri, repeat; int choice; float price; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ System.out.println("[1] apples"); System.out.println("[2] pears"); System.out.println("[3] oranges"); System.out.println("[4] grapes"); choice=in.nextInt(); /*------------------*/ switch(choice){ case 1:price=3.0f;break; case 2:price=2.5f;break; case 3:price=4.1f;break; case 4:price=10.2f;break; default: price=0; } System.out.println("price="+price); } } } 七、字母转换,程序填空,不要改变与输入输出有关的语句。 输入一批以问号“?”结束的字符,对“?”以前的每一个字符,如果它是大写字母,输出相应的小写字母;如果它是小写字母,输出相应的大写字母;否则,原样输出。 import java.io.*; public class Test30007 { public static void main(String[] args)throws IOException{ char ch; ch=(char)System.in.read(); while(ch!='?'){ /*------------------*/ if('A'<=ch&&ch<='Z') ch+=32; else if('a'<=ch&&ch<='z') //此处必须使用if结构的嵌套 ch-=32; System.out.print(ch); ch=(char)System.in.read(); } } } 循环结构程序的设计(一) 1. 求1+1/2+1/3+……+1/n 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 读入1 个正整数 n(n<=100),计算并输出1+1/2+1/3+……+1/n 。 i=1; i<=n; sum=0; do { i=i+1; sum=sum+1/i; } while(n<=100); System.out.println((int)(sum*1000+0.5)/1000.); } } } import java.util.Scanner; public class Test40001 { public static void main(String[] args) { int ri, repeat; int i, n; float sum; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); /*--------------------*/ //以下if语句用于检查输入数据的正确性,可以不写 if(n<=0||n>100){ //输入0、负数或大于100的数时结束程序的运行 System.out.println("输入数据出错,程序退出"); System.exit(0); } sum=0; //注意这条赋初值语句的位置 for(i=1;i<=n;i++){ sum+=1.0f/i; } System.out.println((int)(sum*1000+0.5)/1000.); } } } 2. 求n! 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 读入1 个正整数 n(n<=50),计算并输出n! 。 import java.util.Scanner; public class Test40002 { public static void main(String[] args) { int ri, repeat; int i, n; double fact;/// 这里的double在编写中是用不到的吧~~ Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); /*--------------------*/ fact=1; for(i=1;i<=n;i++) fact*=i; System.out.println(fact); } } } 3. 求x的n次幂 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 读入1 个正实数x和1个正整数 n(n<=50),计算并输出x的n次幂。 import java.util.Scanner; public class Test40003 { public static void main(String[] args) { int ri, repeat; int i, n; double x, mypow; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ x=in.nextDouble(); n=in.nextInt(); /*--------------------*/ mypow=1; for(i=1;i<=n;i++) mypow*=x; System.out.println(mypow); } //这个,怎么感觉有些不对?? } } 4. 求1+1/3+1/5+1/7+…… 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 读入1 个正整数 n(n<=100),计算并输出1+1/3+1/5+1/7+……的前n项和。 import java.util.Scanner; public class Test40005 { public static void main(String[] args) { int ri, repeat; int i, n, temp; float sum; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); /*--------------------*/ temp=1; sum=0; for(i=1;i<=n;i++) //那这里i是什么用的么??循环N次!! { sum+=1.0f/temp; temp+=2; } System.out.println(sum); } } } 解法二: temp=2*n-1; sum=0; for(i=1;i<=temp;i+=2) sum+=1.0f/i; 5. 摄氏温度和华氏温度转换表。程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入2个整数begin和end,分别代表摄氏温度的起止值,输出该范围内摄氏温度C和华氏温度F的转换表。 F = 32 + C * 9 / 5 输出语句:System.out.println(c+"t"+f); import java.util.Scanner; public class Test40007 { public static void main(String[] args){ int ri, repeat; int begin, c, end, f; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ begin=in.nextInt(); end=in.nextInt(); System.out.println("Celsius Fahrenheit");//这一条在最后他是自会输出的!! /*--------------------*/ for(c=begin;c<=end;c++) { //这样显然也是可以的~~ f=32+c*9/5; System.out.println(c+"t"+f); //就算是空格也不要忘了加引号!! } } } } 6. 求奇数和。程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 读入一批正整数(以零或负数为结束标志),求其中的奇数和。 import java.util.Scanner; public class Test40008 { public static void main(String[] args){ int ri, repeat; int x, sum; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ x=in.nextInt(); /*--------------------*/ sum=0; while(x>0){ if(x%2!=0)sum+=x; x=in.nextInt(); 为什么把他放前面顺序就不一样了呢? } System.out.println(sum); } } } sum=0; if(x%2!=0) sum+=x; //if 和 while之间的区别要分清楚了!! 7. 求最大值。程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个正整数n, 再输入n个整数,输出最大值。 import java.util.Scanner; public class Test40009 { public static void main(String[] args){ int ri, repeat; int i , max, n, x; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); /*--------------------*/ max=in.nextInt(); for(i=1;i<=n-1;i++){ x=in.nextInt(); if(x>max)max=x; } System.out.println(max); } } } 8. 求整数的位数以及各位数之和。程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个整数,输出它的位数以及各位数之和。 import java.util.Scanner; public class Test40010 { public static void main(String[] args){ int ri, repeat; int number, sum,n; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); /*--------------------*/ n=Math.abs(n); number=sum=0; do{ sum=sum+(n%10); number++; n=n/10; //这样一直除的话到后来sum一直是加0.但number不是还是一直在加上去么? }while(n>0); //这个不是很显然的么?为什么还要写? /* 如果使用while语句,输入0时输出 “number=0, sum=0”, 其中number的值不正确,应是1 */ System.out.println("number="+number+", sum="+sum); } } } import java.util.*; public class grade { public static void main(String []args){ Scanner in =new Scanner(System.in); int gcd, lcm, m, n,r; int repeat, ri; repeat=in.nextInt(); for(ri = 1; ri <= repeat; ri++){ m=in.nextInt(); n=in.nextInt(); r=m; if(m <= 0 || n <= 0) System.out.println("m <= 0 or n <= 0"); else{lcm=m*n; do{ if(m<n){r=m;m=n;n=r; } r=m%n ; m=n; n=r; }while(r!=0); gcd=m; lcm=lcm/m; System.out.println("the least common multiple:"+lcm+", the greatest common divisor:"+gcd); } } } } 循环结构程序的设计(二) 9. 求1-1/2+1/3-1/4+…… 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 读入1 个正整数 n(n<=100),计算并输出1-1/2+1/3-1/4+……的前n项和(四舍五入保留小数4位)。 import java.util.Scanner; public class Test40004 { public static void main(String[] args) { int ri, repeat; int i, n, flag; float sum; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); /*--------------------*/ sum=0; flag=1; for(i=1;i<=n;i++) { sum+=flag*1.0f/i; flag=-flag; } System.out.println((long)(sum*10000+0.5)/10000.); } } } 10. 求1-1/3+1/5-1/7+…… 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 读入1 个正实数eps,计算并输出1-1/3+1/5-1/7+……,直到最后一项的绝对值小于eps为止(要求每一项的绝对值均大于等于eps,并以float类型输出数据)。 import java.util.Scanner; public class Test40006 { public static void main(String[] args) { int ri, repeat; int temp, flag; double eps, item, sum; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ eps=in.nextDouble(); /*--------------------*/ item=1; sum=0; temp=flag=1; while(Math.abs(item)>=eps){ sum+=item; flag=-flag; temp+=2; item=flag*1.0/temp; } System.out.println((int)(sum*10000+0.5)/10000.); } } } 11. 求2/1+3/2+5/3+8/5+... 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个正整数n,输出 2/1+3/2+5/3+8/5 +...的前n项之和,保留4位小数(不足4位时,不必用0填满4位)。(该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子) import java.util.Scanner; public class Test40011 { public static void main(String[] args) { int ri, repeat; int i,n; float a,b,s,t; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); /*--------------------*/ a=1; //分母 //这样的题目像兔子数列一样,开始时都定好一些值就好了。 b=2; //分子 s=0; for(i=1;i<=n;i++) { s+=b/a; t=a; a=b; //分母是前一项的分子 b=t+b; //分子是前一项分子与分母的和 } s=s+b/a; a=b; b=a+b; //为什么直接这样做他就错了呢? System.out.println((int)(s*10000+.5)/10000.); } } } 12. 求a+aa+aaa+aa…a 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入2个正整数a和n, 求a+aa+aaa+aa…a(n个a)之和。 import java.util.Scanner; public class Test40012{ public static void main(String args[]){ int ri, repeat; int i, n, a, sn, tn; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ a=in.nextInt(); n=in.nextInt(); /*--------------------*/ tn=a; sn=0; for(i=1;i<=n;i++){ sn+=tn; tn=tn*10+a; //迭代公式 } sn=0; tn=0; for(i=1;i<=n;i++){ tn=tn*10+a; sn=sn+tn; } System.out.println(sn); } } } 13. 判断素数。程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个正整数m,如果它是素数,输出"YES",否则,输出"NO"(素数就是只能被1和自身整除的正整数,1不是素数,2是素数)。 import java.util.Scanner; public class Test40013{ public static void main(String args[]){ int ri, repeat; int i, m, n; boolean flag; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ m=in.nextInt(); /*--------------------*/ flag=true; if(m==1)flag=false; ///true和false输进去是会变红的!! for(i=2;i<=m-1;i++) if(m%i==0){ flag=false; break; //有些时候确实需要你确认一下是不是大括号方面出错了!! } flag=true;if(m==1)flag=false; for(i=2;i<=m-1;i++){ if(m%i==0)flag=false; } if(flag) System.out.println("YES"); else System.out.println("NO"); } } } 14. 求1 + 1/2! +....+ 1/n! 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入1 个正整数n,计算 s 的前n项的和。 s = 1 + 1/2! +....+ 1/n! import java.util.Scanner; public class Test40021{ public static void main(String args[]){ int ri, repeat; int i,n; float s,t; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); /*--------------------*/ s=0; t=1; for(i=1;i<=n;i++){ t*=i; s+=1/t; //如果这两条语句交换位置,则i=1要改成i=2 } System.out.println((int)(s*10000+0.5)/10000.); } } } 15. 求各位数字的立方和等于它本身的数。程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入2 个正整数m和n(1<=m,n<=1000),输出m 和n之间所有满足各位数字的立方和等于它本身的数。 输出语句:System.out.println(i); import java.util.Scanner; public class Test40022{ public static void main(String args[]){ int ri, repeat; int i, digit, m, n, number, sum; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ m=in.nextInt(); n=in.nextInt(); /*------------------*/ for(i=m;i<=n;i++){ //不能从值上来看i所代表的循环次数啊!!! number=i; sum=0; //为什么总有number大于0这个显然的东西? while(number>0){ digit=number%10; number=number/10; sum+=digit*digit*digit; } if(i==sum) System.out.println(i); } } } } Method的使用 16. 统计素数并求和。程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入2 个正整数m和n(1<=m,n<=500),统计并输出m 和n之间的素数的个数以及这些素数的和。 例:括号内是说明 输入: 3 (repeat=2) 1 10 (m=1, n=10) 20 35 (m=20, n=35) 14 16 (m=14, n=16) 输出: count=4, sum=17 (1到10之间有4个素数:2,3,5,7) count=3, sum=83 (20到35之间有3个素数:23, 29, 31) count=0, sum=0 (14到16之间没有素数) import java.util.Scanner; public class Test40023 { public static void main(String args[]){ int ri, repeat; int count, digit, i, j, k , m, n, sum; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1;ri<=repeat;ri++) { m=in.nextInt(); n=in.nextInt(); /*---------------------*/ count=sum=0; for(k=m;k<=n;k++){ for(i=2;i<=k-1;i++) if(k%i==0)break; if(i==k){ count++; sum+=k; } } System.out.println("count="+count+", sum="+sum); } } } import java.util.Scanner; public class Test40023_2 { public static void main(String args[]){ int ri, repeat; int count, i, j, k , m, n, sum; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1;ri<=repeat;ri++) { m=in.nextInt(); n=in.nextInt(); /*---------------------*/ count=sum=0; boolean flag; for(k=m;k<=n;k++) { if(k==1)flag=false; //1不是素数 else flag=true; for(i=2;i<=k-1;i++) { if(k%i==0){ flag=false; break; } } if(flag){ sum+=i; count++; } } System.out.println("count="+count+", sum="+sum); } } } import java.util.Scanner; public class a{ public static void main(String args[]){ int ri, repeat; int count, i, j, k, m, n, sum; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ m=in.nextInt(); n=in.nextInt(); count=sum=0; for(i=m;i<=n;i++) { if(isprime(i)) {count++; sum+=i;} } System.out.println("count="+count+", sum="+sum); } } public static boolean isprime(int n) { int i; if(n<2) return false; for(i=2;i<n;i++) if(n%i==0) break; if(i==n) return true; else return false; } } 顺序结构程序的设计 17. 求1 + 1/2! +....+ 1/n! 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入1 个正整数n,计算 s 的前n项的和(保留 4 位小数)。 s = 1 + 1/2! +....+ 1/n! 要求定义并调用函数fact(n)计算n的阶乘。 import java.util.Scanner; public class Test50001 { public static void main(String[] args) { int ri,repeat; int i,n; double s; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1;ri<=repeat;ri++){ n=in.nextInt(); /*---------------*/ s=0; for(i=1;i<=n;i++) s+=1.0/fact(i); System.out.println((long)(s*10000+0.5)/10000.); } } /*---------------*/ static double fact(int n) { int i; double f=1; //把两个变量先定义一下!! for(i=1;i<=n;i++) f*=i; return f; } /* 方法fact()也可以用以下递归算法设计 static double fact(int n) { if(n==1) return 1; else return n*fact(n-1); } */ } 18. 求a+aa+aaa+aa…a 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入2个正整数a和n, 求a+aa+aaa+aa…a(n个a)之和。 要求定义并调用函数fn(a,n),它的功能是返回aa…a(n个a)。例如,fn(3,2)的返回值是33。 import java.util.Scanner; public class Test50002{ public static void main(String args[]){ int ri, repeat; int i, n,a; long sn; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ a=in.nextInt(); n=in.nextInt(); /*------------*/ sn=0; for(i=1;i<=n;i++) sn+=fn(a,i); System.out.println(sn); } } /*------------*/ static int fn(int a,int n){ int s=0; for(int i=1;i<=n;i++) s=s*10+a; f(a,n)=a+10*f(a,n-1); 错的原因是? return s; } /* 方法fn()也可以用以下递归算法设计 static int fn(int a,int n){ if (n==1) return a; else return a+10*fn(a,n-1); } */ } 19. 统计一个整数中数字的个数 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 读入1 个整数,统计并输出该数中2的个数。 要求定义并调用函数countdigit(number,digit),它的功能是统计整数number中数字digit的个数。例如,countdigit(10090,0)的返回值是3。 import java.util.Scanner; public class Test50003{ public static void main(String args[]){ int ri, repeat; int count; long n; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); /*---------*/ n=Math.abs(n); count = countdigit(n,2); System.out.println("count="+count); } } /*---------*/ static int countdigit(long number,int digit){ int a,c=0; while(number>0){ a=(int)(number%10); if(a==digit)c++ //当a不等于digit的情况下?是不是默认就进行下一个的循环了? number=number/10; } return c; } } 20. 判断素数 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个正整数n,如果它是素数,输出"YES",否则,输出"NO"(素数就是只能被1和自身整除的正整数,1不是素数,2是素数)。 要求定义并调用函数prime(m)判断m是否为素数。 import java.util.Scanner; public class Test50004{ public static void main(String args[]){ int ri, repeat,n; boolean flag; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); /*---------*/ flag=prime(n); if(flag) System.out.println("YES"); else System.out.println("NO"); } } static boolean prime(int m){ boolean flag=true; if(m==1)flag=false; for(int i=2;i<=m-1;i++) if(m%i==0) { flag=false; break; } return flag; } } 21. 统计素数并求和 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入2 个正整数m和n(1<=m,n<=500),统计并输出m 和n之间的素数的个数以及这些素数的和(素数就是只能被1和自身整除的正整数,1不是素数,2是素数)。 要求定义并调用函数prime(m)判断m是否为素数。 import java.util.Scanner; public class Test50005{ public static void main(String args[]){ int ri, repeat; int count, i, m, n, sum; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ m=in.nextInt(); n=in.nextInt(); /*---------*/ count=0; sum=0; for(i=m;i<=n;i++) if(prime(i)){count++; sum+=i;} System.out.println("count="+count+", sum="+sum); } } /*---------*/ static boolean prime(int m){ boolean flag=true; if(m==1)flag=false; for(int i=2;i<=m-1;i++) if(m%i==0) { flag=false; break; } return flag; } } 22. 输出 Fibonacci 序列 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入2 个正整数m和n(1<=m,n<=10000),输出m 和n之间所有的Fibonacci数。 Fibonacci 序列(第1项起):1 1 2 3 5 8 13 21 ...... 要求定义并调用函数fib(n),它的功能是返回第n项Fibonacci数。例如,fib(7)的返回值是13。 输出语句:System.out.print(f+" "); import java.util.Scanner; public class Test50006{ public static void main(String args[]){ int ri,repeat; int i, m, n; long f; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ m=in.nextInt(); n=in.nextInt(); /*---------*/ i=1; f=1; while(f<=n){ if(f>=m) System.out.print(f+" "); i++; f=fib(i); //是要输出的数在mn之间,而不是要循环这么多次啊! } System.out.println(); } } /*---------*/ static long fib(int n){ int i; long a=1,b=1,f=1; for(i=3;i<=n;i++){ //从第3项开始计算 f=a+b; a=b; b=f; } return f; } } /* 方法fib(n)用递归实现 static long fib(int n){ if(n==1||n==2) return 1; else return fib(n-1)+fib(n-2); } */ 23. 求完数 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入2 个正整数m和n(1<=m,n<=1000),输出m 到n之间的所有完数(完数就是因子和与它本身相等的数)。 要求定义并调用函数factorsum(number),它的功能是返回number的因子和。例如,factorsum(12)的返回值是16(1+2+3+4+6)。 输出语句:System.out.print(i+" "); import java.util.Scanner; public class Test50007{ public static void main(String args[]){ int ri,repeat; int i, m, n; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1;ri<=repeat;ri++){ m=in.nextInt(); n=in.nextInt(); /*---------*/ for(i=m;i<=n;i++) if(i==factorsum(i)) System.out.print(i+" "); System.out.println(); } } static int factorsum(int number){ int sum=0; if(number==1)sum=1; for(int i=1;i<=number-1;i++) if(number%i==0)sum+=i; return sum; } } static int factorsum(int number){ int s=0,a=0; while(number>0){ a=number%10; s=s+a; number=number/10; } return s; } 哎呀!!!你这样定义的不是因子和啊!! 24. }求各位数字的立方和等于它本身的数 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入2 个正整数m和n(1<=m,n<=1000),输出m 到n之间的所有满足各位数字的立方和等于它本身的数。 要求定义并调用函数is(number)判断number的各位数字之立方和是否等于它本身。 输出语句:System.out.print(i+" "); import java.util.Scanner; public class Test50008{ public static void main(String args[]){ int ri,repeat; int i, m, n; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1;ri<=repeat;ri++){ m=in.nextInt(); n=in.nextInt(); /*---------*/ for(i=m;i<=n;i++) if(is(i)) System.out.print(i+" "); System.out.println(); } } /*---------*/ static boolean is(int number) { int sum=0,n,digit; n=number; while(n>0){ digit=n%10; n=n/10; sum+=digit*digit*digit; } if(number==sum) return true; else return false; } } Method的使用(二) 25. 将一个整数逆序输出 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个整数,将它逆序输出。 要求定义并调用函数reverse(number),它的功能是返回number的逆序数。例如reverse(12345)的返回值是54321。 import java.util.Scanner; public class Test50009{ public static void main(String args[]){ int ri,repeat; long n, res; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1;ri<=repeat;ri++){ n=in.nextInt(); /*---------*/ res=reverse(n); System.out.println(res); } } /*---------*/ static long reverse(long number){ int flag=1; long a=0,digit; if(number<0){ flag=-1; number=-number; } while(number>0){ digit=number%10; //分离出个位数字 a=a*10+digit; //形成当前的逆序数 number=number/10; } return flag*a; } } 26. 十进制转换二进制 输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算: 输入1 个正整数n,将其转换为二进制后输出。 要求定义并调用函数 dectobin(n),它的功能是输出 n 的二进制。例如,调用dectobin(10),输出1010。 输出语句:System.out.print(t); //t为某位二进制数 import java.util.Scanner; public class Test50010{ public static void main(String args[]){ int ri,repeat; int i,n; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1;ri<=repeat;ri++){ n=in.nextInt(); /*---------*/ dectobin(n); System.out.println(); } } /*---------*/ static void dectobin(int n){ int t; //保存某位二进制 String s=""; //保存二进制数 do { t=n%2; //获得除2后的余数 s=t+s; //拼接 n=n/2; //获得除2后的商 }while(n>0); System.out.print(s); //本方法无返回值,需要在方法体中输出结果 } } 一维数组的使用 27. 求平均值 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个正整数n (1<n≤10),再输入n个整数,输出平均值。 import java.util.Scanner; public class Test60001{ public static void main(String []args){ int ri, repeat; int i, n, sum,a[]; float aver; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); a=new int[n]; for(i=0; i<n; i++) a[i]=in.nextInt(); /*---------*/ sum=0; for(i=0; i<n; i++) //这个循环实现累加 sum+=a[i]; aver=((float)sum)/n; //求平均值,注意要先把sum转换成float,再计算 System.out.println("aver="+aver); } } } 28. 求最大值及其下标 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个正整数n (1<n≤10),再输入n个整数,输出最大值极其下标(设最大值惟一,下标从0开始)。 import java.util.Scanner; public class Test60002{ public static void main(String []args){ int ri, repeat; int i, index, n, a[]; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); a=new int[n] ; for(i=0; i<n; i++) a[i]=in.nextInt(); /*---------*/ index=0; //用index保存最大数的下标,开始假设a[0]是最大数 for(i=1; i<n; i++) if(a[index]<a[i]) index=i; //a[i]与当前最大数a[index]比较,若a[i]更大,index变为i System.out.println("max="+a[index]+",index="+index); } } } 29. 逆序输出 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个正整数n (1<n≤10),再输入n个整数,按逆序输出这些数。 import java.util.Scanner; public class Test60003{ public static void main(String []args){ int ri, repeat; int i, n, temp,a[]; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); a=new int[n]; for(i=0; i<n; i++) a[i]=in.nextInt(); /*---------*/ for(i=0; i<n/2; i++){ //a[i]与a[n+1-i]交换,注意交换次数 temp=a[i]; a[i]=a[n+1-i]; a[n+1-i]=temp; } for(i=0; i<n; i++) System.out.print(a[i]+" "); System.out.println(); } } } 30. 交换最小值和最大值 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个正整数n,再输入n个整数,将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n个数。 import java.util.Scanner; public class Test60004{ public static void main(String []args){ int ri, repeat; int i, index, n, t,a[]; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); a=new int[n]; for(i=0; i<n; i++) a[i]=in.nextInt(); /*---------*/ index=0; //找最大数 for(i=0; i<n; i++) if(a[index]<a[i]) index=i; t=a[index]; a[index]=a[n-1];a[n-1]=t; //交换 index=0; //找最小数 for(i=0; i<n; i++) if(a[index]>a[i]) index=i; t=a[index]; a[index]=a[0];a[0]=t; //交换 for(i=0; i<n; i++) //输出 System.out.print(a[i]+" "); System.out.println(); } } } 二维数组的使用 31. 排序 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个正整数n,再输入n个整数,将它们从大到小排序后输出。 import java.util.Scanner; public class Test60005{ public static void main(String []args){ int ri, repeat; int i, index, k, n, temp,a[]; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); a=new int[n]; for(i=0; i<n; i++) a[i]=in.nextInt(); /*---------*/ for(i=0;i<n-1;i++) { //选择法递减排序 index=i; for(k=i+1;k<n;k++) if(a[k]>a[index]) index=k; temp=a[i]; a[i]=a[index]; a[index]=temp; } for(i=0; i<n; i++) System.out.print(a[i]+" "); System.out.println(); } } } 32. 矩阵运算 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 读入 1 个正整数 n(1≤n≤6), 再读入 n 阶方阵 a , 计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和.(副对角线为从矩阵的右上角至左下角的连线) import java.util.Scanner; public class Test60011{ public static void main(String []args){ int ri, repeat; int a[][],i,j,n,sum; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); a=new int[n][n]; for(i=0; i<n; i++) for(j=0;j<n;j++) a[i][j]=in.nextInt(); /*---------*/ sum=0; for(i=0; i<n-1; i++) //i<n-1 排除最后一行 for(j=0;j<n-1;j++){ //j<n-1 排除最后一列 if((i+j)!=(n-1)) sum+=a[i][j]; //非副对角线元素才加入 } System.out.println("sum="+sum); } } } 33. 加法口诀表 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入 1 个正整数 n(1≤n≤10), 输出一张 20 以内的加法口诀表. 加数与被加数都不大于 n, 分列第一行和第一列.(将加数、被加数、和放入一个二维数组中, 再输出该数组) import java.util.Scanner; public class Test60012{ public static void main(String []args){ int ri, repeat; int i,j,n,a[][]=new int[10][10]; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); /*---------*/ for(i=1;i<=n;i++) { //给第1行和第1列所有元素赋值,a[0][0]不用赋值 a[0][i]=i; //第1行为被加数,从第2列开始赋值1,2,...,n a[i][0]=i; //第1列为加数,从第2行元素开始赋值1,2,...,n } for(i=1;i<=n;i++) //计算和,从第2行第2列开始 for(j=1;j<=n;j++){ a[i][j]=i+j; //或 a[i][j]=a[0][j]+a[i][0]; //所在列第1行元素+所在行第1列元素 } for( i=0; i<=n; i++ ){ for( j=0; j<=n; j++ ) if(i==0&&j==0) System.out.print( "+ ");//在第1行第1列上输出"+ " else if(i==0||j<=i) System.out.print(a[i][j]+" "); //输出下三角阵和第1行元素 System.out.println(); } } } } 34. 判断上三角矩阵 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入1 个正整数 n (1≤n≤6)和n 阶方阵a中的元素,如果a是上三角矩阵, 输出"YES", 否则, 输出"NO"。(上三角矩阵,即主对角线以下的元素都为0, 主对角线为从矩阵的左上角至右下角的连线) import java.util.Scanner; public class Test60013{ public static void main(String []args){ int ri, repeat; int a[][],i,j,n; boolean flag; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); a=new int[n][n] for (i=0;i<n;i++) for (j=0;j<n;j++) a[i][j]=in.nextInt(); /*---------*/ flag=true; for(i=1;i<n;i++) //上三角矩阵中值为0的元素位置:行1~n-1,列0~i-1 for(j=0;j<i;j++) if(a[i][j]!=0) flag=false;//若有一个元素非0,则不是上三角矩阵 if(flag) System.out.println("YES"); else System.out.println("NO"); } } } 35. 求矩阵每行元素之和 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入2 个正整数 m 和 n (1≤m, n),然后输入该m 行 n 列矩阵a中的元素,分别求出 各行元素之和, 并存入一维数组row中, 再输出row. import java.util.Scanner; public class Test60014{ public static void main(String []args){ int ri, repeat; int i,j,m,n,a[][],row[]; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ m=in.nextInt(); n=in.nextInt(); a=new int[m][n]; row=new int[m]; //这里定义的时候row也是定义在行那里的!!! for (i=0;i<m;i++) for (j=0;j<n;j++) a[i][j]=in.nextInt(); /*---------*/ for (i=0;i<m;i++) for (j=0;j<n;j++) //表示的是那一个矩阵 row[i]+=a[i][j]; //计算数组a的第i+1行元素之和, 存入数组row的第i+1个元素 for(i=0;i<m;i++) System.out.println("sum of row "+i+" is "+row[i]); } } } 字符串处理 36. 求字符串长度 连续输入一批以 # 结束的多串字符(不包含空格)。。 统计并输出每串字符的长度。 输出使用:System.out.println(len); import java.util.Scanner; public class Test60021{ public static void main(String []args){ int len,count,i,k; //变量count,k未用到 char ch; String str; Scanner in=new Scanner(System.in); //话说这里就是一个数组了么? str=in.next(); //对5月7日前建立的练习用in.nextLine(); /*---------*/ len=0; //保存当前字符串的长度 // count=0; //保存字符串个数,可以不写 for(i=0;i<str.length();i++) { ch=str.charAt(i); //从字符串中逐个取出字符 if(ch=='#'){ //当前字符串结束了 System.out.println(len);//输出长度 // count++; //字符串增加1个,可以不写 len=0; //新的字符串要开始了 } else len++; //当前字符串长度加1 } //以上程序段可以换成以下的程序段: // String[] s=str.split("#"); //字符串数组 // for(i=0;i<s.length;i++) // System.out.println(s[i].length()); 输出的是第i串字符的长度 } } 37. 统计大写辅音字母 输入一个正整数n (0<n<10),做n次下列运算: 输入一行字符串,统计并输出字符串中大写辅音字母的个数 (大写辅音字母:除“A”,“E”,“I”,“O”,“U”以外的大写字母)。 import java.util.Scanner; public class Test60022{ public static void main(String []args){ int count,i,j,n; char ch; String str; Scanner in=new Scanner(System.in); n=(in.nextLine()).charAt(0)-'0'; //读取输入的第1行的第1个字符,转换成数字 for(i=1;i<=n;i++){ str=in.nextLine(); //读取输入的下一行 /*---------*/ count=0; //保存大写辅音字母的个数 for(j=0;j<str.length();j++){ ch=str.charAt(j); //从字符串中逐个取出字符 if((ch>='B'&&ch<='Z')&&(ch!='E'&&ch!='I'&&ch!='O'&&ch!='U'))//判断 //大写字母'B'~'Z'中去掉'E','I','O','U' count++; } System.out.println(count); } } } 38. 查找字符 先输入一个字符ch。然后输入一个正整数n (0<n<10),做n次下列运算: 输入一行字符串,在字符串中查找该字符(ch),如果找到,则输出 该字符在字符串中最后出现的位置(从0开始);否则输出“Not Found”。 import java.util.Scanner; public class Test60023{ public static void main(String []args){ int index,i,n,j; char ch; String str; Scanner in=new Scanner(System.in); ch=(in.nextLine()).charAt(0); //读取输入的第1行的第1个字符,就是要查找的字符 n=(in.nextLine()).charAt(0)-'0'; //读取输入的第2行的第1个字符,转换成数字 for(i=1;i<=n;i++){ str=in.nextLine(); //读取输入的下一行 /*---------*/ index=-1; //先假设找到 for(j=0;j<str.length();j++) if(str.charAt(j)==ch) index=j; //从当前字符串中找字符ch,找到时记住它的位置,继续找下一个 //循环结束后,index中的值就是最后出现的位置 if(index>=0) System.out.println(index); else System.out.println("Not Found"); } } } //解法2:从字符串末尾开始找字符ch,第1次找到时记住它的位置,终止循环。 index=-1; for(j=str.length()-1;j>=0;j--){ if(str.charAt(j)==ch) {index=j;break; } } 39. 字符串替换 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一行字符串,生成一个新的字符串,将原字符串中的大写字母用下面列出的对应大写字母替换, 其余字符不变, 输出新字符串. 原字母 对应字母 A ──→ Z B ──→ Y C ──→ X D ──→ W …… X ──→ C Y ──→ B Z ──→ A import java.util.Scanner; public class Test60024{ public static void main(String []args){ int ri, repeat, i; char ch; String str1,str2; Scanner in=new Scanner(System.in); repeat=(in.nextLine()).charAt(0)-'0'; for(ri=1; ri<=repeat; ri++){ str1=in.nextLine(); /*---------*/ str2=""; //保存转换后的新字符串 for(i=0;i<str1.length();i++) { ch=str1.charAt(i); //从字符串中逐个取出字符 if((ch>='A'&&ch<='Z')) //对该字符进行转换 ch=(char)('Z'-ch+'A'); str2=str2+ch; //转换后字符添加到结果中 } System.out.println(str2); } } } 字符串处理(二) 40010 40031 40032 50003 50009 50010 60025 说明:本次实验中的题目请采用字符串处理来实现。 40. 求整数的位数以及各位数之和。40010 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个整数,输出它的位数以及各位数之和。 import java.util.Scanner; public class Test40010 { public static void main(String[] args){ int ri, repeat; int number, sum,n; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); /*--------------------*/ n=Math.abs(n); String s=String.valueOf(n); //把整数n转换成字符串 number=s.length(); //得到整数的位数 sum=0; for(int i=0;i<number;i++){ sum+=(s.charAt(i)-'0'); //求各位数字和 } System.out.println("number="+number+", sum="+sum); } } } 41. 统计单词(选做) 40031 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一行字符,统计其中单词的个数。各单词之间用空格分隔,空格数可以是多个。 import java.util.Scanner; public class Test40031{ public static void main(String []args ){ int ri, repeat,count, word,i; String line; char c; Scanner in=new Scanner(System.in); repeat=(in.nextLine()).charAt(0)-'0'; for(ri=1; ri<=repeat; ri++){ line=in.nextLine(); /*---------*/ count=word=0; for(i=0;i<line.length();i++){ c=line.charAt(i); //从字符串line中取出第i个字符,放入变量c if(c==32) word=0; //当前字符是空格,表示不是单词 else if(word==0){ //当前字符不是空格,同时word=0,表示新单词开始 word=1; count++; } } System.out.println( count); } } } 42. 输出一个整数的各位数字(选做) 40032 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个整数,从高位开始逐位输出它的各位数字。 输出语句:System.out.print(digit+" "); 例:括号内是说明 import java.util.Scanner; public class Test40032{ public static void main(String []args ){ int ri, repeat; int digit; long n, temp, pow; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextLong(); /*---------*/ n=Math.abs(n); String s=String.valueOf(n); //把整数n转换成字符串 for(int i=0;i<s.length();i++){ digit=s.charAt(i)-'0'; //从高位到低位依次得到一位数字 System.out.print(digit+" "); //输出该位数字,再加一个空格 } System.out.println(); } } } 另一种编法: n=Math.abs(n); char[] cs=String.valueOf(n).toCharArray(); //把整数n转换成字符串后存入字符数组cs,cs的元素就是n的每位数字 for(int i=0;i<cs.length;i++) System.out.print(cs[i]+" "); //依次输出字符数组cs的各个元素 43. 统计一个整数中数字的个数 50003 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 读入1 个整数,统计并输出该数中2的个数。 要求定义并调用函数countdigit(number,digit),它的功能是统计整数number中数字digit的个数。例如,countdigit(10090,0)的返回值是3。 import java.util.Scanner; public class Test50003{ public static void main(String args[]){ int ri, repeat; int count; long n; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); /*---------*/ n=Math.abs(n); count=countdigit(n,2); System.out.println("count="+count); } } /*------------*/ static int countdigit(long number,int digit){//统计整数number中数字digit的个数 int c=0; String s=String.valueOf(number); //把长整数number转换成字符串 //以下循环实现:依次取出number的每个数字与指定数字digit比较,若相等则个数加1 for(int i=0;i<s.length();i++) if(s.charAt(i)-'0'==digit)c++; return c; } } 44. 将一个整数逆序输出 50009 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个整数,将它逆序输出。 要求定义并调用函数reverse(number),它的功能是返回number的逆序数。例如reverse(12345)的返回值是54321。 import java.util.Scanner; public class Test50009{ public static void main(String args[]){ int ri,repeat; long n, res; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1;ri<=repeat;ri++){ n=in.nextInt(); /*---------*/ res=reverse(n); System.out.println(res); } } /*---------*/ static long reverse(long number){//返回number的逆序数 long a; int flag=1; //保存符号 if(number<0) { flag=-1; number=-number; //负数变成正数 } String s1=String.valueOf(number); String s2=""; for(int i=0;i<s1.length();i++) s2=s1.charAt(i)+s2; //字符串逆序 a=Long.parseLong(s2); //转换成数值 return flag*a; //加上符号 } } 45. 十进制转换二进制50010 输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算: 输入1 个正整数n,将其转换为二进制后输出。 要求定义并调用函数 dectobin(n),它的功能是输出 n 的二进制。例如,调用dectobin(10),输出1010。 输出语句:System.out.print(t); //t为某位二进制数 import java.util.Scanner; public class Test50010{ public static void main(String args[]){ int ri,repeat; int i,n; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1;ri<=repeat;ri++){ n=in.nextInt(); /*---------*/ dectobin(n); System.out.println(); } } /*---------*/ static void dectobin(int n){ int t; //保存某位二进制 String s=""; //保存二进制数,这是字符串 do { t=n%2; //获得除2后的余数 s=t+s; //拼接 n=n/2; //获得除2后的商 }while(n>0); System.out.print(s); //本方法无返回值,需要在方法体中输出结果 } } 46. 十六进制转换十进制 60025 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一行字符串,对字符串做如下处理:滤去所有的非十六进制字符后,组成一 个新字符串(十六进制形式),然后将其转换为十进制数后输出。 import java.util.Scanner; public class Test60025{ public static void main(String []args){ int ri, repeat, i,number; char ch; String str; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ str=in.next(); /*---------*/ number=0; for(i=0;i<str.length();i++){ //从左往右依次取出字符 ch=str.charAt(i); if(ch>='0'&&ch<='9') //合法字符转换成相应数值后计算十进制数 number=number*16+(ch-'0'); else if(ch>='A'&&ch<='F') number=number*16+(ch-'A'+10); else if(ch>='a'&&ch<='f') number=number*16+(ch-'a'+10); } //说明:要滤去所有的非十六进制字符,实际上只要对这些字符不进行任何操作就行了(当它不存在!)。 System.out.println(number); } } } 或: number=0; str=str.toLowerCase(); //所有字母转换成小写字母 for(i=0;i<str.length();i++){ //从左往右依次取出字符 ch=str.charAt(i); if(ch>='0'&&ch<='9') //合法字符转换成相应数值后计算十进制数 number=number*16+(ch-'0'); else if(ch>='a'&&ch<='f') number=number*16+(ch-'a'+10); } 或: number=0; str=str.toUpperCase(); //所有字母转换成大写字母 for(i=0;i<str.length();i++){ //从左往右依次取出字符 ch=str.charAt(i); if(ch>='0'&&ch<='9') //合法字符转换成相应数值后计算十进制数 number=number*16+(ch-'0'); else if(ch>='A'&&ch<='F') number=number*16+(ch-'A'+10); } 实验13 数组作为方法的参数(4-6题) 40023 40033(选做) 60019(选做) 60030 60031 60032 47. 统计素数并求和。 40023 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入2 个正整数m和n(1<=m,n<=500),统计并输出m 和n之间的素数的个数以及这些素数的和。 import java.util.Scanner; public class Test40023{ public static void main(String args[]){ int ri, repeat; int count, i, j, k, m, n, sum; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ m=in.nextInt(); n=in.nextInt(); /*---------------------*/ count=sum=0; for(k=m;k<=n;k++){ for(i=2;i<=k-1;i++) if(k%i==0)break; if(i==k){ count++; sum+=k; } } System.out.println("count="+count+", sum="+sum); } } } 另一种编法: count=sum=0; boolean flag; for(k=m;k<=n;k++) { if(k==1)flag=false; //1不是素数 else flag=true; for(i=2;i<=k-1;i++) { if(k%i==0){flag=false; break;} } if(flag){sum+=i; count++;} } 48. 简单计算器(选做) 40033 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 程序模拟简单运算器的工作:输入一个算式,遇等号"="说明输入结束,输出结果。 假设计算器只能进行加减乘除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。 import java.util.Scanner; public class T40033{ public static void main(String args[]) { int ri, repeat; int op1, op2, res; char operator; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ op1=in.nextInt(); operator=(in.next()).charAt(0); /*---------*/ res=op1; while(operator!='=') { op2=in.nextInt(); switch(operator) { case '+': res+=op2;break; case '-': res-=op2;break; case '*': res*=op2;break; case '/': res/=op2;break; } operator=(in.next()).charAt(0); } System.out.println(res); } } } 49. 找鞍点(选做) 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入 1 个正整数 n和n 阶方阵a中的元素,如果找到a 的鞍点(鞍点的元素值在该行上最大, 在该列上最小), 就输出它的下标, 否则,输出"NO"(设a最多有1个鞍点)。 import java.util.Scanner; public class Test60019{ public static void main(String []args){ int ri, repeat; int i,j,k,row,col,n,a[][]; boolean flag; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); a=new int[n][n]; for (i=0;i<n;i++) for (j=0;j<n;j++) a[i][j]=in.nextInt(); /*---------*/ flag=true; row=0; col=0;//不写这些,就通不过编译 for(i=0;i<n;i++){ //先在第i行中找出该行的最大值 row=i; //row保存最大值的行坐标 col=0; //col保存最大值的列坐标,假设第i行第0列元素为最大 for(j=1;j<n;j++) if(a[row][j]>a[row][col]) col=j; //再判断a[row][col]是否是第col列中的最小值 flag=true; for(k=0;k<n;k++) if(a[k][col]<a[row][col]){ flag=false; break; //若有比a[row][col]小的,可知它不是鞍点,可结束循环 } if(flag)break; //找到1个鞍点后就不用再找了 } if(flag) System.out.println("a["+row+"]["+col+"]="+a[row][col]); else System.out.println("NO"); } } } 50. 编写排序函数(方法) 60030 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个正整数n,再输入n个整数,将它们从小到大排序后输出。要求将排序编写为一个sort()方法。 import java.util.Scanner; public class Test60030{ public static void main(String []args){ int ri, repeat; int i, n, a[]; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); a=new int[n]; for(i=0; i<n; i++) a[i]=in.nextInt(); sort(a); for(i=0; i<n; i++) System.out.print(a[i]+" "); System.out.println(); } } /*---------*/ //说明:数组作参数时,传递的是地址,形参数组和实参数组共用同一块内存, //方法sort()中对形参数组b排序,实际上就是对实参数组a排序, //所以不需要返回值。 static void sort(int b[]){ int i,j,k,temp; for(i=0;i<b.length-1;i++) { //选择法递增排序 k=i; for(j=i+1;j<b.length;j++) if(b[k]>b[j]) k=j; if(i!=k){ temp=b[i];b[i]=b[k]; b[k]=temp; } } } } 51. 编写矩阵加法和输出函数(方法) 60031 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 读入 1 个正整数 n(1≤n≤6), 再读入2个 n 阶方阵 a和b , 计算矩阵的和。 要求:(1)编写计算矩阵和的函数(方法)add()。(2)编写输出矩阵的方法prt()。 矩阵元素输出使用:System.out.print(a[i][j]+" "); import java.util.Scanner; public class Test60031{ public static void main(String []args){ int ri, repeat; int a[][],b[][],c[][],i,j,n; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); a=new int[n][n]; b=new int[n][n];c=new int[n][n]; for(i=0; i<n; i++) for(j=0;j<n;j++) a[i][j]=in.nextInt(); for(i=0; i<n; i++) for(j=0;j<n;j++) b[i][j]=in.nextInt(); add(a,b,c); prt("A矩阵",a); prt("B矩阵",b); prt("A+B矩阵",c); } } /*----加法-----*/ static void add(int x[][],int y[][],int z[][]){ for(int i=0;i<x.length;i++) { for(int j=0;j<x[i].length;j++) { z[i][j]=x[i][j]+y[i][j]; } } } /*----输出-----*/ static void prt(String s,int a[][]){ System.out.println(s); for(int i=0; i<a.length; i++){ for(int j=0;j<a[i].length;j++) System.out.print(a[i][j]+" "); System.out.println(); } } } 52. 编写函数求矩阵最大值 60032 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 读入 2 个正整数 m和n(1≤m,n≤6), 再读入1个 m×n 阶矩阵 a , 计算该矩阵元素的最大值。 要求:编写max(),返回矩阵元素的最大值。 import java.util.Scanner; public class Test60032{ public static void main(String []args){ int ri, repeat; int a[][],i,j,m,n; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ m=in.nextInt(); n=in.nextInt(); a=new int[m][n]; for(i=0; i<m; i++) for(j=0;j<n;j++) a[i][j]=in.nextInt(); System.out.println("max="+max(a)); } } /*---------*/ static int max(int b[][]){ int max=b[0][0]; 先设第一个元素是最大的 for(int i=0;i<b.length;i++) for(int j=0;j<b[i].length;j++) if(max<b[i][j]) max=b[i][j]; return max; } } 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10)并换行,然后做repeat次下列运算: 输入一行字符,统计其中单词的个数。各单词之间用空格分隔,空格数可以是多个。 说明: 1)使用c=line.charAt(i);表示从line中获得第i个字符,i从0开始。 2)line中的字符个数为:line.length() 例:括号内是说明 输入 2 Reold building room 123 Programming is fun 输出 4 3 import java.util.Scanner; public class Test40031{ public static void main(String []args ){ int ri, repeat,count, word,i; String line; char c; Scanner in=new Scanner(System.in); repeat=(in.nextLine()).charAt(0)-'0'; //输入repeat for(ri=1; ri<=repeat; ri++){ line=in.nextLine(); //输入一行字符 /*---------*/ System.out.println( count); } } } 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 输入一个整数,从高位开始逐位输出它的各位数字。 输出语句:System.out.print(digit+" "); 例:括号内是说明 输入 3 123456 -600 8 输出 1 2 3 4 5 6 6 0 0 8 import java.util.Scanner; public class Test40032{ public static void main(String []args ){ int ri, repeat; int digit; long n, temp, pow; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextLong(); /*---------*/ System.out.println(); } } } import java.util.Scanner; public class a { public static void main(String[] args) { int ri, repeat; int digit; long n, temp, pow; Scanner in = new Scanner(System.in); repeat = in.nextInt(); for (ri = 1; ri <= repeat; ri++) { n = in.nextLong(); if(n<0){ n = -n; } temp = n; digit = 0; while(temp>0){ digit++; temp /= 10; } while(digit>0){ pow = (long) Math.pow(10, digit-1); System.out.print(n/pow%10+" "); digit--; } System.out.println(); } } } 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat (0<repeat<10),做repeat次下列运算: 程序模拟简单运算器的工作:输入一个算式,遇等号"="说明输入结束,输出结果。 假设计算器只能进行加减乘除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。 例:括号内是说明 输入 2 15 + 2 / 3 = 1 + 2 * 10 - 10 / 2 = 输出 5 10 import java.util.Scanner; public class T40033{ public static void main(String args[]) { int ri, repeat; int op1, op2, res; char operator; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ op1=in.nextInt(); operator =(in.next()).charAt(0); /*---------*/ System.out.println(res); } } } import java.util.Scanner; public class a{ public static void main(String args[]) { int ri, repeat; int op1, op2, res; char operator; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ op1=in.nextInt(); operator =(in.next()).charAt(0); while(operator!='=') {op2=in.nextInt(); switch(operator){ case '+':op1+=op2;break; case '-':op1-=op2;break; case '*':op1*=op2;break; case '/':op1/=op2;break; } operator=(in.next()).charAt(0); } res=op1; System.out.println(res); } }} 输出m~n之间的所有闰年 程序填空,不要改变与输入输出有关的语句。 输入一个repeat(1<repeat<10)),做repeat次下列运算: 输入正整数m和n(1900<=m<=n<=2100),分别代表年份的起止值,输出该范围内所有的闰年。判断闰年的条件是:能被 4 整除但不能被 100 整除,或者能被 400 整除。 输出使用语句 System.out.println(year); 输入输出示例:括号内是说明 输入: 2 2000 2017 2030 2040 输出 2000 2004 2008 2012 2016 2032 2036 2040 import java.util.Scanner; public class T{ public static void main(String []args){ int year,m,n,repeat,ri; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1;ri<=repeat;ri++){ m=in.nextInt(); n=in.nextInt(); /*---------*/ } } } import java.util.Scanner; public class a{ public static void main(String []args){ int year,m,n,repeat,ri; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1;ri<=repeat;ri++){ m=in.nextInt(); n=in.nextInt(); for(year=m;year<=n;year++){ if((year%4==0&&year%100!=0)||year%400==0){ System.out.println(year); }} } } } import java.util.Scanner; public class Test30009{ public static void main(String args[]){ int repeat, ri; int a,b,c,d; double x1,x2; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri = 1; ri <= repeat; ri++) { a=in.nextInt();b=in.nextInt();c=in.nextInt(); /*---------*/ if(a==0&&b==0&&c==0) System.out.println("a=b=c=0,meaningless"); else if(a==0&&b==0&&c!=0) System.out.println("a=b=0,c!=0,error"); else if(a==0) System.out.println("x="+Math.round(-(float)c/b*100)/100.0); else //满足一元二次方程a*x*x+b*x+c=0条件 { d=b*b-4*a*c; if(d>=0)//前面三种情况排除了就是最后一种情况,所以就不用写出来了! { x1=(-b+Math.sqrt(d))/(2*a); x2=(-b-Math.sqrt(d))/(2*a); System.out.println("x1="+Math.round(x1*100)/100.0); System.out.println("x2="+Math.round(x2*100)/100.0); } else { System.out.println("x1="+Math.round((float)(-b)/(2*a)*100)/100.0+"+"+Math.round(Math.sqrt(-d)/(2*a)*100)/100.0+"i"); System.out.println("x2="+Math.round((float)(-b)/(2*a)*100)/100.0+"-"+Math.round(Math.sqrt(-d)/(2*a)*100)/100.0+"i"); } } } } } import java.util.Scanner; public class Test30010{ public static void main(String args[]){ int repeat, ri; char ch; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri = 1; ri <= repeat; ri++){ ch=(in.next()).charAt(0); /*输入1个字符*/ /*---------*/ switch(ch) { 注意。。。这里的A是要加单引号的!!! case 'A':System.out.println("90-100");break;// case 'B':System.out.println("80-89");break; case 'C':System.out.println("70-79");break; case 'D':System.out.println("60-69");break; case 'E':System.out.println("0-59");break; default:System.out.println("Invalid input"); } } } }
评论列表
文章目录