package org.ernest.matrixText;
import java.util.Arrays;
public class CycSubtracter {
/**
* @param args
*/
public static void main(String[] args) {
double [] a1={4,5,2};
double [] a2={3,0,1};
//rc(a1,a2,a1.length-1);
rc(a1,a2);
System.out.println(Arrays.toString(a1));
System.out.println(Arrays.toString(a2));
}
/**
* 单行向量碰撞算法(递归算法)
* @param a
* @param b
* @param n
*/
public static void rc(double[] a,double[] b,int n){
if(n<0)return;
double[] s=new double[b.length];
for(int i=0;i<b.length;i++){
if(0==i){s[i]=b[i];}else{s[i]=s[i-1]+b[i];}
}
if(a[n]>s[s.length-1]){
a[n]-=s[s.length-1];
Arrays.fill(b,0.0);
return;
}else{
int p=0;
for(int i=0;i<s.length;i++){
if(a[n]<=s[i]){p=i;break;}
}
Arrays.fill(b, 0,(p-1)<0?0:p,0.0);
b[p]=s[p]-a[n];
a[n]=0.0;
rc(a,b,n-1);
}
}
/**
* 单行向量碰撞算法(循环算法)
* @param a
* @param b
*/
public static void rc(double[] a,double[] b){
for(int n=a.length-1;n>=0;n--){
double[] s=new double[b.length];
for(int i=0;i<b.length;i++){
if(0==i){s[i]=b[i];}else{s[i]=s[i-1]+b[i];}
}
if(a[n]>s[s.length-1]){
a[n]-=s[s.length-1];
Arrays.fill(b,0.0);
return;
}else{
int p=0;
for(int i=0;i<s.length;i++){
if(a[n]<=s[i]){p=i;break;}
}
Arrays.fill(b, 0,(p-1)<0?0:p,0.0);
b[p]=s[p]-a[n];
a[n]=0.0;
}
}
}
}