標籤

BAT (38) shell (34) Virtual Machine (33) Xubuntu (29) acfs (25) PHP (24) CentOS (21) Virtul Box (20) 編輯器 (17) 資料庫 (15) lubuntu (13) windows (13) CPP (12) ubuntu (12) chrome (11) laravel (10) Docker (9) Python (9) 5A88 (7) VMware (6) 資料結構 (6) Javascript (5) Node (5) Proxmox VE (5) 公告系統 (5) 程式積木 (5) Android Studio (4) ANN (3) OB2D2016x64 (3) Xoops (3) clonezilla (3) samba (3) 公文 (3) 其他 (3) 硬體 (3) API (2) Android (2) AppInvent2 (2) Html (2) Hyper-V (2) Nas (2) botnet (2) mbot (2) swift (2) wordpress (2) 樣板 (2) 防火牆 (2) AD的應用 (1) Ansible (1) Arduino (1) CSS (1) GitLab (1) HA Proxy (1) LegoEV3 (1) PowerShell (1) Scratch (1) VM (1) XenServer (1) kotlin (1) linuxmint (1) lxc (1)

2020年7月6日 星期一

C++程式_大整數乘法問題

20200817
終於思考完畢,現在將程式碼寫下
現在為了讓其程式碼有其應用性,讓程式碼讀取config.txt,將程式結果寫入result.txt

程式碼如下:
檔名:config.txt
內容:
#第一個大整數位數(請不要超過100位數。若要超過,請修改原始碼)
9
#第一個大整數(987654321)
9 8 7 6 5 4 3 2 1
#第二個大整數位數(請不要超過100位數。若要超過,請修改原始碼)
11
#第二個大整數(97325678901)
9 7 3 2 5 6 7 8 9 0 1

檔名:BigNumMulti.cpp
內容:
#include <math.h>
#include <iostream>
#include <fstream>
using namespace std;
#define SIZE 100
int main() {
char BigNum1Mark[SIZE];
char BigNum1SizeMark[SIZE]; 
int num1size=0;
int num1[SIZE]={0};

char BigNum2Mark[SIZE];
char BigNum2SizeMark[SIZE];
int num2size=0;
int num2[SIZE]={0};
int num3size=0;
int num3[SIZE+SIZE] = {0};
//int i,j,k,ki,kj,kk,temp;
int i,j,k,temp;
/*讀取設定檔config.txt,並將設定寫入變數*/
    ifstream fin("config.txt"); 
    ofstream fout("result.txt"); 
    if(!fin) { 
        cout << "無法讀入檔案\n";
fout << "無法讀入檔案\n"; 
        return 1; 
    }
    fin >> BigNum1SizeMark;
    fout << BigNum1SizeMark <<"\n";
    fin >> num1size;
    fout <<num1size<<"\n";
    if (num1size>=SIZE) {
    cout << "Error,the Size >= 100.Please fix the source code!!";
    fout << "Error,the Size >= 100.Please fix the source code!!"<<"\n";
}
fin >> BigNum1Mark;
fout << BigNum1Mark<<"\n";
    for(i=num1size-1;i>=0;i--) {
      fin >> num1[i];
      fout << num1[i];
}
fout <<"\n";
fin >> BigNum2SizeMark;
fout << BigNum2SizeMark<<"\n";
    fin >> num2size;
    fout << num2size<<"\n";
    if (num2size>=SIZE) {
    cout << "Error,the Size >= 100.Please fix the source code!!";
    fout << "Error,the Size >= 100.Please fix the source code!!"<<"\n";
}
    fin >> BigNum2Mark;
    fout << BigNum2Mark<<"\n";
for(j=num2size-1;j>=0;j--) {
      fin >> num2[j];
  fout << num2[j];
}
    fout <<"\n";
    fin.close();
    
num3size=num2size+num1size;
fout << "#兩個大整數相乘之後,所得的大整數之位數"<<"\n";
    fout << num3size<<"\n";
    
for(i=0;i<num1size;i++) {
for (j=0;j<num2size;j++) {
num3[i+j] = num3[i+j]+num1[i]*num2[j];
if (num3[i+j]>=10) {
temp = num3[i+j];
num3[i+j] = temp%10;
num3[i+j+1] = num3[i+j+1]+(temp/10)%10; 
}
}
}
fout << "#兩個大整數相乘之後,所得的大整數"<<"\n";
for(k=num3size-1;k>=0;k--) {
fout <<num3[k];
    }
    fout <<"\n";   
    fout.close();
    return 0;
}
最後產生的結果
檔案:result.txt
內容:
#第一個大整數位數(請不要超過100位數。若要超過,請修改原始碼)
9
#第一個大整數(987654321)
987654321
#第二個大整數位數(請不要超過100位數。若要超過,請修改原始碼)
11
#第二個大整數(97325678901)
97325678901
#兩個大整數相乘之後,所得的大整數之位數
20
#兩個大整數相乘之後,所得的大整數
96124127310831181221

