C语言计算2的100次方

 
一般的计算用c语言中自带的数据类型和一些math函数库就可以完成,但有时候一些技术要求数值更加精确或者超出c语言的计算范围,这就需要使用某些算法来辅助计算了。

//计算2的100次方
/*问题分析:
*使用c语言自带整数数据类型已经无法满足要求;
*需要用100位的数据类型来计算,在c语言中,int是8位,long是32位;
*2的10次方大约是10的3次方;所以2的100次方大约是10的31次方,即为31位的十进制数;
*我的算法是把结果放在长度为35的int数组,每个数据在0-9之间,一个值代表一位,arr[0]为个位;
*因为是受算盘计算方式的启发,所以我称作此算法为“算筹算法”;
*一般方法是每次都遍历整个数组;优化方式是初始遍历数组的5位,随后幂每增加10,需要遍历的数组增加3位。
**/
#include<stdio.h>
#define N 33//设定结果的总位数

//一般算法实现
void getResult(){
	int i,j;
	int t = 0;//用于标记是否有进位
	int arr[N];

	arr[0] = 1;
	for(i = 1;i < N;i++){
		arr[i] = 0;
	}

	//算法实现过程
	for(i = 1;i <= 100;i++){
		t = 0;
		for(j = 0;j < N;j++){
			//计算本位数据
			arr[j] = arr[j] * 2 + t;
			t = 0;
			//计算下一位数据
			if(arr[j] > 9){
				arr[j] %= 10;
				t = 1;
			}
		}
	}

	//结果输出
	printf("一般算法——2的100次方计算结果为:n");
	for(i = N - 1;i >= 0;i--){
		if(i != 0 && i % 3 == 0){
			printf("%d,",arr[i]);
		}else{
			printf("%d",arr[i]);
		}
	}
	printf("n");

}

//优化算法实现
void getResultPro(){
	int i,j,n;
	int t = 0;//用于标记是否有进位
	int arr[N];

	arr[0] = 1;
	for(i = 1;i < N;i++){
		arr[i] = 0;
	}

	//算法实现过程
	for(i = 1;i <= 100;i++){
		t = 0;
		n = (i / 10  + 1) * 3 + 2;
		for(j = 0;j < n;j++){
			//计算本位数据
			arr[j] = arr[j] * 2 + t;
			t = 0;
			//计算下一位数据
			if(arr[j] > 9){
				arr[j] %= 10;
				t = 1;
			}
		}
	}

	//结果输出
	printf("优化算法——2的100次方计算结果为:n");
	for(i = N - 1;i >= 0;i--){
		if(i != 0 && i % 3 == 0){
			printf("%d,",arr[i]);
		}else{
			printf("%d",arr[i]);
		}
	}
	printf("n");

}

void main(){
	//一般算法
	getResult();
	getResultPro();
}

 
 

© 2013 – 2015, 李德涛博客. 版权所有.

发表评论

电子邮件地址不会被公开。 必填项已用*标注