产生和Excel一样的整型等差数列。

工作中遇到要在Excel中生成一个burning down chart,需要产生整型的等差数列作为工作完成的百分比,但是,如16列(100除以16,不能整除)怎么生成一个等差数列呢(100- 0)?这个算法我在网上找不到啊。其实Excel能生成,但是看不到怎么生成的。于是自己编了一个。(如果大家找到,请告诉我)

下载地址:点击打开链接 http://download.csdn.net/detail/xuanyuanlei1020/8431841

欢迎下载!!!!(给我点分吧,都快不够使得啦)。如果嫌麻烦,下面可以复制粘贴!!

import java.util.ArrayList;
import java.util.Collections;

public class ArithmeticSequence
{
	public static void main(String[] args)
	{
		/**
		 * 100 50 0 则columnNum = 2;
		 */
		int columnNum = 16;
		ArrayList<Integer> arithmeticSequenceArr = getArithmeticSequence(columnNum);
		for (int i = 0; i <= columnNum; i++)
		{
			System.out.println("line:" + (i + 1) + " "
					+ arithmeticSequenceArr.get(i));
			if(i == columnNum) continue;
		}
	}

	private static ArrayList<Integer> getArithmeticSequence(int columnNum)
	{
		ArrayList<Integer> arr = new ArrayList<Integer>();
		int remain = 100;
		int quotient = 100 / columnNum;
		int remainder = 100 % columnNum;

		System.out.println("quotient=" + quotient + " remainder=" + remainder);

		ArrayList<Integer> subtracterArr = new ArrayList<Integer>();
		ArrayList<Integer> subtracterArrS = new ArrayList<Integer>();//small
		ArrayList<Integer> subtracterArrB = new ArrayList<Integer>();//big
		/**
		 *  得到等差数列
		 */
		for (int i = 0; i <= columnNum; i++)
		{
			arr.add(remain);
			if(i == columnNum) continue;
			remain -= remain / (columnNum - i);
		}
		System.out.println("arr.size()="+arr.size());
		if(remainder != 0)
		{
			ArrayList<Integer> arr2 = new ArrayList<Integer>();
			/**
			 * 得到每一个减数,但是没有想到办法去将少的减数按一定规律去插到多的减数中去。
			 */
			for (int i = 0; i < columnNum; i++)
			{
				int subtracter = arr.get(i) - arr.get(i + 1);
				System.out.println(i+1+" "+subtracter);
				subtracterArr.add(subtracter);
			}
			/**
			 * 
			 */
			int index = subtracterArr.indexOf(subtracterArr.get(0) + 1);
			System.out.println("index:" + index);
			/**
			 * small one
			 */
			for (int i = 0; i < index; i++)
			{
				subtracterArrS.add(subtracterArr.get(i));
			}
			/**
			 * big one
			 */
			for (int i = index; i < subtracterArr.size(); i++)
			{
				subtracterArrB.add(subtracterArr.get(i));
			}
			System.out.println("small arr size:"+subtracterArrS.size()+
					"big arr size:"+subtracterArrB.size());
			int times = 0;
			/**
			 * the small subtracters is more than the big subtracters.
			 */
			if(index > columnNum / 2)
			{
				times = index / (columnNum - index);
				System.out.println("small times:"+times);
				int small = subtracterArrS.get(0);
				int big = subtracterArrB.get(0);
				while(!subtracterArrS.isEmpty() || !subtracterArrB.isEmpty())
				{
					if(!subtracterArrB.isEmpty())
					{
						arr2.add(big);
						subtracterArrB.remove(0);
					}
					for (int j = 0; j < times; j++)
					{
						if(!subtracterArrS.isEmpty())
						{
							arr2.add(small);
							subtracterArrS.remove(0);
						}
					}
				}
			}
			else
			{
				times = (columnNum - index) / index;
				System.out.println("big times:"+times);
				int small = subtracterArrS.get(0);
				int big = subtracterArrB.get(0);
				while (!subtracterArrS.isEmpty() || !subtracterArrB.isEmpty())
				{
					for (int j = 0; j < times; j++)
					{
						if(!subtracterArrB.isEmpty())
						{
							arr2.add(big);
							subtracterArrB.remove(0);
						}
					}
					if(!subtracterArrS.isEmpty())
					{
						arr2.add(small);
						subtracterArrS.remove(0);
					}
				}
			}

			remain = 100;
			arr.set(0, remain);
			for (int i = 0; i < arr2.size(); i++)
			{
				System.out.println("arr2:"+arr2.get(i));
				remain -= arr2.get(i);
				arr.set(i + 1, remain);
			}
		}
		return arr;
	}
}

好吧,就这么多。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值