資料結構:國際象棋 C++ 大數顯示
阿新 • • 發佈:2019-02-11
思考題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
}
}
}
}
功能程式碼其實沒那麼複雜,主要是為了將它輸出!!嘿嘿!