足根シリーズ3 - フィボナッチ数 - 効率的なワンバンド、億進

ワンバイナリ思考の場合:

;日常生活我々は、演算小数ために使用される
バイナリを識別するために、コンピュータの開発を容易にするために、及び= 8 2 ^ 3ので、^ 4 = 16 2は、進と16進されて入ってきました。
それは8,16進2進数、10進数に由来することができるので、大きなバンド、そこから派生していないのはなぜこの世界ではまさか、人々は、より多くの、彼らは道になります歩いていますか?
そうスマート人々は模倣バイナリと16進算術10 ^ 4 = 10000であるワンバンドを開発しました。徐々に、私たちは、WANが比類のない利点を持っている小数の運用面の間に大きな数字を発見しました。
核となるアイデア:
格納された値のアレイ、値が9999よりも大きい場合に要素の「多数」として各配列番号は、要素の値%10000のキャリー値を伝送する必要があります。これはまた、「WANとして理解することができますヘクス「の値は0からすべての小数の同等に記憶することができる~10 0実装~9999 10進数からワンヘクスになることと等価です。
例えば:662343889 * = 3311719445 5
そしてワン進計算場合:アレイを提供することができる[3]、[2 ] = 3889 [1] = 6234 [0] = 6;
工程:A [2] * 5 = 19445; 19445パーセント10000 94459445 I 1 =左、1つのキャリー;
ステップ:[1] * 5 = 31170; 10000 = 33.117万% Iは左11701170、プラスキャリービット1 1171(最終値)、3キャリー;
第三段階:[0] * = 5 30; 30 + 3( 最終値のキャリー)。
得るためには出力:3311719945;それ小数ならば、我々は、最終的な結果に来てわずか3つのステップ?、本実施の形態では、少なくとも10段階の各添加。3倍効率よりも。


以下のコードの場合:

入力:

N(Nは第一のフィボナッチ数です。)

出力:

出力番号。

ワン16進コード:

#include<stdio.h>
int main() {
	int a1[10000], a2[10000], a3[10000];//a1为第n个数,a2为第n-1个数,a3做中间变量转换a1和a2
	int n; scanf("%d", &n);
	int places = 0, carry, i, j;	//places是总位数,carry是进位
	for(i = 0; i < n; i++) {
		carry = 0;
		if(i == 0 || i == 1) a1[0] = a2[0] = 1;
		else {
			for(j = 0; j <= places; j++) {
				a3[j] = a1[j];						//做变量转化,a3做中间变量
				a1[j] += a2[j]; a1[j] += carry;	//不仅要加前一个数,还要加上次运算后的进位。
				carry = a1[j]/10000;				//求进位
				a1[j] %=10000;		
				a2[j] = a3[j];						//变量转换,a3做中间变量
			}
			if(carry > 0) { 			//如果进位>0,则总位数+1。
				places++; 
				a1[places] = carry; 
			}
		}
	}
	printf("%d",a1[places]);
	for(i = (places-1); i >= 0; i--) 
		printf("%04d", a1[i]);			//域宽为4,不够补0
	return 0;	
}

億のバイナリバイナリ類推WANで同じ原理によると:

核となるアイデア:

格納された値のアレイと、「多数」、要素値が99999999より大きい場合、各配列番号は、要素値100 000 000%にキャリー値を伝送する必要があります。これはまた、「億バイナリ」として理解することができます値は0からすべての小数の同等上に保存することができます~10 0実装~99999999は、小数点からヘクスに億に相当します。

ただワンは、コードの13、14行10000 10000000行の代わりに29%04D%08Dに変更ARY億のバイナリなります。

一億進コード:

#include<stdio.h>
int main() {
	int a1[3000], a2[3000], a3[3000];
	int places = 0, carry, i, j;
	int n; scanf("%d", &n);
	for(i = 0; i < n; i++) {					//核心循环 
		carry = 0;
		if(i == 0 || i == 1) a1[0] = a2[0] = 1;
		else {
			for(j = 0; j <= places; j++) {
				a3[j] = a1[j];						//做变量转化 
				a1[j] += a2[j]; a1[j] += carry;		//三行核心代码 
				carry = a1[j]/100000000;
				a1[j] %=100000000;
				a2[j] = a3[j];						//变量转换 
			}
			if(carry > 0) { places++; a1[places] = carry; }
		}
	} 
	printf("%d",a1[places]);
	for(i = (places-1); i >= 0; i--) 
		printf("%08d", a1[i]);
	return 0;	
}

効率性:

N = 100,000、2.1ワット程度のビットが出力されます。
小数:10W-ビットC言語プログラムのタイムランニング7Sをまわり、ないテストC ++ランタイム
ワン進:で10ワットビットC言語ランタイム2.1s ほど、2.7s程度のC ++実行時
億バイナリ:10ワットビットのC言語実行時の1.2秒かそこら約2.0SのC ++実行時。
結論1:計算のスーパー多数、C ++、Cよりも遅いです。
結論2:ワン効率的なバイナリ明らかに、特に億のバイナリは、時間のノートは、特に質問を要求コード効率のために、一般的に1〜3秒を実行するプログラム。エクストラ0.5秒、確率は、多くのことを増加します。


アーチ日兵士ではなく、唐は、電源を寄付します。

公開された85元の記事 ウォン称賛78 ビュー10000 +

おすすめ

転載: blog.csdn.net/weixin_43899069/article/details/104808255
おすすめ