1. 蟲蝕演算法是什麼,請給出該演算法的思想和一個java的實例
所謂蟲食演算法,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看一個簡單的例子:
43#9865#045
+ 8468#6633
= 44445509678
其中#號代表被蟲子啃掉的數字。根據算式,我們很容易判斷:第一行的兩個數字分別是5和3,第二行的數字是5。
現在,我們對問題做兩個限制:
首先,我們只考慮加法的蟲食算。這里的加法是N進制加法,算式中三個數都有N位,允許有前導的0。
其次,蟲子把所有的數都啃光了,我們只知道哪些數字是相同的,我們將相同的數字用相同的字母表示,不同的數字用不同的字母表示。如果這個算式是N進制的,我們就取英文字母表午的前N個大寫字母來表示這個算式中的0到N-1這N個不同的數字:但是這N個字母並不一定順序地代表0到N-1)。輸入數據保證N個字母分別至少出現一次。
BADC
+ CRDA
= DCCC
上面的算式是一個4進制的算式。很顯然,我們只要讓ABCD分別代表0123,便可以讓這個式子成立了。你的任務是,對於給定的
N進制加法算式,求出N個不同的字母分別代表的數字,使得該加法算式成立。輸入數據保證有且僅有一組解,
輸入:
輸入文件中包含若干個測試用例。每個測試用例佔4行,第一行有一個正整數N(N<=26),後面的3行每行有一個由大寫字母組成
的字元串,分別代表兩個加數以及和。這3個字元串左右兩端都沒有空格,從高位到低位,並且恰好有N位。
輸出:
對應每一組測試用例,以一行的形式輸出N個數字,分別表示A,B,C……所代表的數字,相鄰的兩個數字用一個空格隔開,
不能有多餘的空格。
樣例輸入:
5
ABCED
BDACE
EBBAA
*/
蟲食算 窮舉法實例:
import java.io.*;
class Bug
{
static int tmp1[];
static int tmp2[];
static int sum[];
static int position=0;
static boolean flag=false;
public static void main(String[] args) throws Exception
{
BufferedReader bf=new BufferedReader(new FileReader("bug.in"));
int n=Integer.parseInt(bf.readLine());
String str1=bf.readLine();
String str2=bf.readLine();
String str3=bf.readLine();
tmp1=new int[n];
tmp2=new int[n];
sum=new int[n];
for(int i=0;i<tmp1.length;i++)
tmp1[i]=n+i;
if(compare(str1,str2))go(0,str1,str2,str3);
else go(0,str2,str1,str3);
}
public static void go(int position,String str1,String str2,String str3)throws Exception
{
int p;
if(position==tmp1.length)
{
if(check(str1,str2,str3,tmp1.length))
{
flag=true;
print(tmp1.length,str1);
}
return;
}
for(int i=0;flag==false&&i<=tmp1.length-1;i++)
{
if((p=str1.lastIndexOf(str1.charAt(position),position-1))==-1)
tmp1[position]=i;
else {tmp1[position]=tmp1[p];}
if(!isExist(i,position))
go(position+1,str1,str2,str3);
}
}
public static boolean isExist(int num,int position)
{
for(int i=0;i<position;i++)
if(num==tmp1[i])
return true;
return false;
}
public static boolean check(String str1,String str2,String str3,int n)//n代表幾進制
{
int carry=0;//進位初始化
for(int i=0;i<tmp2.length;i++)
tmp2[i]=tmp1[str1.indexOf(str2.charAt(i))];
for(int i=tmp2.length-1;i>=0;i--)
{
sum[i]=tmp1[i]+tmp2[i]+carry;
if(sum[i]>=n)
{
carry=(sum[i]-sum[i]%n)/n;
sum[i]=sum[i]%n;
}
else carry=0;
}
for(int i=0;i<tmp2.length;i++)
if(tmp1[str1.indexOf(str3.charAt(i))]!=sum[i])
return false;
return true;
}
public static void print(int n,String str1)
{
for(int i='A';i<'A'+n;i++)
System.out.print(tmp1[str1.indexOf((char)i)]+" ");
}
public static boolean compare(String str1,String str2)
{
for(int i=0;i<str1.length();i++)
if(str1.indexOf(str2.charAt(i))==-1)
return false;
return true;
}
}
2. java里怎麼發廣播呀
java里怎麼發廣播
public void onReceive(Context context,Intent intent){
Intent intent = new Intent(context,XxxService.class);
context.startService(intent);
}
Intent intent = new Intent();
intent.setAction("...");
Context.sendBroadcast(intent);
3. java十大演算法
演算法一:快速排序演算法
快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個項目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他Ο(n log n) 演算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實現出來。
快速排序使用分治法(Divide and conquer)策略來把一個串列(list)分為兩個子串列(sub-lists)。
演算法步驟:
1 從數列中挑出一個元素,稱為 "基準"(pivot),
2 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分區退出之後,該基準就處於數列的中間位置。這個稱為分區(partition)操作。
3 遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞歸的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞歸下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最後的位置去。
演算法二:堆排序演算法
堆排序(Heapsort)是指利用堆這種數據結構所設計的一種排序演算法。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。
堆排序的平均時間復雜度為Ο(nlogn) 。
演算法步驟:
創建一個堆H[0..n-1]
把堆首(最大值)和堆尾互換
3. 把堆的尺寸縮小1,並調用shift_down(0),目的是把新的數組頂端數據調整到相應位置
4. 重復步驟2,直到堆的尺寸為1
演算法三:歸並排序
歸並排序(Merge sort,台灣譯作:合並排序)是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。
演算法步驟:
1. 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合並後的序列
2. 設定兩個指針,最初位置分別為兩個已經排序序列的起始位置
3. 比較兩個指針所指向的元素,選擇相對小的元素放入到合並空間,並移動指針到下一位置
4. 重復步驟3直到某一指針達到序列尾
5. 將另一序列剩下的所有元素
4. 根據ip地址和子網掩碼計算網段地址和廣播地址,要是java代碼哦
根據IPV4的規則
IP是32位的整數,掩碼是網路的補碼。A類地方是高8位是網路地址、B類是高16位、類推。
廣播則是對應IP地址的主機地址全是255。
5. java演算法
publicclassScannerTest{
publicstaticvoidmain(String[]args){
Stringstr1="";
//Stringstr2="";
//下面這種方式是動態生成str2可以根據str1不同,而改變,把str1的第一個字元移動到str2的最後面
Stringstr2=newString(str1.toCharArray(),1,str1.length()-1)+str1.charAt(0);
System.out.println("數字X: "+str1);
System.out.println("數字y: "+str2);
BigDecimalb1=newBigDecimal(str1);
BigDecimalb2=newBigDecimal(str2);
System.out.println("x*y= "+b1.multiply(b2));
}
}
結果檢查如下
數字X:
數字y:
x*y= 425088890
6. JAVA 實現演算法
編碼是不能用字元串的,大大大降低速度
public class Test{
static public int getIntegerComplement(int n){
return ~n&((1<<(32-Integer.numberOfLeadingZeros(n)))-1);
}
public static void main(String[] args){
int a[]={1,5,50,256,65536};
for(int i:a){
int r=getIntegerComplement(i);
System.out.println(i+" "+Integer.toBinaryString(i)+
" => "+r+" "+Integer.toBinaryString(r));
}
}
}
========
1 1 => 0 0
5 101 => 2 10
50 110010 => 13 1101
256 100000000 => 255 11111111
65536 10000000000000000 => 65535 1111111111111111
7. java 演算法
內循環中,如果j滿足j<=i/2,則在執行一次循環體後,j的值就會加1,當最後一次循環結束後(沒有用break跳出,即i為質數),j的值就是i/2+1
所以,if(j>i/2)實際上就是判斷循環有沒有用break跳出(有用的話,i就不是質數)
8. java中的演算法,一共有多少種,哪幾種,怎麼分類。
就好比問,漢語中常用寫作方法有多少種,怎麼分類。
演算法按用途分,體現設計目的、有什麼特點
演算法按實現方式分,有遞歸、迭代、平行、序列、過程、確定、不確定等等
演算法按設計范型分,有分治、動態、貪心、線性、圖論、簡化等等
作為圖靈完備的語言,理論上」Java語言「可以實現所有演算法。
「Java的標准庫'中用了一些常用數據結構和相關演算法.
像apache common這樣的java庫中又提供了一些通用的演算法