两个大数相乘实例
大數相乘
思路:
1.先將字符串倒序并轉換為數字
2.逐位相乘,并存入一個數組e[i+j]中
3.處理進位,并消去多余的0
4.轉換并把數組e[i]反轉輸出
?
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
using namespace std;
#define Max 1000
int main()
{
?? ?char a[Max],b[Max];
?? ?int c[Max],d[Max],e[Max];
?? ?int a1,a2;
?? ?while(cin>>a>>b)
?? ?{
?? ??? ?memset(c,0,sizeof(c));
?? ??? ?memset(d,0,sizeof(d));
?? ??? ?memset(e,0,sizeof(e));
?? ??? ?a1=strlen(a);
?? ??? ?a2=strlen(b);
?? ??? ?//將字符串倒序,將字符轉化為數字才能進行乘法
?? ??? ?int x=0;
?? ??? ?for(int i=a1-1; i>=0; i--)
?? ??? ?{
?? ??? ??? ?c[x]=a[i]-48;
?? ??? ??? ?x++;
?? ??? ?}
?? ??? ?x=0;
?? ??? ?for(int i=a2-1; i>=0; i--)
?? ??? ?{
?? ??? ??? ?d[x]=b[i]-48;
?? ??? ??? ?x++;
?? ??? ?}
?? ??? ?//對兩組字符串中的數逐位相乘,存于e[i+j]
?? ??? ?for(int i=0; i<a1; i++)
?? ??? ?{
?? ??? ??? ?for(int j=0; j<a2; j++)
?? ??? ??? ?{
?? ??? ??? ??? ?e[i+j]+=(c[i]*d[j]);
?? ??? ??? ?}
?? ??? ?}
?? ??? ?//得到的結果進行進位制處理
?? ??? ?for(int j=0; j<Max; j++)
?? ??? ?{
?? ??? ??? ?//進制位處理的寫法
?? ??? ??? ?if(e[j]>=10)
?? ??? ??? ?{
?? ??? ??? ??? ?e[j+1]+=e[j]/10;
?? ??? ??? ??? ?e[j]%=10;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?int i;
?? ??? ?//除去多余的0
?? ??? ?for(i=Max-1; i>=0; i--)
?? ??? ?{
?? ??? ??? ?if(e[i]!=0)
?? ??? ??? ??? ?break;
?? ??? ?}
?? ??? ?printf("%s * %s = ",a,b);
?? ??? ?//反轉數組并輸出結果
?? ??? ?for(; i>=0; i--)
?? ??? ?{
?? ??? ??? ?printf("%d",e[i]);
?? ??? ?}
?? ??? ?printf("\n");
?? ?}
?? ?return 0;
}
總結
- 上一篇: 浅谈指令流水线
- 下一篇: windows获取系统补丁+匿名管道