[算法设计与分析]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);
    }
}

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