早上有同窗問了個十六進制數取每字節的低四位組成一個新的數的問題,而後寫了個實現代碼,而後最近感受仍是須要掌握算法,因此記錄一下。算法
說到算法又想起之前同窗作畢設時幫實現的匯率套利計算程序,因此也應一塊兒搬上來。數組
問題:32位16進制的數據,把每一個字節的後四位提取出來組成新的數;好比a=0x31303233,那麼提取出的b=0x1023。ide
實現代碼:spa
# include <stdio.h> # include <math.h> int main(){ int a = 0x31303233; int b = 0; int count = 0; int tmp = a; while(a && 0x10 >= 0x1){ if (count == 0){ b = a % 0x10; }else{ b = (a % 0x10) * pow(0x10,count) + b; } //printf("%d times: a=%x, b=%x\n",count,a,b); a = a >> 8; count += 1; } printf("since a is 0x%x, b is 0x%x\n\n",tmp,b); }
運行結果:3d
問題:手執一種貨幣,如何利用兩種貨幣間的匯率差倒騰兌換,能獲取到最多的錢。code
實現代碼:blog
#include<stdio.h> int main() { //程序中使下標指代對應幣種 char *Name[6]={"CNY","USD","JPY","EUR","HKD","GBP"}; //各幣種之間兌換利率矩陣;縱座標是1單位,橫座標是縱座標1單位可兌換成的單位 double Rate[6][6]={{1.0,0.1548,17.4177,0.1361,1.2008,0.1078}, {6.4585,1.0,112.4919,0.8878,7.7552,0.6962}, {0.0574,0.0089,1.0,0.0078,0.0689,0.0062}, {7.3493,1.1379,128.0076,1.0,8.8248,0.7922}, {0.8328,0.1289,14.5054,0.1133,1.0,0.0898}, {9.2774,1.4365,161.5906,1.2624,11.1400,1.0}}; //獲利矩陣;縱座標1單位轉成縱座標後再轉回縱座標原幣種可獲得的單位,虧損全賦爲0.0 double RateEarn[6][6]={{1.0,0.0,0.0,1.00023973,1.00002624,1.00010372}, {0.0,1.0,1.00117791,1.01022762,0.0,1.0000913}, {0.0,1.00117791,1.0,0.0,0.0,1.00186172}, {1.00023973,1.01022762,0.0,1.0,0.0,1.00007328}, {1.00002624,0.0,0.0,0.0,1.0,1.000372}, {1.00010372,1.0000913,1.00186172,1.00007328,1.000372,1.0}}; //Step----用於存放最優路徑 //StepAccept----用於在放每步的資產 //FinalAsset----用於在放最終的資產 int Step[6]; double StepAsset[6]; double FinalAsset; int best,i,j,flag; while(true){ //每次從新初始化Step和FinalAsset for(i=0;i<6;i++){ Step[i]=0; } FinalAsset=1.0; //接收用戶選擇的最初幣種 printf("--------------------------------------------------------------------------------\n" "0.CNY\t1.USD\t2.JPY\t3.EUR\t4.HKD\t5.GBP\t6.exit\n" "please enter your choice:"); scanf("%d",&flag); printf("\n"); if(flag>5) { return 0; } Step[0]=flag; //步長從1到5 for(int StepLength=1;StepLength<6;StepLength++){ //每次循環前都要將組初始化,以使數組能用於下一步長 for(i=0;i<6;i++){ StepAsset[i]=0.0; } //篩選可能路徑 for(int Target=0;Target<6;Target++){ if(Step[StepLength-1]!=Target){ if((RateEarn[Step[StepLength-1]][Target]>=1.0)&&(RateEarn[Target][flag]>=1.0)) { StepAsset[Target]=FinalAsset*Rate[Step[StepLength-1]][Target]*Rate[Target][flag]; } } } //在可能路徑中選出最優路徑 best=0; for(i=1;i<6;i++){ if(StepAsset[best]<StepAsset[i]){ best=i; } } Step[StepLength]=best; FinalAsset=FinalAsset*Rate[Step[StepLength-1]][best]; //如下代碼用於代碼輸出本步長最後結果 printf("while StepLength is %d,the best path is:\t",StepLength); for(j=0;j<=StepLength;j++){ printf("%s->",Name[Step[j]]); } printf("%.8lf",FinalAsset*Rate[Step[StepLength]][flag]); switch(flag){ case 0: printf("CNY"); break; case 1: printf("USD"); break; case 2: printf("JPY"); break; case 3: printf("EUR"); break; case 4: printf("HKD"); break; case 5: printf("GBP"); break; } printf("\n\n"); } printf("--------------------------------------------------------------------------------\n"); } return 0; }
實現效果:get