下面程式碼只處理[大整數乘法問題]
#include <math.h>
#include <iostream>
using namespace std;
#define SIZE 100
int main() {
int num1[SIZE]={9,8,7,6,5,4,3,2,1};
//num1 is 123456789
int num2[SIZE]={9,7,3,2,5,6,7,8,9,0,1};
//num2 is 10987652379
int num3[SIZE+SIZE] = {0};
int i,j,k,temp;
for(i=0;i<SIZE;i++) {
for (j=0;j<SIZE;j++) {
num3[i+j] = num3[i+j]+num1[i]*num2[j];
if (num3[i+j]>=10) {
temp = num3[i+j];
num3[i+j] = temp%10;
num3[i+j+1] = num3[i+j+1]+(temp/10)%10; 
}
//cout <<"num3["<<i+j<<"]="<<num3[i+j]<<" "; 
}
//cout <<"\n";
}
for(k=SIZE+SIZE-1;k>=0;k--) {
cout <<num3[k] <<" ";
    }
}


以下是思考過程:
20200706
      終於提起筆來寫這道題。
首先先思考 1 位數x 1 位數
接下來,我們把這些思考寫成程式碼如下:
#include <math.h>
#include <iostream>
using namespace std;
int main() {
int num1[1]={7};
int num2[1]={9};
int num3[2];
num3[0] = num1[0]*num2[0]%10;
num3[1] = (num1[0]*num2[0]/10)%10; 
    cout << num3[1]<<num3[0]<<"\n";
    return 0;
}

接下來,思考 2 位數x 1 位數
#include <math.h>
#include <iostream>
using namespace std;
int main() {
int num1[2]={7,5};
int num2[1]={9};
int num3[3];
int temp01,temp02;
num3[0] = num1[0]*num2[0]%10;
num3[1] = (num1[0]*num2[0]/10)%10+(num1[1]*num2[0]%10); 
num3[2] = (num1[1]*num2[0]/10)%10;
        //處理中間位數進位問題
if (num3[1]>=10) {
temp01 = num3[1]%10;
temp02 = (num3[1]/10)%10;
num3[1] = temp01;
num3[2] = num3[2]+temp02; 
}
    cout << num3[2]<< num3[1]<<num3[0]<<"\n";
    return 0;
}

接下來,思考 2 位數x 2 位數

#include <math.h>
#include <iostream>
using namespace std;
int main() {
int num1[2]={7,5};
int num2[2]={9,3};
int num3[4];
int temp01[2],temp02[2];
num3[0] = num1[0]*num2[0]%10;
num3[1] = (num1[0]*num2[0]/10)%10+(num1[1]*num2[0]%10)+(num1[0]*num2[1]%10); 
num3[2] = (num1[1]*num2[0]/10)%10+(num1[0]*num2[1]/10)%10+num1[1]*num2[1]%10;
    num3[3] = (num1[1]*num2[1]/10)%10;
//處理中間位數進位問題 
if (num3[1]>=10) {
temp01[0] = num3[1]%10;
temp02[0] = (num3[1]/10)%10;
num3[1] = temp01[0];
num3[2] = num3[2]+temp02[0]; 
}
if (num3[2]>=10) {
temp01[1] = num3[2]%10;
temp02[1] = (num3[2]/10)%10;
num3[2] = temp01[1];
num3[3] = num3[3]+temp02[1]; 
}
    cout << num3[3]<< num3[2]<< num3[1]<<num3[0]<<"\n";
    return 0;
}

資料來源:


沒有留言:

張貼留言

在 Windows 10 x64 1909版,使用BAT快速安裝公文系統與人事服務網(自然人憑證)版

相關內容移往 https://skjhcreator.blogspot.com/2021/02/windows-10-x64-1909bat.html