[算法設計與分析]3.2.3數組記錄狀態信息(互不相同的9位數+圓圈報數遊戲)

#include<stdio.h>
#include<iostream>
#include<string.h>

using namespace std;

void Different();
void CircleGame();
int main()
{
    Different();
    CircleGame();
}

void Different()
{
    long y1, y2;
    int p[10], num = 0, t, k;
    for(long x = 10000; x < 32000; x++)
    {
        for(int i = 0; i <= 9; i++)
        {
            p[i] = 1;
        }
        y1 = x * x;
        y2 = y1;
        k = 0;
        for(int i = 1; i <= 9; i++)
        {
            t = y2 % 10;
            y2 /= 10;
            if(p[t] == 1)
            {
                k++;
                p[t] = 0;
            }
            else
                break;
        }
        if(k == 9)
        {
            num++;
            cout << "No." << num << ":    n=" << x << "      n^2=" << y1 << endl;
        }
    }
}

void CircleGame()
{
    int n = 4;//假設12個小孩
    int interval = 2;//假設每七個數除去一人 即報7的人出圈
    int a[100];
    int k = 0;//k表示開始報數的人的編號及狀態數組的下標變量
    int p;//表示已退出圈外的人數

    for(int i = 1; i <= n; i++)
    {
        a[i] = 1;//表示該位置上的孩子參與計數 對全部元素進行初始化
    }
    p = 0;
    int x;//x表示正在報的數
    while(p < n - 1)//因爲p代表退出圈外的人數因此當p=n-1時結束循環 此時圈中還剩下一個人
    {
        x = 0;//每次都要對x進行初始化
        while(x < interval)//x<7的時候
        {
            k++;//代表下一個人開始報數
            if(k > n)//構成一個圈
                k = 1;
            x += a[k];//若是a[k]上對應的已經出圈 則a[k]=0此時對x無影響
        }
        printf("%d  ", k);
        a[k] = 0;
        p++;
    }
    for(int i = 1; i <= n; i++)
    {
        if(a[i] == 1)
            printf("\n\nwinner is %d", i);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章