用安卓实现斐波那契数和最近点对问题
Posted 舞动的心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用安卓实现斐波那契数和最近点对问题相关的知识,希望对你有一定的参考价值。
目录
1 运行效果展示
2 具体编码
2.1 斐波那契数问题
具体问题即解决方案请参考本人另一篇博客:算法笔记_001:斐波那契数的多种解法
功能界面布局main_one.xml文件对应界面图:
其源码:
<?xml version="1.0" encoding="utf-8" ?> <GridLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:rowCount="14" android:columnCount="3" android:id="@+id/root"> <!-- 定义一个横跨4列的文本框, 并设置该文本框的前景色、背景色等属性 --> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" android:lines="8"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="false" android:marqueeRepeatLimit="marquee_forever" android:ellipsize="marquee" android:scrollHorizontally="true" android:layout_columnSpan="3" android:textSize="25sp" android:layout_marginLeft="2pt" android:layout_marginRight="2pt" android:padding="3pt" android:layout_gravity="right" android:background="#eee" android:textColor="#000" android:text="0" android:id="@+id/show_result" /> </ScrollView> <!-- 定义一个横跨4列的按钮 --> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_columnSpan="3" android:lines="2" android:hint="请输入相应数字" android:selectAllOnFocus="true" android:id="@+id/number" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_columnSpan="3" android:textSize="32sp" android:text="清除" android:background="@android:color/holo_blue_light" android:backgroundTint="#ed5454" android:id="@+id/clean" android:onClick="one_clean"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_columnSpan="3" android:textSize="32sp" android:text="实验一题目介绍" android:background="@android:color/holo_blue_light" android:id="@+id/introduce" android:onClick="one_indrouce"/> <LinearLayout android:id="@+id/linearLayout4" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingTop="5dip" > <LinearLayout android:id="@+id/linearLayout2" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingTop="5dip" > <Button android:id="@+id/button_one" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:text="功能1" android:textSize="32sp" android:onClick="function_one"/> <Button android:id="@+id/button_three" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:text="功能3" android:textSize="32sp" android:onClick="function_three"/> </LinearLayout> <LinearLayout android:id="@+id/linearLayout3" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingTop="5dip" > <Button android:id="@+id/button_four" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:text="功能4" android:textSize="32sp" android:onClick="function_four"/> <Button android:id="@+id/button_five" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:text="功能5" android:textSize="32sp" android:onClick="function_five"/> <Button android:id="@+id/button_two" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="功能2" android:textSize="32sp" android:onClick="function_two"/> <Button android:id="@+id/button_six" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:text="功能6" android:textSize="32sp" android:onClick="function_six"/> </LinearLayout> </LinearLayout> </GridLayout>
main_one.xml文件对应MainActivity.java文件源码:
package com.liu.zhen.algorithm; import android.app.Activity; import android.content.Intent; import android.graphics.Color; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.GridLayout; import android.widget.TextView; public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_one); } //用迭代法寻找编程环境支持的最大整数(int型)的斐波那契数是第几个斐波那契数 public static int max_int_iteration(){ int a = 1,b = 1,c = 2; int count = 3; for( ;b < c; ){ //一旦c达到编程环境最大斐波那契数,便会产生内存溢出,从而变成一个负数,到此循环结束 a = b; b = c; c = a + b; count++; } return count; } //用迭代法寻找编程环境支持的最大整数(long型)的斐波那契数是第几个斐波那契数 public static long max_long_iteration() { long a = 1, b = 1, c = 2; long count = 3; for (; b < c; ) { //一旦c达到编程环境最大斐波那契数,便会产生内存溢出,从而变成一个负数,到此循环结束 a = b; b = c; c = a + b; count++; } return count; } //递归法 public static int recursion(int n){ int result = 0; //最后一个斐波那契数及存储中间斐波那契数的变量 if(n <= 0) result = 0; if(n == 1 || n == 2) result = 1; if(n > 2) { result = recursion(n-1) + recursion(n-2); //System.out.print(result+" "); } return result; } //规定时间内,递归法计算出的最大斐波那契数是第几个 public static int recursion_time(long time){ long starttime_dg=System.currentTimeMillis(); int i=3; long endtime_dg=0; while(endtime_dg<starttime_dg+time*1000){ endtime_dg=System.currentTimeMillis(); i++; recursion(i); } return i; } //迭代方法对斐波那契数列求解 public static int iteration(int n){ int a[]=new int[n+1]; a[0]=0;a[1]=1;int result=0; if(n==1) return 1; for(int i=2;i<n+1;i++){ a[i]=a[i-1]+a[i-2]; result=a[n]; } return result; } //规定时间内,迭代法计算出的最大斐波那契数是第几个 public static int iteration_time(long time){ long starttime_dg=System.currentTimeMillis(); int i=3; long endtime_dg=0; while(endtime_dg<starttime_dg+time*1000){ endtime_dg=System.currentTimeMillis(); i++; iteration(i); } return i; } //直接求值法(利用公式F(n) = [@n/sqrt(5)]快速计算第n个斐波那契数) public static double formula(int n){ double result = 0; double temp = Math.sqrt(5.0); result = (1/temp)*(Math.pow((1+temp)/2,n)-Math.pow((1-temp)/2, n)); return result; } //利用直接求值法,出现误差时最小的n值 public static int min_formula(){ double result_fn=1; int i=1; while(result_fn-(double)iteration(i)<1){ result_fn=formula(i); i++; } return i; } // 关联矩阵 private static final int[][] UNIT = { { 1, 1 }, { 1, 0 } }; // 全0矩阵 private static final int[][] ZERO = { { 0, 0 }, { 0, 0 } }; /** * 求斐波那契数列 * * @param n * @return */ public static int[][] fb(int n) { if (n == 0) { return ZERO; } if (n == 1) { return UNIT; } // n是奇数 if ((n & 1) == 0) { int[][] matrix = fb(n >> 1); return matrixMultiply(matrix, matrix); } // n是偶数 int[][] matrix = fb((n - 1) >> 1); return matrixMultiply(matrixMultiply(matrix, matrix), UNIT); } /** * 矩阵相乘 * * @param m * r1*c1 * @param n * c1*c2 * @return 新矩阵,r1*c2 */ public static int[][] matrixMultiply(int[][] m, int[][] n) { int rows = m.length; int cols = n[0].length; int[][] r = new int[rows][cols]; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { r[i][j] = 0; for (int k = 0; k < m[i].length; k++) { r[i][j] += m[i][k] * n[k][j]; } } } return r; } //具体实现矩阵相乘算法 public static int matrix(int n){ int[][] m = fb(n); return m[0][1]; } //清除 public void one_clean(View v) { String clean_text = "0"; TextView show_text = (TextView) findViewById(R.id.show_result); show_text.setText(clean_text); } //题目介绍 public void one_indrouce(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this,MainOneActivity.class); startActivity(intent); } //功能1 public void function_one(View v) { int a = max_int_iteration(); long b = max_long_iteration(); String function_one = "迭代法编程环境支持的最大整数(int型)值:" + a + "\\n" + "迭代法编程环境支持的" + "最大整数(long型)值:" + b; TextView show_text = (TextView) findViewById(R.id.show_result); show_text.setText(function_one); } //功能2 public void function_two(View v){ TextView show_text = (TextView) findViewById(R.id.show_result); String wait_two = "请耐心等待......"; show_text.setText(wait_two); int a = 40; long starttime_dg=System.currentTimeMillis(); recursion(a); long endtime_dg=System.currentTimeMillis(); double time = (endtime_dg - starttime_dg)/1000.0; String time_two = "递归方式计算第"+a+"个斐波那契数(int型)耗时:"+time+"秒"; show_text.setText(time_two); // EditText edit_text = (EditText) findViewById(R.id.number); // show_text.setText(time_two); } //功能3 public void function_three(View v){ EditText edit_text = (EditText) findViewById(R.id.number); int t = Integer.parseInt(edit_text.getText().toString()); int a = recursion_time(t); int b = iteration_time(t); String three_function = "递归法在"+t+"秒内计算出的最大斐波那契数是第"+a+"个"+"\\n"+"迭代法在"+t+"秒内" + "计算出的最大斐波那契数是第"+b+"个"; TextView show_text = (TextView) findViewById(R.id.show_result); show_text.setText(three_function); } //功能4 public void function_four(View v){ int a = min_formula(); String four_function = "利用直接求值法,出现误差时最小的n值是:"+a; TextView show_text = (TextView) findViewById(R.id.show_result); show_text.setText(four_function); } //功能5 public void function_five(View v){ EditText edit_text = (EditText) findViewById(R.id.number); int t = Integer.parseInt(edit_text.getText().toString()); int a = matrix(t); String five_function = "利用矩阵相乘法计算第"+t+"个斐波那契数的值是:"+a; TextView show_text = (TextView) findViewById(R.id.show_result); show_text.setText(five_function); } //功能6 public void function_six(View v){ EditText edit_text = (EditText) findViewById(R.id.number); int t = Integer.parseInt(edit_text.getText().toString()); //迭代法计算耗时 long starttime_iteration=System.currentTimeMillis(); int a1 = iteration(t); long endtime_iteration=System.currentTimeMillis(); double time_iteration = (endtime_iteration-starttime_iteration)/1000.0; // long time_iteration = six_time_iteration(t); String b1 = "迭代法计算第"+t+"个斐波那契数耗时:"+time_iteration+"秒 计算结果是:"+a1; //递归法计算耗时 long starttime_recursion=System.currentTimeMillis(); int a2 = recursion(t); long endtime_recursion=System.currentTimeMillis(); double time_recursion = (endtime_recursion-starttime_recursion)/1000.0; String b2 = "递归法计算第"+t+"个斐波那契数耗时:"+time_recursion+"秒 计算结果是:"+a2; //公式法计算耗时 long starttime_formula=System.currentTimeMillis(); double a3 = formula(t); long endtime_formula=System.currentTimeMillis(); double time_formula = (endtime_formula-starttime_formula)/1000.0; String b3 = "公式法计算第"+t+"个斐波那契数耗时:"+time_formula+"秒 计算结果是:"+(int)a3; //矩阵相乘法计算耗时 long starttime_matrix=System.currentTimeMillis(); int a4 = matrix(t); long endtime_matrix=System.currentTimeMillis(); double time_matrix = (endtime_matrix-starttime_matrix)/1000.0; String b4 = "矩阵相乘法计算第"+t+"个斐波那契数耗时:"+time_matrix+"秒 计算结果是:"+a4; String six_function = b1+"\\n"+b2+"\\n"+b3+"\\n"+b4; TextView show_text = (TextView) findViewById(R.id.show_result); show_text.setText(six_function); } }
2.2 最近点对问题
具体问题即解决方案请参考本人另一篇博客:算法笔记_002:最近点对问题
功能界面布局activity_maintwo.xml文件对应界面图:
其源码:
<?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:rowCount="17" android:columnCount="3" android:id="@+id/root"> <!-- 定义一个横跨11列的文本框, 并设置该文本框的前景色、背景色等属性 --> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="false" android:marqueeRepeatLimit="marquee_forever" android:ellipsize="marquee" android:scrollHorizontally="true" android:layout_columnSpan="3" android:lines="13" android:textSize="20sp" android:layout_marginLeft="2pt" android:layout_marginRight="2pt" android:padding="3pt" android:layout_gravity="right" android:background="#eee" android:textColor="#000" android:text="实验二题目及功能介绍:\\n 给定某空间中(直线空间或平面空间)n个点,请找出它们中的最近点对。\\n(1)功能1:在输入框中输入一个数字x(最好在5—20之间),系统会随机生成x个直线上的点坐标(0—1000之间的随机数),并输出最近点对坐标和最短距离;\\n(2)功能2:和功能1实现结果一致,不过是基于平面中的点(0-50之间的随机数)。" android:id="@+id/show_two" /> <!-- 定义一个横跨2列的输入文本框 --> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_columnSpan="3" android:lines="2" android:hint="请输入相应数字" android:selectAllOnFocus="true" android:id="@+id/number_two" /> <!-- 定义一个两个功能键按钮 --> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_columnSpan="3" android:textSize="32sp" android:text="功能1(直线空间)" android:background="@android:color/holo_blue_light" android:backgroundTint="#5484ed" android:id="@+id/function_line" android:onClick="function_line"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_columnSpan="3" android:textSize="32sp" android:text="功能2(平面空间)" android:background="@android:color/holo_blue_light" android:id="@+id/function_space" android:onClick="function_space" android:backgroundTint="@android:color/holo_orange_light" /> </GridLayout>
activity_maintwo.xml对应Main2Activity.java文件源码:
package com.liu.zhen.algorithm; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; public class Main2Activity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maintwo); } //初始化一个随机数组 public static int[] initializationArray(int n){ int[] result = new int[n]; for(int i = 0;i < n;i++) result[i] = (int)(Math.random()*1000); //采用随机函数随机生成0~1000之间的数 return result; } //返回数组中最大值 public static int getArrayMax(int a[] , int first , int end){ int max = a[first]; for(int i = first;i < end;i++){ if(max < a[i]) max = a[i]; } return max; } //返回数组中最小值 public static int getArrayMin(int a[] , int first , int end){ int min = a[first]; for(int i = first;i < end;i++){ if(min > a[i]) min = a[i]; } return min; } //交换数组a[n]中两个数的值 public static void swapArray(int a[] , int i , int j)以上是关于用安卓实现斐波那契数和最近点对问题的主要内容,如果未能解决你的问题,请参考以下文章