您的位置:首页 > 其它

UVa1583,UVa1584(环形数组)

2018-01-26 12:02 274 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: