2-10 求一元二次方程的根
利用公式x1 = (-b + sqrt(b* b-4* a* c))/(2* a), x2 = (-b - sqrt(b* b-4* a* c))/(2* a)求一元二次方程ax^2 + bx + c =0的根,其中a不等于0。
输入格式:
第一行是待解方程的数目n。
其余n行每行含三个浮点数a, b, c(它们之间用空格隔开),分别表示方程ax^2 + bx + c =0的系数。
输出格式:
输出共有n行,每行是一个方程的根:
若是两个实根,则输出:x1=…;x2 = …
若两个实根相等,则输出:x1=x2=…
若是两个虚根,则输出:x1=实部+虚部i; x2=实部-虚部i
所有实数部分要求精确到小数点后5位,数字、符号之间没有空格。
x1和x2的顺序:x1的实部>Re的实部||(x1的实部==x2的实部&&x1的虚部>=x2的虚部)
输入样例:
3 1.0 3.0 1.0 2.0 -4.0 2.0 1.0 2.0 8.0
输出样例:
x1=-0.38197;x2=-2.61803 x1=x2=1.00000 x1=-1.00000+2.64575i;x2=-1.00000-2.64575i
import scala.io.StdIn import scala.math._ object Main { def main(args: Array[String]): Unit = { var n = StdIn.readInt(); var i = 0 while(i < n) { i += 1 var s = StdIn.readLine().split(" "); var a = s(0).toDouble; var b = s(1).toDouble; var c = s(2).toDouble; var p : Double = b * b - 4 * a * c; var x1 : Double = -b / (2 * a); if(b == 0) x1 = 0; if(p > 0) printf("x1=%.5f;x2=%.5f\n",(-b + math.sqrt(p)) / (2 * a),(-b - math.sqrt(p)) / (2 * a)); else if(p == 0) printf("x1=x2=%.5f\n",x1); else { p = -p; var y1 = math.sqrt(p) / (2 * a); var y2 = -math.sqrt(p) / (2 * a); printf("x1=%.5f%+.5fi;x2=%.5f%+.5fi\n",x1,y1,x1,y2); } } } }
2-11 循环相克令
这循环相克令是一个两人玩的小游戏。
令词为“剪刀、石头、布”,两人同时说出令词,同时做出一个动作——剪刀的动作是伸出“食指+中指”;石头的动作是“五指握紧”伸出;布的动作是“五指打开”伸出。
双方以此动作判定输赢,剪刀赢布、布赢石头、石头赢剪刀,动作相同则视为平局。
现在给定你一系列的动作组合,请你判断游戏结果。
输入格式:
第一行包含整数 T(1≤T≤100),表示共有 T 组测试数据。
接下来 T 行,每行包含两个字符串,表示一局游戏中两人做出的动作,字符串为 Scissors、Rock 、Paper中的一个,这三个单词分别代表剪刀、石头、布。
输出格式:
如果第一个玩家赢了,则输出 Player1。
如果第二个玩家赢了,则输出 Player2。
如果平局,则输出 Repetition。
输入样例:
3 Scissors Paper Rock Rock Scissors Rock
输出样例:
Player1 Repetition Player2
import scala.io.StdIn object Main { def main(args: Array[String]): Unit = { var n = StdIn.readInt() var i = 0 while(i < n) { i += 1; var k = 0; var s=StdIn.readLine().split(" ") var s1=s(0) var s2=s(1) if(s1 == "Scissors" && s2 == "Paper" || s1 == "Rock" && s2 == "Scissors" || s1 == "Paper" && s2 == "Rock") println("Player1"); else if(s1 == s2) println("Repetition") else println("Player2") } } }
2-12 精准运动
小明 正在学习建模。她对带有活动部件的模型很感兴趣。作为她的第一个任务,她制作了一个大小2×n的矩形盒子,其中包含两个平行的导轨和每个导轨上的矩形条。短条的尺寸1×a,长条的尺寸 1×b. 长杆的两端各有一个塞子,而短的总是在这两个塞子之间。
只要短杆位于挡块之间,杆就可以沿着导轨移动,一次一根杆。所以,小明在每个矩形条移动选择其中一个条并移动它,而另一个保持在原位。最初,两个条都与盒子的一侧对齐,小明希望它们以尽可能少的移动到另一侧对齐。为了实现目标,他最少需要移动多少次?
输入格式:
输入在一行中给出3个整数a、b和c(1<=a<b<=n<=10^7),其间以空格分隔。
输出格式:
对每一组输入,在一行中输出小明最少需要移动的次数。
输入样例:
1 3 6 2 4 9
输出样例:
5 7
import scala.io.StdIn object Main { def main(args: Array[String]): Unit = { while(true) { var s = StdIn.readLine().split(" "); var a = s(0).toInt; var b = s(1).toInt; var c = s(2).toInt; if(b == c) println(1); else { var k = 0; var s = b - a while(b < c || a < c) { if(b < c) { b += s; k += 1; } if(a < c) { a += s k += 1 } } println(k) } } } }
2-13 sum
本题目要求读入1个整数n,然后输出1~n之间所有整数的和。
输入格式:
输入在一行中给出1个绝对值不超过10000的整数n。
输出格式:
对每一组输入,在一行中输出1~n之间所有整数的和。
输入样例:
-3 3
输出样例:
-5 6
import scala.io.StdIn object Main { def main(args: Array[String]): Unit = { while(true) { var n = StdIn.readInt(); var sum = 0; if(n > 0) { for(i <- 1 to n) { sum += i; } println(sum); } else { for(i <- n to 1) { sum += i; } println(sum); } } } }
2-14 菱形
输入一个奇数n,输出一个由‘*’构成的n阶空心菱形。
输入格式:
一个奇数n。
输出格式:
输出一个由‘*’构成的n阶实心菱形。
具体格式参照输出样例。
输入样例:
5 • 1
输出样例:
* * * * * * * *
import scala.io.StdIn import scala.math._ object Main { def main(args: Array[String]): Unit = { var n = StdIn.readInt(); var cx = n / 2 var cy = n / 2 for(i <- 0 to n - 1) { for(j <- 0 to n - 1) { if(math.abs(i - cx) + math.abs(j - cy) == n / 2) print('*'); else print(' '); } println(); } } }
2-15 特殊数字
我们规定,对于一个整数 a,如果其各位数字相加之和能够被 4 整除,则称它是一个特殊数字。
现在,给定一个整数 n,请你计算并输出不小于 n 的最小特殊数字。
输入格式:
一个整数 n,1≤n≤1000。
输出格式:
一个整数,表示不小于 n 的最小特殊数字。
输入样例:
42
输出样例:
44
import scala.io.StdIn object Main { def main(args: Array[String]): Unit = { var n = StdIn.readLine(); var x = n.toInt; var t = 0; for(i <- x to 1004) { var nn = i.toString var sum : Int = 0; for(c <- nn) { sum += c.toInt; } if(sum % 4 == 0 && t == 0) { print(i); t = 1; } } } }
2-16 斐波那契数
给你一个整数n,求出它的斐波那契数是多少?
输入格式:
在一行中给出1个不超过30的正整数n。
输出格式:
在一行中输出斐波那契数的值。
输入样例:
5
输出样例:
1 1 2 3 5
import scala.io.StdIn object Main { def main(args: Array[String]): Unit = { var n = StdIn.readInt(); var a = 1; var b = 1; for(i <- 1 to n) { print(a + " "); var c = a + b; a = b; b = c; } } }
2-17 猴子吃桃子问题
有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第n天时,想再吃时(还没吃),发现只有1个桃子了。问题:最初共多少个桃子?
输入格式:
在一行中给出1个不超过30的正整数n。
输出格式:
在一行中输出最初的桃子个数。
输入样例:
10
输出样例:
桃子=1534
import scala.io.StdIn object Main { def main(args: Array[String]): Unit = { var n = StdIn.readInt(); var s = 1; for(i <- 1 to n - 1) s = (s + 1) * 2; print("桃子="+s); } }
三:第3章 数据结构知识
3-1 输出素数
编写一个循环,判断A~B之间有多少个素数,并输出所有素数。素数又叫质数,就是除了1和它本身之外,再也没有整数能被它整除的数。也就是素数只有两个因子。
输入格式:
输入在一行中给出2个正整数A和B(10<=a,b<=10000)。
输出格式:
输出A~B之间的所有素数,且每个素数占一行。
输入样例:
10 20
输出样例:
11 13 17 19
import scala.io.StdIn object Main { def f(n : Int): Int = // 判断素数 { if(n < 2) return 0 var i = 2; for(i <- 2 to n / i) if(n % i == 0) return 0 return 1 } def main(args: Array[String]): Unit = { while(true) { var s = StdIn.readLine().split(' '); var A = s(0).toInt; var B = s(1).toInt; for(i <- A + 1 to B) { if(f(i) != 0) println(i); } } } }
3-2 分解质因数
将一个正整数分解质因数。例如:输入90,打印出
90=2*3*3*5
输入格式:
输入在一行中给出1个正整数n(n<10e9)。
输出格式:
在一行中输出n和他的因子值,如样例所示。
输入样例:
90
输出样例:
90=2*3*3*5
import scala.io.StdIn object Main { def main(args: Array[String]): Unit = { var n = StdIn.readInt(); var f = new Array[Int](10100) var j = 2 var i = 0 var cnt = 0; print(n+"=") for(i <- 2 to n) { if(n % j == 0) { f(cnt) = j; cnt += 1; n /= j j -= 1 } j += 1 } var t = 0 for(p <- f if p != 0) { if(t != 0) print("*"); if(p != 0) print(p); t = 1 } } }
3-3 h0161. 求最大公约数和最小公倍数
输入两个正整数a和b,求其最大公约数和最小公倍数。
输入格式:
输入在一行中给出2个不超过100000的正整数A和B。
输出格式:
在2行中输出A、B的最大公约数和最小公倍数。
输入样例:
42 36
输出样例:
最大公约数为:6 最小公倍数为:252
import scala.io.StdIn object Main { def gcd(a:Int,b:Int):Int= { if(b == 0) return a; else return gcd(b,a%b); } def main(args: Array[String]): Unit = { var s = StdIn.readLine().split(' '); var a = s(0).toInt; var b = s(1).toInt; var g = gcd(a,b); println("最大公约数为:"+g); println("最小公倍数为:"+a * b / g); } }
3-4 h0162. 字符的个数
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
输入格式:
在一行中给出不超过1000个的字符。
输出格式:
分别输出英文字母、空格、数字和其它字符的个数
输入样例:
sghye356hf7456767632re;'wetet.';'wetye'tyye;'rw'wetry etew er
输出样例:
字母有 36 个 空格有 2 个 数字有 13 个 其他字符有 10 个
import scala.io.StdIn object Main { def main(args: Array[String]): Unit = { var s = StdIn.readLine(); var a = 0 var b = 0 var cc = 0 var d = 0 for(c <- s) { if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') a += 1; else if(c == ' ') b += 1; else if(c >= '0' && c <= '9') cc += 1; else d += 1; } println("字母有 "+a+" 个"); println("空格有 "+b+" 个"); println("数字有 "+cc+" 个"); println("其他字符有 "+d+" 个"); } }
四:面向对象编程
4-1 设计一个矩形类Rectangle
设计一个名为Rectangle的类表示矩形。这个类包括:
两个名为width和height的double类型数据域,它们分别表示矩形的宽和高。width和height的默认值都为1。
一个用于创建默认矩形的无参构造方法。
一个创建指定width和height值的矩形的构造方法。
一个名为getArea()的方法,返回该矩形的面积。
一个名为getPerimeter()的方法,返回周长。
编写一个测试程序,分别输入两个矩形的高和宽,创建两个Rectangle对象。按照顺序显示每个矩形的宽、高、面积和周长。
输入格式:
在一行内输入4个数据,依次为两个矩形的高和宽
输出格式:
每行输出一个矩形的宽、高、面积和周长,中间用空格隔开
输入样例:
在这里给出一组输入。例如:
4 40 3.5 35.9
输出样例:
在这里给出相应的输出。例如:
4.0 40.0 160.0 88.0 3.5 35.9 125.64999999999999 78.8
import scala.io.StdIn class Rectangle(x : Double,y : Double) { var a = x var b = y print(a) print(" " + b); def getArea(a : Double,b : Double) { var area = a * b print(" " + area) } def getPerimeter(a : Double,b : Double) { var C = (a + b) * 2 println(" " + C) } } object Main { def main(args: Array[String]): Unit = { var s = StdIn.readLine().split(' '); var a = s(0).toDouble; var b = s(1).toDouble; var c = s(2).toDouble; var d = s(3).toDouble; var rest1 = new Rectangle(a,b); rest1.getArea(a,b); rest1.getPerimeter(a,b); var rest2 = new Rectangle(c,d); rest2.getArea(c,d); rest2.getPerimeter(c,d); } }
4-2 定义一个类表示圆(Circle)
定义一个类表示圆(Circle),成员变量r表示圆的半径,成员方法printArea( )用于输出圆的面积。
定义测试类Main,在它的main方法中定义两个Circle类的对象c1、c2,从键盘输入两个数据分别作为c1和c2的半径,并分别调用它们的printArea( )方法输出其面积。
(提示:使用Math.PI表示圆周率,使用Scanner类进行输入,使用printf函数保留小数点后两位。)
输入格式:
输入两个数据分别作为圆c1和c2的半径,中间以空格隔开。
输出格式:
按两行分别输出圆c1和c2的面积,保留小数点后两位。
输入样例:
在这里给出一组输入。例如:
3 7.2
输出样例:
在这里给出相应的输出。例如:
28.27 162.86
import scala.io.StdIn class Circle(x : Double) { var r = x; def getArea(r : Double) { printf("%.2f\n",Math.PI * r * r) } } object Main { def main(args: Array[String]): Unit = { var s = StdIn.readLine().split(" "); var r1 = s(0).toDouble; var r2 = s(1).toDouble; var cir1 = new Circle(r1); cir1.getArea(r1); var cir2 = new Circle(r2); cir2.getArea(r2); } }