您的位置:首页 > 编程语言 > C语言/C++

高精度运算

2016-03-10 14:30 330 查看

1、 有关%运算

类似题目之前写过一次,但是这次写到又给忘记了(# ̄~ ̄#)

接下来看题:



代码如下:

#include<stdio.h>
__int64 yanghui[1050][1050];
int main(){
int i,j;

//求杨辉三角形
for(i=0;i<1010;i++){
for(j=0;j<=i;j++){
if(j==0||j==i){
yanghui[i][j]=1;
}
else {
/*
由于yanghui[i][j]范围最终可能超过int
所以应当边%边+ 使yanghui[i][j]大小控制在一定范围内

同理如遇到乘法也应边%边*
*/
yanghui[i][j]=(yanghui[i-1][j-1]+yanghui[i-1][j])%707063423;
}
}
}

scanf("%d%d",&n,&m);
printf("%I64d",yanghui
[m]);

return 0;
}


2、 数组模拟乘法

运用数组模拟竖式乘法的过程来达到int范围不支持的高精度的运算

例题题目:



代码如下:

/**************************************************************
***竖式乘法运算***

1   2   3   4
×             5
--------------------
1   2
7   0  写下个位,十位以上往前进位
3×5+2=17
**************************************************************
*
数组模拟运算类似此法
每位数字先*i再进行进位 与 由低位到高位边乘i边进位效果相同
*
**************************************************************/

#include<stdio.h>
int a[3000]=1;//记录数字的每一位数。1000!大约有2500+位
int main(){
int i,j;
int n;
int length=1;//记录数字长度
scanf("%d",&n);

a[1]=1;
for(i=1;i<=n;i++){

//每位数*i
for(j=1;j<=length;j++){
a[j] *= i;
}

//进阶
for(j=1;j<=length;j++){
a[j+1] += a[j]/10;//进位
a[j] %= 10;//取个位
}

//此时j==length+1
/*拆分最高位
*
*若a[j]==0则说明原最高位*i之后没有进位;a[j]!=0时则有进位
*
*a[j]可能不是一位数字 故需对a[j]进行拆分
*并重新计算数字长度
*
*/
while(a[j] != 0){
length++;
a[j+1] += a[j]/10;
a[j] %= 10;
j++;
}
}

for(i=length;i>=1;i--){
printf("%d",a[i]);
}
printf("\n");

return 0;
}


以上代码中,a[i]仅存了一位数字。在内存和精度要求更高的情况下,可以使a[i]存三位四位甚至更多位的数字。只需要将以上代码中的10改成相应的10的倍数即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C-C++解题技巧