刷PAT啦1008~1010

目录

1008 数组元素循环右移问题

1009.说反话

1010. 一元多项式求导


1008 数组元素循环右移问题

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

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

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

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

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

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

图解(假设要轮转三次)

#include<stdio.h>
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<sum;i++)
    {
        scanf("%d",arr+i);
    }
    for(int i = 0;i<number;i++)
    {
        Rotate(arr,sum);           //轮转 N 次
    }
    for(int i = 0;i<sum;i++)
    {
        printf("%d",*(arr+i));
        if(i!=sum-1)               //避免打印最后空格
            printf(" ");
    }
    return 0;
}

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

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

图解(假设要轮转三次)

#include<stdio.h>
void NIXU(int *arr,int left,int right)          //一个正常的逆序函数
{
    for(;left<right;left++,right--)
    {
        int tem = arr[left];
        arr[left] = arr[right];
        arr[right] = tem;
    }
}
int main()
{
    int arr[100] = { 0 };
    int sum = 0;
    int number = 0;
    scanf("%d%d", &sum, &number);
    number = number%sum;                   //处理下数据
    for (int i = 0; i < sum; i++)          //(防止多次无效循环)
    {
        scanf("%d", arr + i);
    }
    NIXU(arr, 0, sum - number - 1);        //剩余数据逆序
    NIXU(arr, sum - number, sum - 1);      //二次:轮转数据逆序
    NIXU(arr, 0, sum - 1);                 //整体逆序
    for (int i = 0; i < sum; i++)
    {
        printf("%d", arr[i]);
        if (i != sum-1)                    //防止最后打印空格
        printf(" "); 
    }
    return 0;
}

1009.说反话

 

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

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

 

#include<stdio.h>
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] != '\0'; right++)
    {   
        //遇到空格将前的单词进行逆序,遇到'\0'进行最后一次逆序
        if (arr[right + 1] == ' ' || arr[right + 1] == '\0')
        {
            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<stdio.h>
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!!!

 

 

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值