UVa1583,UVa1584(环形数组)

UVa1583

感觉这题就是暴力就好了,定义个100001的数组,对1-100000的每个数a1分解每一位然后相加,数组中下标为相加所得的数的那一位改为a1即可,最后输入,查表,输出。
代码如下:

#include <iostream>

using namespace std;

int flag[100001];
void begin()
{
    int i, j;
    int x;
    for (i = 0; i <= 100001; i++)
    {
        flag[i] = 0;
    }
    for (i = 0; i <= 100001;i++)
    {
        x = i;
        j = i;
        while (x > 0)
        {
            j += x % 10;
            x = x / 10;
        }
        if (flag[j] == 0)
            flag[j] = i;
    }
}
int main()
{
    int N;
    int judge;
    begin();
    cin >> N;
    for (int i = 0; i < N; i++)
    {
        cin >> judge;
        cout << flag[judge]<<endl;
    }
    //system("pause");
    return 0;
}

UVa1584

这题需要用到环形数组,其实就是取模运算,对每一个输入串,从0下标开始的环形串与1下标开始的环形串逐位比较,发现不同,则返回一个bool值,不断更新最小值,最后输出

代码:

#include <iostream>
#include <string>

using namespace std;

//环状数组 (i+j)%len

/*int test[5] = { 1,2,3,4,5 };

void testRing()
{
    for (int i = 0; i < 5; i++)
    {
        cout << test[i];
        for (int j = 1; j <= 4; j++)
        {
            cout << test[(i + j) % 5];
        }
        cout << endl;
    }
}*/
bool judge(const string input, int p, int minPos) //p为需要与最小环比较的环,p更小的话返回1,否则返回0
{
    int len = (int)input.size();
    for (int i = 0; i < len; i++) //逐一位比较
    {
        if (input[(p + i) % len] != input[(minPos + i) % len])
            return input[(p + i) % len] < input[(minPos + i) % len];
    }
    //全部相等,结束循环
    return 0;
}
int main()
{
    int n;
    cin >> n;
    string input;
    for (int start = 0; start < n; start++)
    {
        cin >> input;
        int len = (int)input.size();
        int minPos = 0; //定义最小环的起始位置
        for (int i = 1; i < len; i++)
        {
            //判断各个环的字典序
            minPos = judge(input, i, minPos) ? i : minPos;
            //输出目前最小环
            /*for (int j = 0; j < len; j++)
            {
            cout << input[(minPos + j) % len];
            }
            cout << endl;*/
        }
        //cout << endl;
        //输出最小环
        for (int i = 0; i < len; i++)
        {
            cout << input[(minPos + i) % len];
        }
        cout << endl;
    }
    //system("pause");
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值