java一些經典演算法題
寫在開頭:幾道java演算法題,自己的思路,不對的地方望指正。用的都是最基本的方法,一起加油
·1 *求1!+2!+3!.....+30!的和 並用方法。
int a=1,b=30;qiuhe(a, b);*/
public class d501 {
public static void main(String[] args) {
qiuhe(1,30);
}
public static void qiuhe(int a,int b){
long sum = 0;
for(int i =a;i<=b;i++)
sum += jieCheng(i);
System.out.println(a+"--"+b+"的階乘和為:"+sum);
}
public static int jieCheng(int c){
int jiecheng = 1;
for(int i = 1;i<=c;i++)
jiecheng *=i;
return jiecheng;
}
}
2 輸入兩個正整數m和n,求其最大公約數和最小公倍數。
public class d502 {
public static void main(String[] args) {
qiu(8,4);
}
public static void qiu(int a,int b )
{//輾轉相除法求最大公約數
int gy;
int gb;
if(a>b)
gy = gongYueShu(a,b);
else
gy = gongYueShu(b,a);
gb = a*b/gy;
System.out.println("最大公約數:"+gy);
System.out.println("最小公倍數:"+gb);
}
public static int gongYueShu(int a,int b){
while(b!=0){
a =a%b;
if(a == 0)
return b;
else
b = b%a;
}
return a;
}}
3.一個數如果恰好等於它的因子之和,這個數就稱為 "完數 "。例如6=1+2+3.程式設計找出1000以內的所有完數
public class d503 {
public static void main(String[] args) {
wanShu();
}
public static void wanShu()
{
for(int i = 1;i<1000;i++){
int sum = 0;
for(int j =1;j<i;j++){
if(i%j==0){
sum +=j;
}
}
if(sum ==i )
System.out.print(sum+" ");
}}}
4 一球從100米高度自由落下,每次落地後反跳回原高度的一半;再落下,求它在第10次落地時,共經過多少米?第10次反彈多高?
public class d504 {
public static void main(String[] args) {
luoDi(100,8);
}
public static void luoDi(int heigh,int c){
int sum = 0;
for(int i = 1;i<=c;i++){
{
sum +=heigh;
heigh = heigh/2;
}
}
System.out.println("第"+c+"次落地共經過"+sum+"米");
System.out.println("第"+c+"反彈"+heigh+"米");
}
}
5/*題目:猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個
第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以後每天早上都吃了前一天剩下的一半零一個。
到第10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。*/
public class d506 {
public static void main(String[] args) {
qiu(10);
}
public static void qiu(int day)
{int i ;
int[] arr = new int[10];
arr[9] = 1;
for(i =8;i>=0;i--){
arr[i] = arr[i+1]*2+1;
}
System.out.println(arr[0]);
}
}
6/*打印出如下圖案(菱形)
*
***
******
********
******
***
**/
public class d507 {
public static void main(String[] args) {
print();
}
public static void print()
{
for(int i =1;i<=4;i++){
if(i<=2){
for(int j = 0;j<2*i-1;j++){
System.out.print("*");
}
System.out.println();
}else{
for(int j = 0;j<2*i;j++){
System.out.print("*");
}
System.out.println();
}
}
for(int i = 1 ;i<=3;i++){
if(i==1){
for(int j = 0;j<8-2*i;j++){
System.out.print("*");
}
System.out.println();
}else{
for(int j = 0;j<7-2*i;j++){
System.out.print("*");
}
System.out.println();
}
}
}}
7//有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的前20項之和。
public class d508 {
public static void main(String[] args) {
qiuhe();
}
public static void qiuhe(){
float sum = 0f;
float fz = 2f;
float fm = 1f;
float temp ;
for(int i = 0;i<20;i++){
sum += fz/fm;
temp = fz;
fz = fz+fm;
fm = temp;
}
System.out.println(sum);
}
}
8 //利用遞迴方法求5!。
public class d509 {
public static void main(String[] args) {
System.out.println(diGui(5));
}
public static int diGui(int num)
{int jc;
if(num==0)
return 1;
else
jc = num*diGui(num-1);
return jc;
}
9//給一個不多於5位的正整數,要求:一、求它是幾位數,二、逆序打印出各位數字。
public class d511 {
public static void main(String[] args) {
get(10222);
}
public static void get(int num)
{int[] arr = new int[5];
int i = 0;
if(num>99999)
System.out.println("數字太大");
while(num!=0){
arr[i]= num%10;
num = num/10;
i++;
}
System.out.println(i+"位數字");
for(int j = 0;j<=i-1;j++)
System.out.print(arr[j]+" ");
}
}
10//一個5位數,判斷它是不是迴文數。即12321是迴文數,個位與萬位相同,十位與千位相同。
public class d512 {
public static void main(String[] args) {
isHui(32321);
}
public static void isHui(int num){
int[] arr = new int[5];
int i = 0;
while(num!=0){
arr[i] = num%10;
num /=10;
i++;
}
if(arr[0]==arr[4] && arr[1]==arr[3]){
System.out.println("是迴文數");
}else{
System.out.println("不是迴文數");
}
}
}
11//求一個3*3矩陣對角線元素之和
/*1 2 3 00 01 02
4 5 6 10 11 12
7 8 9 */ // 20 21 22
import java.util.*;
public class d513 {
public static void main(String[] args) {
qiu();
}
public static void qiu(){
int sum = 0;
int k = 1;
int[][] arr = new int[3][3];
Scanner sc = new Scanner(System.in);
System.out.println("請輸入9個數組成一個3*3矩陣");
for(int i = 0;i<3;i++){
for(int j = 0;j<3;j++){
System.out.println("請輸入第"+(k++)+"個數:");
arr[i][j] = sc.nextInt();
if(i == j)
sum +=arr[i][j];
if(Math.abs(i-j)==2)
sum +=arr[i][j];
}
}
System.out.println(sum);
}
}
12//將一個數組逆序輸出。
public class d514 {
public static void main(String[] args) {
int[] arr = {1,2,34,5,6,7,8,9};
print(arr);
}
public static void print(int[] arr){
for(int i = arr.length-1;i>=0;i--)
System.out.print(arr[i]+" ");
}
}
13 //輸入陣列,最大的與第一個元素交換,最小的與最後一個元素交換,輸出陣列。
public class d516 {
public static void main(String[] args) {
int[] arr = {5,4,3,4,10,1,7,8,9,5};
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i]+" ");}//先遍歷一遍
System.out.println();
qiu(arr);
}
public static void qiu(int[] arr){
huanMax(arr);
huanMin(arr);
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");//交換完成,遍歷
}
}
public static void huanMax(int[] arr){
int max = arr[0];
int j = 0;
for(int i =0;i<arr.length;i++){
if(arr[i]>max){
max = arr[i];//得到最大值
}
for( j = 0;j<arr.length;j++){
if(max==arr[j])
break;//得到最大值對應的索引
}
}
int c = arr[j];
arr[j] = arr[0];
arr[0] = c;
//交換
}
public static void huanMin(int[] arr){
int min = arr[0];
int j = 0;
for(int i = 0;i<arr.length;i++){
if(arr[i]<min){
min = arr[i];//求最小值
}
}
for( j = 0;j<arr.length;j++){
if(min==arr[j])
break;//得到最小值的索引
}
int c= arr[j];
arr[j] = arr[arr.length-1];
arr[arr.length-1] = c;//交換
}
}
14 //編寫一個函式,輸入n為偶數時,呼叫函式求1/2+1/4+...+1/n,
//當輸入n為奇數時,呼叫函式1/1+1/3+...+1/n
public class d517 {
public static void main(String[] args) {
sum1(13);
}
public static void sum1(int n){
if(n%2==0){
double he = 0;
int fm;
for(fm=2;fm<=n;fm +=2){
he +=1/(double)fm;//fm是int 不轉換成double的話結果是0
}
System.out.println("he:"+he);
}
else
{
double he = 0;
int fm = 1;
for(;fm<=n;fm+=2){
he +=1/(double)fm;
}
System.out.println("he:"+he);
}
}}
15有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第四個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?
規律,1,2,3,5,8,13,21....
public class d5019 {
public static void main(String[] args) {
for(int i = 1; i<100;i++)
System.out.print(getNumber(i)+" ");
}
public static int getNumber(int mouth){
if(mouth==1 || mouth==2)// ||
return 1;
else
return getNumber(mouth-1)+getNumber(mouth-2);//遞迴
/*mouth = 5;
getNumber(4)+getNumber(3);
mouth = 4;
getNumber(3)+getNumber(2);
mouth = 3;
getNumber(2)+getNumber(1);
mouth = 2;
return 1;
*/
}
}
16 /*2.列印一個實心菱形圖案
*
***
*****
*******
*****
***
* */
public class day01_02 {
public static void main(String[] args) {
for(int i = 1;i <= 4 ; i++){
for(int j = 1; j<=4-i; j++){
System.out.print(" ");
}
for(int j = 1;j<=2*i-1;j++){
System.out.print("*");
}
System.out.println();
}
for(int i = 1;i<=3;i++){
for(int j =1;j<=i;j++){
System.out.print(" ");
}
for(int j=1;j<=7-2*i;j++){
System.out.print("*");
}
System.out.println();
}
}
}
17 /*3.列印一個空心菱形圖案
問題:用*號列印一個如下的空心菱形圖案 :
*
* *
* *
* *
* *
* *
* */
public class day01_03 {
public static void main(String[] args) {
for(int i = 1;i<=4;i++){
for(int j = 1;j<=4-i;j++)
System.out.print(" ");
for(int j = 1;j<=2*i-1;j++){
if(j==1||j==2*i-1)
System.out.print("*");
else
System.out.print(" ");
}
System.out.println();
}
for(int i = 1;i<=3;i++){
for(int j = 1;j<=i;j++)
System.out.print(" ");
for(int j = 1;j<=7-2*i;j++){
if(j==1||j==7-2*i)
System.out.print("*");
else
System.out.print(" ");
}
System.out.println();
}
}
}
相關推薦
java一些經典演算法題
寫在開頭:幾道java演算法題,自己的思路,不對的地方望指正。用的都是最基本的方法,一起加油 ·1 *求1!+2!+3!.....+30!的和 並用方法。 int a=1,b=30;qiuhe(a, b);*/ public class d501 {public sta
JAVA之——經典演算法50題
/******************************************************************************** @author liuyazhuang <[email protected]>******
【演算法】計算機圖形學的一些經典小題:判斷點在多邊形內,隨機生成三角形內的點,判斷兩個矩形是否相交等
前幾天面試的時候被問到了,如何隨機在三角形內生成點,我按照我的想法回答了一遍,但覺得回答的不夠好。最後面試官說了一個最優的方法。覺得不錯,順帶總結一下最近看到的一些關於計算機圖形學方面的經典小題,知乎上看到的還有Leetcode上的 1.判斷一個點
JAVA之——經典演算法50題(題意修訂版)
/******************************************************************************** @author liuyazhuang <[email protected]>******
PHP經典演算法題
1.百錢買百雞 公雞5文錢一隻,母雞3文錢一隻,小雞3只一文錢,用100文錢買一百隻雞,其中公雞,母雞,小雞都必須要有,問公雞,母雞,小雞要買多少隻剛好湊足100文錢。 分析:估計現在小學生都能手工推算這套題,只不過我們用計算機來推算,我們可以設公雞為x,母雞為y,小雞為z,那麼我們可以得出如
面試經典演算法題集錦——《劍指 offer》小結
從今年 3 月份開始準備找實習,到現在校招結束,申請的工作均為機器學習/資料探勘演算法相關職位,也拿到了幾個 sp offer。經歷這半年的洗禮,自己的綜合能力和素質都得到了一個質的提升。 實話說對於未來去哪裡,即將如何發展還沒有清晰的規劃。迷茫總是會有的,但這並不是停止腳步的理由。找工作是在漫
經典演算法題1:找出陣列中只出現一次的數字,其它數字都出現了兩次
題目:一個整型數組裡除了一個數字之外,其它的數字都出現了兩次。請寫程式找出這個只出現一次的數字。要求時間複雜度是O(n),空間複雜度是O(1)。 分析:由於題目要求時間複雜度為O(n),所以先排序然後比較相鄰數字是否相同的思路被排除。 空間複雜度是O
經典演算法題——第六題 協同推薦SlopeOne 演算法
相信大家對如下的Category都很熟悉,很多網站都有類似如下的功能,“商品推薦”,"猜你喜歡“,在實體店中我們有導購來為我們服務,在網路上 我們需要同樣的一種替代物,如果簡簡單單的在資料庫裡面去撈,去比較,幾乎是完成不了的,這時我們就需要一種協同推薦演算法,來高效的推
經典演算法題之Happy Number
問題描述: Write an algorithm to determine if a number is "happy". A happy number is a number defined by the following process: Starting w
經典演算法題:大資料處理常見演算法題
第一部分、十道海量資料處理 1、海量日誌資料,提取出某日訪問百度次數最多的那個IP。 此題,在我之前的一篇文章演算法裡頭有所提到,當時給出的方案是:IP的數目還是有限的,最多2^32個,所以可以考慮使用hash將ip直接存入記憶體,然後進行統計。 再詳細介紹下此方案:
關於資料降維的一些經典演算法
資料降維 0 前言 降維方法可分為有監督降維方法、半監督降維方法、無監督降維方法。 有監督的降維方法有:線性判別式分析(Linear discriminant analysis, LDA);
經典演算法題:無序整數陣列中找第k大的數
經典問題:寫一段程式,找出陣列中第k大的數,輸出數所在的位置。 【解法一】先排序,然後輸出第k個位置上的數 我們先假設元素的數量不大,例如在幾千個左右,在這種情況下,那我們就排序一下吧。在這裡,快速排序或堆排序都是不錯的選擇,他們的平均時間複雜度 都是 O(N * logN
經典演算法題:數字三角形尋找最大路徑
題目:數字三角形,從頂部出發,在每一結點可以選擇向左走或得向右走,一直走到底層,要求找出一條路徑,該路徑上的數字和最大,輸出這個最大值。(1)樣例輸入:第一行是數塔層數N(1<=N<=100)。第二行起,從一個數字按數塔圖形依次遞增,共有N層。51311 812
Python的100道經典演算法題(1)
按照c語言的100道經典演算法題,自己原創寫的,就得是自己的練習題了 【程式1】 題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少? 程式分析:可填在百位、十位、個
java實現經典演算法
氣泡排序 /** *氣泡排序 *比較相鄰的兩個元素,如果第一個比第二個大則將兩個交換順序 *i<numbers.length 控制排序輪數 一般為陣列長度減1次,因為最後一次迴圈只剩下一個數組元素,不需要對比,同時陣列已經完成排序了 *j<nu
一些經典演算法的js實現方案
題目描述 在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 function Find(target,array){ //程式碼
Codility經典演算法題之九:MissingInteger
Task description:This is a demo task.Write a function:class Solution { public int solution(int[] A); }that, given an array A of N integers
連結串列經典演算法題實現
本文包含連結串列的以下內容: 1、單鏈表的建立和遍歷 2、求單鏈表中節點的個數 3、查詢單鏈表中的倒數第k個結點(劍指offer,題15) 4、查詢單鏈表中的中間結點 5、合併兩個有序的單鏈表,合併之後的連結串列依然有序【出現頻率高】(劍指o
經典演算法題15-稀疏矩陣及三元組
一. 引入 我們知道矩陣是一個非常強大的資料結構,在動態規劃以及各種圖論演算法上都有廣泛的應用。 當然矩陣有著不足的地方就是空間和時間複雜度都維持在N²上,比如1w個數字建立一個矩陣,在記憶體中會佔用1w*1w=1億的型別空間,這時就會遇到outofmemo
關於樹的經典演算法題
package BinaryTreeSummary; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.u