任意精度整數運算(計算2的4000次方)

/**********************************************************************************
*任意精度整數運算
*例如計算:2的4000次方
*算法核心:使用數組完成大整數的乘法,每一個單元保存一位數字。
*數組乘法算法:  每一次乘法: 1.計算當前位乘2的積(tmp=N*arr[i]+high_number;);
*                            2.保存積的進位(沒有進位,進位則保存0)
*                            3.更新數組當前位的值(積的個位數)
*               4.乘法結束後,如果積大於0,則直接記錄進位,arr[i]=high_number;
*推廣 0-9的4000次方,#define N  2(修改N的值即可)
*anthor: fangchang
*time: 2016/04/04 16:58
************************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 2

void answer3();
int main() {
	int x=1;
	while(x!=-1) {
		printf("input x(x=-1:game over):\n");
		scanf("%d",&x);
		printf("this is answer3():\n");
		answer3();
	}
	fflush(stdin);
	getchar();
	return 0;
}

void answer3() {
	int x;                                            //x表示冪
	int i,j,tmp;
	int high_number=0;                                //進位
	printf("please input x(x>0):\n");
	scanf("%d",&x);
	if(x<=0) {
		return ;
	}
	int * arr = (int *) malloc(sizeof(int)*x);       //申請數組空間
	if(! arr) {
		printf("malloc failed.\n");
		return;
	}
	for(i=0;i<x;++i){             
		arr[i]=-1;                                    //初始化數組,-1表示未參與運算。
	}
	arr[x-1]=1;                                       //最後一位初始化爲1,方便運算
    //以下爲core code
	for(j=1;j<=x;++j) {                               //計算x個N相乘
		i = x-1;                                      //運算從結果數組的最後一位開始
		high_number = 0;                              //進位初始化爲0
		while(i>=0 && -1!=arr[i]) {                   //從後遍歷數組,數組值爲-1時,數據遍歷結束
			tmp=N*arr[i]+high_number;                 //計算每一次乘法的積        
			high_number = tmp/10;                     //更新進位(tmp<10,進位爲0,大於10,爲十位上的數,均是tmp/10)
			arr[i]=tmp%10;                            //更新數組當前位置的值(tmp<10,即tmp,tmp>=10,爲個位數字,均是tmp%10)
			--i; 
		}
		if(tmp>=10 && high_number>0) {               //積不小於10,且運算結束時,進位〉0(例如2*8=16的處理)
			arr[i]=high_number;                      //數組值增加一位
		}
	}
	//以上爲core code
	printf("when %d numbers of %d mult ,the result is:\n",x,N);
	for(i=0;i<x;++i) {
		if( -1 != arr[i] ) {
			printf("%d",arr[i]);
		}
	}
	printf("\n");
	free(arr);
	arr=NULL;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章