/**
* @author Xbss
* @create 2022-09-19-21:02
* @version 1.0
* @describe
*/
fun main() {
val reader = Scanner(System.`in`)
println("请输入向量维度")
val len = reader.nextLine().toInt()
println("请输入向量个数")
val size = reader.nextLine().toInt()
val array = Array(size){Array<Fraction>(len){ Fraction(0,0) }}
var row = 0
for (i in 0 until size){
val nextLine = reader.nextLine()
val value = nextLine.split(" ")
if (nextLine.isNotEmpty()){
for ((s,v) in value.withIndex()){
array[row][s]= Fraction(v.toInt(),1)
}
row++
}
}
val tArray = transpose(array)
println("开始计算")
val arrays = compute(len, tArray)
for (i in arrays.indices){
for (j in arrays[i]){
print("$j ")
}
println()
}
}
fun compute(size:Int, array:Array<Array<Fraction>>):Array<Array<Fraction>>{
val rArray = array
for (i in 0 until size){
rArray[i] = computeItem(rArray,i)
}
return rArray
}
fun computeItem(array:Array<Array<Fraction>>,size: Int):Array<Fraction>{
if (size == 0){
return array[0]
}
val len = array[0].size
var sum = Array<Fraction>(len){ Fraction(0,0) }
for (i in 0 until size){
sum += multiplyNum(Fraction(multiply(array[i],array[size]),multiply(array[i], array[i])),array[i],len)
}
return array[size]-sum
}
//operator fun DoubleArray.plus(a:DoubleArray):DoubleArray{
operator fun Array<Fraction>.plus(a:Array<Fraction>):Array<Fraction>{
val rArray = Array<Fraction>(a.size){ Fraction(0,0) }
for ((index,value ) in a.withIndex()){
rArray[index] = this[index]+value
}
return rArray
}
//operator fun DoubleArray.minus(a:DoubleArray):DoubleArray{
operator fun Array<Fraction>.minus(a:Array<Fraction>):Array<Fraction>{
val rArray = Array<Fraction>(a.size){ Fraction(0,0) }
for ((index,value ) in a.withIndex()){
rArray[index] = this[index]-value
}
return rArray
}
fun multiply(a:Array<Fraction>,b:Array<Fraction>):Fraction{
var result = Fraction(0,0)
for (i in a.indices){
result += a[i]*b[i]
}
return result
}
fun multiplyNum(b:Fraction,a:Array<Fraction>,size: Int):Array<Fraction>{
val rArray = Array<Fraction>(size){Fraction(0,0)}
for ((index,value) in a.withIndex()){
rArray[index] = value*b
}
return rArray
}
//fun transpose(array: Array<DoubleArray>):Array<DoubleArray>{
/**
* TODO :将给定的矩阵转置
*
* @param array
* @return
*/
fun transpose(array: Array<Array<Fraction>>):Array<Array<Fraction>>{
// val tArray = Array(array.size){Array<Fraction>(array.size){Fraction(1,1)}}
val tArray = Array(array[0].size){Array<Fraction>(array.size){Fraction(1,1)}}
for (i in array.indices){
for (j in 0 until array[0].size){
tArray[j][i] = array[i][j]
}
}
return tArray
}
自己写的分数类:
class Fraction() {
private var molecular=0
private var denominator=0
constructor(a:Int,b:Int):this(){
if (a!=0){
molecular = a
denominator =b
simple()
}
}
constructor(a:Fraction,b:Fraction):this(){
if (a.molecular==0||b.molecular==0){
molecular=0
denominator=0
}else{
molecular = a.molecular*b.denominator
denominator = a.denominator*b.molecular
}
if (molecular!=0)
simple()
}
operator fun plus(a:Fraction):Fraction{
return if (molecular==0)
a
else if(a.molecular==0)
this
else{
Fraction(this.molecular*a.denominator+a.molecular*this.denominator,this.denominator*a.denominator)
}
}
operator fun minus(a:Fraction):Fraction{
return if (molecular==0)
Fraction(a.molecular*-1,a.denominator)
else if (a.molecular==0)
this
else
Fraction(this.molecular*a.denominator-a.molecular*this.denominator,this.denominator*a.denominator)
}
operator fun times(a:Fraction):Fraction{
return Fraction(this.molecular*a.molecular,this.denominator*a.denominator)
}
private fun simple(){
var flag = false
if (molecular*denominator<0){
molecular = abs(molecular)
denominator = abs(denominator)
flag=true
}else if (molecular<0&&denominator<0){
molecular = abs(molecular)
denominator = abs(denominator)
}
val dividend = molecular.coerceAtMost(denominator)
for (i in dividend downTo 2){
if (molecular%i==0&&denominator%i==0){
molecular /= i
denominator /= i
}
}
if (flag)
molecular *= -1
}
override fun toString(): String {
return if (denominator==1)
molecular.toString()
else if (molecular==0)
"0"
else
"$molecular/$denominator"
}
}
运行结果: