S22课堂作业(凯撒加密),自己写的,没看鱼哥的答案,发完贴就去看了
本帖最后由 qq1242009750 于 2017-12-8 15:57 编辑步数说明图和算法思想在文章的尾部
template <typename T1>
void ClassWork(T1* &head, int num)
{
if (head == NULL)
{
cout << setw(10) << setfill('*') << "Error!" << endl;
return;
}
T1 *tmp = head;
num = num % 26; //计算开始的字符
if (num < 0) //判断正负
{
for (int i = 25 - ((-num) + 1); i <= 25; ++i) //赋值
{
tmp->data = 'A' + i;
tmp = tmp->Next;
}
//赋值前面的字母 因为前面从 num+1 开始赋值的 ,所以 只剩下 0 到 num 没有赋值
for (int i = 0; i <= 25 - (-num); i++)
{
tmp->data = 'A' + i;
tmp->Next;
}
}
else
{
for (int i = num; i <= 25; i++) //赋值
{
tmp->data = 'A' + i;
tmp = tmp->Next;
}
if (num != 0) //判断 num 是否为零 如是则表示 是全部赋值, 不是 则表示从 num 开始赋值
{
//赋值前面的字母 因为前面从num 开始赋值, 所以只剩下 0 到 num-1 没赋值
for (int i = 0; i <= num - 1; i++)
{
tmp->data = 'A' + i;
tmp = tmp->Next;
}
}
}
}
算法思想:
1.一共有26个元素
2.字母的下标为 0 到 25
3.num%=26表示 去除环数,获取移动的步数
4.如果num为正,例如 3 则表示从第四个元素开始对链表赋值,而'A' + 3 == 'D',所以从'A' + num(因为下标从0开始,而3正好是第4个元素)开始赋值,到了'Z'后,就从'A' + 0 到 'A' + num - 1 赋值到链表
5.如果num为负,例如 -3 则表示从倒数第3个元素开始赋值 ,因为一开始就指向倒数第一个元素,所以只要走 25 -((-num)+1)次,+1表示 减去1次行走的分量, 所以从'Z' - 2 开始赋值,到了'Z',就从 'A' + 0 到 'A' + 22 赋值
以上是本人的不才之见,如有错误,请多多指出 谢谢。{:5_92:} 棒棒! 牛啊
页:
[1]