『壹』 用c語言編寫一個對稱加密演算法,對字元串加密
/*本問題的關鍵是如何交換ASCII的二進制位,下面提供簡短演算法,並附上VC++6.0環境下的運行結果截圖。
*/
#include<stdio.h>
charswapbit(charc){
chari,num=0,ch[8];
for(i=0;i<8;i++){
ch[i]=c&1;
c=(c>>1);
}
for(i=0;i<8;i++){
num=2*num+ch[i];
}
returnnum;
}
intmain(){
charch;
for(ch='A';ch<='Z';ch++){
printf("%c=%X:%X ",ch,ch,0XFF&swapbit(ch));
}
return0;
}
『貳』 篩法求素數,求詳解!謝謝。用c語言實現。。
1、演算法一:令A為素數,則A*N(N>1;N為自然數)都不是素數。 #definerange2000boolIsPrime[range+1];//set函數確定i是否為素數,結果儲存在IsPrime[i]中,此函數在DEVC++中測試通過voidset(boolIsPrime[]){inti,j;for(i=0;i<=range;++i)IsPrime[i]=true;IsPrime[0]=IsPrime[1]=false;for(i=2;i<=range;++i){if(IsPrime[i]){for(j=2*i;j<=range;j+=i)IsPrime[j]=false;}}}2、
說明:解決這個問題的訣竅是如何安排刪除的次序,使得每一個非質數都只被刪除一次。 中學時學過一個因式分解定理,他說任何一個非質(合)數都可以分解成質數的連乘積。例如,16=2^4,18=2 * 3^2,691488=2^5 * 3^2 * 7^4等。如果把因式分解中最小質數寫在最左邊,有16=4^2,18=2*9,691488=2^5 * 21609,;換句話說,把合數N寫成N=p^k * q,此時q當然是大於p的,因為p是因式分解中最小的質數。由於因式分解的唯一性,任何一個合數N,寫成N=p^k * q;的方式也是唯一的。 由於q>=p的關系,因此在刪除非質數時,如果已知p是質數,可以先刪除p^2,p^3,p^4,... ,再刪除pq,p^2*q,p^3*q,...,(q是比p大而沒有被刪除的數),一直到pq>N為止。
因為每個非質數都只被刪除一次,可想而知,這個程序的速度一定相當快。依據Gries與Misra的文章,線性的時間,也就是與N成正比的時間就足夠了(此時要找出2N的質數)。 (摘自《C語言名題精選百則(技巧篇)》,冼鏡光 編著,機械工業出版社,2005年7月第一版第一次印刷)。代碼如下: #include<iostream>#include<cmath>usingnamespacestd;intmain(){intN;cin>>N;int*Location=newint[N+1];for(inti=0;i!=N+1;++i)Location[i]=i;Location[1]=0;//篩除部分intp,q,end;end=sqrt((double)N)+1;for(p=2;p!=end;++p){if(Location[p]){for(q=p;p*q<=N;++q){if(Location[q]){for(intk=p*q;k<=N;k*=p)Location[k]=0;}}}}intm=0;for(inti=1;i!=N+1;++i){if(Location[i]!=0){cout<<Location[i]<<;++m;}if(m%10==0)cout<<endl;}cout<<endl<<m<<endl;return0;}該代碼在Visual Studio 2010 環境下測試通過。
以上兩種演算法在小數據下速度幾乎相同。
『叄』 如何用C語言實現求概率期望
用一個數組存放這100個概率。然後隨機生成N個0~99的數。以隨機生成的數為下標讀取數組里的數。然後相乘。。
『肆』 用c語言怎麼實現數據結構演算法
c語言主要通過自己定義函數來實現數據結構,比如實現堆棧,實現了先輸入後輸出,用函數來實現各個介面;
但是C++也可以通過這個辦法,來實現數據結構,
還有很簡單,就是STL 框架,這個是系統自動定義的函數。用起來容易
『伍』 演算法編程:用c語言實現
解決這類問題可以使用 回溯 演算法,代碼如下:
#include<stdio.h>
#include<stdlib.h>
#defineM6//候選數字個數
#defineN5//組合後數字位數
intcheck(intresult[],inti)
{
for(intj=0;j<N;j++)
if(result[j]==i)
return0;
return1;
}
intlist(intnumbers[],intl,intresult[],intcount)
{
if(l>=N){
//將各位數組合成一個數
intnum=0;
for(inti=0;i<N;i++){
num=num*10+numbers[result[i]];
}
//判斷這個數是否能被75整除
if(num%75==0){
printf("%d ",num);
count++;
}
returncount;
}
for(inti=0;i<M;i++){
if(!check(result,i)){
continue;
}
result[l]=i;
count=list(numbers,l+1,result,count);
result[l]=-1;
}
returncount;
}
intmain()
{
intnumbers[M]={1,2,5,7,8,9};
intresult[N]={-1,-1,-1,-1,-1};
intcount=list(numbers,0,result,0);
printf("共有%d個 ",count);
system("pause");
return0;
}
運行結果: