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[n][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的倍数即可。