1. 程式人生 > >資料結構:國際象棋 C++ 大數顯示

資料結構:國際象棋 C++ 大數顯示

思考題1:國際象棋是很久以前由一個印度人Shashi發明的,當他吧該發明獻給國王時,國王很高興,就許諾可以給這個發明人任何他想要的獎賞,Shashi要求以這種方式給他一些糧食:棋盤的第1個方格內只放1粒麥粒,第2格2粒,第3格4粒,第4格8粒,以此類推,直到64個方格全部放滿。這個獎賞的最終結果會是什麼樣呢?
這裡寫圖片描述
思路:題目主要圍繞的數大數展開的,應該單個2的63次方已經很大了

int的範圍:  2147483648~2147483647 
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:18446744073709551615

這裡,你可能要說unsigned long long型別也挺大的嘛!不過筆者通過程式實現了下2^64還比unsigned long long的最大值大一個(雖然我們求的最大值是2^63次方但要求總和,勢必不夠放的)!這裡筆者打算用int型別的陣列去解決。

上全部的程式碼:

/*大數計算int型別的陣列,次方*/
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue> using namespace std; int Array1[500];//全域性變數的陣列初始化的時候第一個單元的值為1 //int Array2[500]; int Sum[500]; int Num=0; void Add() {//將兩個大數相加 for (int i = 0; i < 500;i++) { Sum[i] += Array1[i]; } for (int j = 0; j < 500; j++) { if (Sum[j] > 9) {//大於9就進位 Sum[j + 1
] += Sum[j] / 10; Sum[j] %= 10;//如果是10的話進上去後直接為0 } } /*輸出Array的值*/ cout << "第"<<Num<<"個棋盤上的數目為:"<< endl; int t = 0; for (int i = 499; i >= 0; i--) { if (Array1[i] != 0) { t = i; break; } } //cout << "t:" << t << endl; for (int i = t; i >= 0; i--) { cout << Array1[i]; } cout << endl; /*輸出最終總和Sum的結果*/ cout <<"從第1棋盤到第"<<Num<<"棋盤的總數為:" << endl; t = 0; for (int i = 499; i >= 0; i--) { if (Sum[i] != 0) { t = i; break; } } //cout << "t:" << t << endl; for (int i = t; i >= 0; i--) { cout << Sum[i]; } cout << endl; memset(Array1, 0, sizeof(Array1)); Array1[0] = 1; } void SumFun(int n){//求第n個格子中的數目 for (int i = 0; i < n-1; i++) {//第一個for迴圈時次方的次數 for (int j = 0; j < 500; j++) { Array1[j] *= 2; } for (int j = 0; j < 500; j++) { if (Array1[j]>9) {//大於9就進位 Array1[j + 1] += Array1[j] / 10; Array1[j] %= 10;//如果是10的話進上去後直接為0 } } } } int main(){ memset(Sum, 0, sizeof(Sum)); memset(Array1, 0, sizeof(Array1)); Array1[0] = 1; for (int i = 1; i <=64;i++) { Num = i; SumFun(i); Add(); } /*輸出最終總和Sum的結果*/ cout << "最後的結果為:" << endl; int t = 0; for (int i = 499; i >= 0; i--) { if (Sum[i] != 0) { t = i; break;// } } //cout << "t:" << t << endl; for (int i = t; i >= 0; i--) { cout << Sum[i]; } cout << endl; return 0; }

程式碼思路:就是先求出第i個格子的數目Array1陣列去記錄,通過Sum函式記錄從第1個到第i個的總的數目。最後將Sum陣列輸出。

功能程式碼:求第i個格子的數目
void SumFun(int n){//求第n個格子中的數目 
memset(Array1, 0, sizeof(Array1));
    Array1[0] = 1;
    for (int i = 0; i < n-1; i++) {//第一個for迴圈時次方的次數
        for (int j = 0; j < 500; j++) {
            Array1[j] *= 2;
        }
        for (int j = 0; j < 500; j++) {
            if (Array1[j]>9) {//大於9就進位
                Array1[j + 1] += Array1[j] / 10;
                Array1[j] %= 10;//如果是10的話進上去後直接為0
            }
        }
    }
}

功能程式碼其實沒那麼複雜,主要是為了將它輸出!!嘿嘿!