众所周知,在一个很大的数字相加和相乘时,传统的整数类型规定的大小范围已经满足不了我们的需要,所以我们需要算法来实现大数相加与相乘。
大数相加 思维参考
思路很简单,通过整数型数组存入每一个数字,然后模拟小学时学得的加法运算,如果个位数相加超过10,则十位数加一,然后个位数减十,不断的进位来实现整个过程。
大数相加 sample
123456789 + 987654321 = ?
大数相加 代码实现
#include<stdio.h>//不理解的可以加断点走一边过程
#include<string.h>
#define N 200
int main()
{
char a[N];
char b[N];
int na[N];
int nb[N];
while(~scanf("%s%s",a,b))
{
memset(na,0,sizeof(na));
memset(nb,0,sizeof(nb));
int la=strlen(a);
int lb=strlen(b);
int cnt=0;
for(int i=la-1;i>=0;i--)
na[cnt++]=a[i]-'0';
int snt=0;
for(int i=lb-1;i>=0;i--)
nb[snt++]=b[i]-'0';
for(int i=0;i<=N;i++)
{
na[i]+=nb[i];
if(na[i]>=10)
{
na[i]-=10;
na[i+1]+=1;
}
}
printf("两数相加结果为:\n");
if(la>=lb)
{
for(int i=la;i>=0;i--)
{
if(na[i]==0&&i==la)continue;
printf("%d",na[i]);
}
}
else
{
for(int i=lb;i>=0;i--)
{
if(na[i]==0&&i==lb)continue;
printf("%d",na[i]);
}
}
printf("\n");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
大数相乘 思维参考
接下来我们再来聊一聊关于大数相乘算法,其实相乘算法思路基本上和相加没有区别,也是通过代码模拟我们曾经学得的乘法的
大数相乘 sample
835 * 49 = ?
大数相乘 代码实现
#include <stdio.h>
#include<string.h>
#define N 1001
int main()
{
char a[N];
char b[N];
int na[N];
int nb[N];
int nc[N];
while(~scanf("%s%s",a,b))
{
if(a[0]=='0'||b[0]=='0')
{
printf("0\n");
continue;
}
memset(na,0,sizeof(na));
memset(nb,0,sizeof(nb));
memset(nc,0,sizeof(nc));
int la=strlen(a);
int lb=strlen(b);
int cnt=0;
for(int i=la-1;i>=0;i--)
na[cnt++]=a[i]-'0';
int snt=0;
for(int i=lb-1;i>=0;i--)
nb[snt++]=b[i]-'0';
for(int i=0;i<cnt;i++)
{
for(int j=0;j<snt;j++)
{
nc[i+j]+=na[i]*nb[j];
}
}
for(int i=0;i<(cnt+snt);i++)
{
if(nc[i]>=10)
{
int tmp=nc[i]/10;
nc[i]=nc[i]%10;
nc[i+1]+=tmp;
}
}
printf("两数相乘结果为:\n");
for(int i=N-1;nc[i]==0;i--)
{
if(nc[i-1]!=0)
{
for(int j=i-1;j>=0;j--)
printf("%d",nc[j]);
break;
}
}
printf("\n");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
众所周知,在一个很大的数字相加和相乘时,传统的整数类型规定的大小范围已经满足不了我们的需要,所以我们需要算法来实现大数相加与相乘。
大数相加 思维参考
思路很简单,通过整数型数组存入每一个数字,然后模拟小学时学得的加法运算,如果个位数相加超过10,则十位数加一,然后个位数减十,不断的进位来实现整个过程。
大数相加 sample
123456789 + 987654321 = ?
大数相加 代码实现
#include<stdio.h>//不理解的可以加断点走一边过程
#include<string.h>
#define N 200
int main()
{
char a[N];
char b[N];
int na[N];
int nb[N];
while(~scanf("%s%s",a,b))
{
memset(na,0,sizeof(na));
memset(nb,0,sizeof(nb));
int la=strlen(a);
int lb=strlen(b);
int cnt=0;
for(int i=la-1;i>=0;i--)
na[cnt++]=a[i]-'0';
int snt=0;
for(int i=lb-1;i>=0;i--)
nb[snt++]=b[i]-'0';
for(int i=0;i<=N;i++)
{
na[i]+=nb[i];
if(na[i]>=10)
{
na[i]-=10;
na[i+1]+=1;
}
}
printf("两数相加结果为:\n");
if(la>=lb)
{
for(int i=la;i>=0;i--)
{
if(na[i]==0&&i==la)continue;
printf("%d",na[i]);
}
}
else
{
for(int i=lb;i>=0;i--)
{
if(na[i]==0&&i==lb)continue;
printf("%d",na[i]);
}
}
printf("\n");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
大数相乘 思维参考
接下来我们再来聊一聊关于大数相乘算法,其实相乘算法思路基本上和相加没有区别,也是通过代码模拟我们曾经学得的乘法的
大数相乘 sample
835 * 49 = ?
大数相乘 代码实现
#include <stdio.h>
#include<string.h>
#define N 1001
int main()
{
char a[N];
char b[N];
int na[N];
int nb[N];
int nc[N];
while(~scanf("%s%s",a,b))
{
if(a[0]=='0'||b[0]=='0')
{
printf("0\n");
continue;
}
memset(na,0,sizeof(na));
memset(nb,0,sizeof(nb));
memset(nc,0,sizeof(nc));
int la=strlen(a);
int lb=strlen(b);
int cnt=0;
for(int i=la-1;i>=0;i--)
na[cnt++]=a[i]-'0';
int snt=0;
for(int i=lb-1;i>=0;i--)
nb[snt++]=b[i]-'0';
for(int i=0;i<cnt;i++)
{
for(int j=0;j<snt;j++)
{
nc[i+j]+=na[i]*nb[j];
}
}
for(int i=0;i<(cnt+snt);i++)
{
if(nc[i]>=10)
{
int tmp=nc[i]/10;
nc[i]=nc[i]%10;
nc[i+1]+=tmp;
}
}
printf("两数相乘结果为:\n");
for(int i=N-1;nc[i]==0;i--)
{
if(nc[i-1]!=0)
{
for(int j=i-1;j>=0;j--)
printf("%d",nc[j]);
break;
}
}
printf("\n");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57