目录
1008 数组元素循环右移问题
1009.说反话
1010. 一元多项式求导
1008 数组元素循环右移问题
解题:方法一和方法二 (就是轮转数组的问题)
有一个小细节:假设共 5 个数,轮转13 次,这里前十次轮转后数据并不会有变化,
只有最后三次真正在轮转,所以轮转 13 次,和轮转 3 次效果一样。
因此,轮转前处理一下数据,(取余)设共sum个数,轮转 N 次,N = N % sum;
方法一:轮转一次,然后轮转N次
轮转一次就是将首数据挪到最后,剩余数据向前移。
图解(假设要轮转三次)
#includevoid Rotate(int *arr,int sum) //轮转一次 { int tem = *(arr); //这里要注意先将首元素存储,防止后来被覆盖 *(arr) = *(arr+sum-1); int i = 0; for(i = sum-1;i>1;i--) { arr[i] = arr[i-1]; } *(arr+i) = tem; } int main() { int number = 0; int sum = 0; scanf("%d%d",&sum,&number); number = number%sum; //处理数据 int arr[101] = {0}; for(int i = 0;i 方法二:三次逆序(很妙)
先 将 要 轮 转 的 数 据 逆 序,再 将 剩 余 数 据 逆 序,再 将 整 句 逆 序 。
图解(假设要轮转三次)
#includevoid NIXU(int *arr,int left,int right) //一个正常的逆序函数 { for(;left 1009.说反话
方法一:先逐个单词逆序,再整句逆序
( 注:遍历到空格时尽量不要对空格进行操作,防止遍历完,句子头部出现空格。 )
#includevoid reverse(char* arr, int left, int right) //逆序函数 { for (; left < right; left++, right--) { char tem = arr[left]; arr[left] = arr[right]; arr[right] = tem; } } int main() { char arr[81]; scanf("%[^n]", arr); //scanf 的这种写法, int right = 0; //可以将空格也读取到字符串中 int left = 0; for (; arr[right] != ' '; right++) { //遇到空格将前的单词进行逆序,遇到' '进行最后一次逆序 if (arr[right + 1] == ' ' || arr[right + 1] == ' ') { reverse(arr, left, right); left = right + 2; //每次逆序完,要跳过空格 } } reverse(arr, 0, right - 1); printf("%s", arr); return 0; } 1010. 一元多项式求导
(解释) 输入:3 的 4次方 || -5 的 2 次方 || 6 的 1 次方 || -2 的 0 次方
(一下) 输出: 12 ^ 4 -10 ^ 1 6 ^ 0
思路:这里观察发现规律 ,传入 a b 输出 a*b b-1
实现细节:
细节一:(这里哈,在做的时候就发现老是过不去,之后找了答案,发现这道题他有一些限制)
限制1:如果,a*b == 0,并且a和b第一组时,需要打印 0 0
限制2:如果,a*b == 0,但是a和b不是第一组时,就不需要打印
(我又测试了一下,只有第一组打印0 0 )
(但是为什么有这个限制,我也不太清楚,请大佬们指教)
测试用例 :
运行结果 :
细节二:题目要求输出最后数据尾部没有空格
因为,我是每组分别输出;所以,第一组的输出尾部没有空格,后面的每组在头部添加空格
代码如下:
#includeint main() { int a = 0; int x = 0; for (int i = 0; scanf("%d%d", &a, &x) != EOF;) { if (0 == i) //判断是否是第一组 { if(a*x == 0) //判断是否为 0 printf("0 0"); else printf("%d %d", a * x, x - 1); } else if(a*x != 0) //如果不是第一组,就不打印 0 0 { printf(" %d %d", a * x, x - 1); } i++; } return 0; } 最后,感谢各位大佬看到这里!!!(如有不对或应更好的地方请指正哦)
栓 Q!!!



