栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

刷PAT啦1008~1010

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

刷PAT啦1008~1010

目录

1008 数组元素循环右移问题

1009.说反话

1010. 一元多项式求导


1008 数组元素循环右移问题

解题:方法一和方法二    (就是轮转数组的问题)

有一个小细节:假设共 5 个数,轮转13 次,这里前十次轮转后数据并不会有变化,

只有最后三次真正在轮转,所以轮转 13 次,和轮转 3 次效果一样。

因此,轮转前处理一下数据,(取余)设共sum个数,轮转 N 次,N = N % sum; 

方法一:轮转一次,然后轮转N次

轮转一次就是将首数据挪到最后,剩余数据向前移。

图解(假设要轮转三次)

#include
void 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 

方法二:三次逆序(很妙)

先 将 要 轮 转 的 数 据 逆 序,再 将 剩 余 数 据 逆 序,再 将 整 句 逆 序 。

图解(假设要轮转三次)

#include
void NIXU(int *arr,int left,int right)          //一个正常的逆序函数
{
    for(;left 

1009.说反话

 

方法一:先逐个单词逆序,再整句逆序

( 注:遍历到空格时尽量不要对空格进行操作,防止遍历完,句子头部出现空格。 )

 

#include
void 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  )

(但是为什么有这个限制,我也不太清楚,请大佬们指教)

测试用例 :

运行结果 :  

细节二:题目要求输出最后数据尾部没有空格

因为,我是每组分别输出;所以,第一组的输出尾部没有空格,后面的每组在头部添加空格

代码如下:

#include
int 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!!!

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/861546.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号