模擬乗算のテーマを考察する
今日hlは私とテーマを討論しました.
と書く
整形配列は、a={1,4,5}のように、2進数1が現れる位置(下付きは右から0が1番目)、すなわち110010、すなわち10進数x=2^1+2^4+2^5=50を表す.3*x=150のバイナリは中を表して、1の個数を求めます.本題のように出力4.aのような整形配列として入力します.
アルゴリズムのパフォーマンスの最適化に注意してください.
私はこのテーマが模擬乗算を考察していると感じています.acmがよくやっている大数乗算の模擬アルゴリズムに比べて簡単です.
もっと高級な接法があるかどうか分かりません.
と書く
整形配列は、a={1,4,5}のように、2進数1が現れる位置(下付きは右から0が1番目)、すなわち110010、すなわち10進数x=2^1+2^4+2^5=50を表す.3*x=150のバイナリは中を表して、1の個数を求めます.本題のように出力4.aのような整形配列として入力します.
アルゴリズムのパフォーマンスの最適化に注意してください.
私はこのテーマが模擬乗算を考察していると感じています.acmがよくやっている大数乗算の模擬アルゴリズムに比べて簡単です.
int three_x(int a[],int n){
int bin_len = a[n-1] + 1;
int res_len = a[n-1] + 3;
int *bin_a = (int *)malloc( sizeof(int) * bin_len ) ;
int *res = (int *)malloc( sizeof(int) * res_len );
memeset(res,0,sizeof(int) * res_len);
int i,j=0;
for(i = 0; i <= a[n-1]; i++){//
if(i == a[j]){
bin_a[i] = 1;
j++
}else
bin_a[i] = 0;
}
for(int i = 0; i < bin_len; i++){// 3
res[i] += bin_a[i] * 3 % 2;
res[i+1] += bin_a[i] / 2;
}
res[res_len-1] += res[res_len-2] / 2;// :
res[res_len-2] += res[res_len-2] % 2;
int num = 0;
for(i = 0; i < res_len; i++){// 1
if(res[i] == 1)
num++;
}
return num;
}
もっと高級な接法があるかどうか分かりません.