/**********************************************************************************
*任意精度整數運算
*例如計算: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;
}
任意精度整數運算(計算2的4000次方)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.