利用字符数组进行大数乘法的位运算
#include<stdio.h>
#include<math.h>
#include<string.h>
void print_cheng(char s1[],char s2[]);
void main()
{
char s1[1000],s2[1000];
while(scanf("%s%s",s1,s2))
print_cheng(s1,s2);
}
void print_cheng(char s1[],char s2[])
{
int a[1000],b[1000],c[1000]={0};
//当然用memset(c,0,sizeof(c));且应用memset方法需要调用#include<>是等价于c[1000]={0},同样表示将c数组全部初始化为0
int i,j;
int len_a,len_b,len;
len_a=strlen(s1); len_b=strlen(s2);
printf("s1=%d s2=%d ",len_a,len_b);
len=len_a+len_b; //两个大数相乘所得的结果的最大项便是len_a+len_b
for(i=0;i<len_a;i++) //将大数s1倒序传递给整型数组a
a[i]=s1[len_a-1-i]-'0';
for(i=0;i<len_b;i++) //将大数s2倒序传递给整型数组b
b[i]=s2[len_b-1-i]-'0';
for(i=0;i<len_a;i++)
for(j=0;j<len_b;j++)
c[i+j]+=a[i]*b[j]; //用大数b的每一项乘以大数a的所有项
for(i=0;i<len;i++){ //进位取整
if(c[i]>=10){
c[i+1]+=c[i]/10;
c[i]%=10;
}
} //此时i的值为len
i=len-1;
if(c[i]==0)i--; //判断首位是否为零
if(i<0)printf("0");
else{
for(;i>=0;i--)
printf("%d",c[i]); //倒序输出结果
}
printf("\n");
}
利用字符数组进行大数加法的位运算
#include<stdio.h>
#include<string.h>
void print_Big(char a[],char b[]);
void main()
{
char a[1000],b[1000];
scanf("%s%s",a,b);
print_Big(a,b);
}
//大数求和
void print_Big(char a[],char b[])
{
char c[1000]; //定义字符数组c并且初始化使其a[0]为1,其他为0; 用于存放大数求和后的结果
int i,sum,t=0;
int len,len_a,len_b;
len_a=strlen(a);
len_b=strlen(b);
len=strlen(a)>strlen(b)? strlen(a):strlen(b);
c[len+1]='#include<stdio.h>
#include<string.h>
void print_Big(char a[],char b[]);
void main()
{
char a[1000],b[1000];
scanf("%s%s",a,b);
print_Big(a,b);
}
//大数求和
void print_Big(char a[],char b[])
{
char c[1000]; //定义字符数组c并且初始化使其a[0]为1,其他为0; 用于存放大数求和后的结果
int i,sum,t=0;
int len,len_a,len_b;
len_a=strlen(a);
len_b=strlen(b);
len=strlen(a)>strlen(b)? strlen(a):strlen(b);
c[len+1]='\0'; //使其和的最大项的可能的项的后一项赋空
for(i=0;i<len;i++) //进行倒序相加,从最小为开始相加
{
if(len_a-1-i>=0&&len_b-1-i>=0){ //满10进位,不满则不进位
sum=a[len_a-1-i]-'0'+b[len_b-1-i]-'0'+t;
c[len-i]=sum%10+'0';
t=sum/10;
}
else if(len_a-1-i>=0&&len_b-1-i<0){
sum=a[len_a-1-i]-'0'+t;
c[len-i]=sum%10 + '0' ;
t=sum/10;
}
else if(len_a-1-i<0&&len_b-1-i>=0){
sum=b[len_b-1-i]-'0'+t;
c[len-i]=sum%10+'0';
t=sum/10;
}
}
c[0]='0'+t;
//正序输出
if(c[0]=='0')printf("%s\n",c+1); //如果第一位为0,便从a[1]开始输出
else printf("%s\n",c); //第一位不为0,直接输出
}
'; //使其和的最大项的可能的项的后一项赋空
for(i=0;i<len;i++) //进行倒序相加,从最小为开始相加
{
if(len_a-1-i>=0&&len_b-1-i>=0){ //满10进位,不满则不进位
sum=a[len_a-1-i]-'0'+b[len_b-1-i]-'0'+t;
c[len-i]=sum%10+'0';
t=sum/10;
}
else if(len_a-1-i>=0&&len_b-1-i<0){
sum=a[len_a-1-i]-'0'+t;
c[len-i]=sum%10 + '0' ;
t=sum/10;
}
else if(len_a-1-i<0&&len_b-1-i>=0){
sum=b[len_b-1-i]-'0'+t;
c[len-i]=sum%10+'0';
t=sum/10;
}
}
c[0]='0'+t;
//正序输出
if(c[0]=='0')printf("%s\n",c+1); //如果第一位为0,便从a[1]开始输出
else printf("%s\n",c); //第一位不为0,直接输出
}
利用整型数组进行大数阶乘的位运算
#include<stdio.h>
void print_Big(int n);
void main()
{
int n;
while(1){
scanf("%d",&n);
print_Big(n);
}
}
//大数阶乘
void print_Big(int n)
{
int i,j,len;
int a[1000]={1};
if(n<0){printf("error\n"); return; }
else if(n==1||n==0){printf("%d\n",1); return; }
len=1; //大数阶乘前,它的位数为1位
for(i=2;i<=n;i++)
{
int t=0; int sum;
for(j=0;j<len;j++)
{
sum=a[j]*i+t;
a[j]=sum%10;
t=sum/10;
//进位的条件是:进位数t不等于0,并且算到最后现有的最高项
if(t!=0&&j==len-1)len++;
}
}
//倒叙输出
for(i=len-1;i>=0;i--)
printf("%d",a[i]);
printf("\n");
}
利用整型数组进行大数幂的位运算
//大数幂
#include<stdio.h>
void print_Big(int x,int n);
void main()
{
int x,n;
while(1){
scanf("%d%d",&x,&n); //x的n次方
print_Big(x,n);
}
}
void print_Big(int x,int n)
{
int a[100000]={1};
int i,j,t,sum,len=1; //默认阶乘初始项数为1
if(n==0){ printf("%d\n",1); return ; }
for(i=1;i<=n;i++){
t=0;
for(j=0;j<len;j++){
sum=a[j]*x+t;
a[j]=sum%10;
t=sum/10;
if(t!=0&&j==len-1)
len++;
}
}
for(i=len-1;i>=0;i--)
printf("%d",a[i]);
printf("\n");
}
多次运用函数进行大数运行,是为了方便代码的移植性 本人新手程序员,都是个人的代码感悟,可能不够简洁,老练,但新手易懂 代码会友交天下朋友,用心处事结四海豪杰 第一次写,若有瑕疵还请见谅。 自写代码,如有雷同纯属意外。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/185029.html原文链接:https://javaforall.cn