寒假练习一

题目:

D-Sort

AC代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;

int a[1000005];//这里要定义全局变量,否则会超时
bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
   //int a[1000005]如果这样定义会出现爆栈的情况,此时不能正常输入
   int n,m;
   while(~scanf("%d %d",&n,&m))
   {
     for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
     sort(a,a+n,cmp);//从大到小排序
     printf("%d",a[0]);//输出格式调整
     for(int i=1;i<m;i++)
        printf(" %d",a[i]);
     printf("\n");
   }
    return 0;
}

注:

   局部变量分配在栈区。
   全局变量内存分配在自由分配区;

F - 海选女主角

AC代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;

int a[100][100];
int main()
{
    int n,m;
    while(~scanf("%d %d",&n,&m))
    {
        int max1=-1;
        int row,line;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
              scanf("%d",&a[i][j]);
              if(abs(a[i][j])>abs(max1))//这里要注意是与max1的绝对值进行比较·
                {
                    max1=a[i][j];
                    line=i;//行
                    row=j;//列
                }
            }
        printf("%d %d %d\n",line,row,max1);
    }
    return 0;
}

G - C语言合法标识符

AC代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

char a[1005];
int main()
{
    int n;
    scanf("%d",&n);
    getchar();
    while(n--)
    {
        gets(a);
        int flag=0;
        if(!(a[0]>='A'&&a[0]<='Z'||a[0]>='a'&&a[0]<='z'||a[0]=='_'))
            flag=1;
        else
        {
            for(int i=0;i<strlen(a);i++)
            {
                if(a[i]>='A'&&a[i]<='Z'||a[i]>='a'&&a[i]<='z'||a[i]=='_'||a[i]>='0'&&a[i]<='9')
                    continue;//就是continue的巧妙用处
                else
                    flag=1;
            }
        }
        if(flag==0)
            printf("yes\n");
        else
            printf("no\n");
    }
    return 0;
}

K - Lowest Common Multiple Plus

AC代码:
方法一:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

int main()
{
    int n;
    int a[1005];
    while(~scanf("%d",&n))
    {
        int max1=0;
        int flag=0;
        for(int i=0;i<n;i++)
        {
            scanf(" %d",&a[i]);
            if(a[i]>max1)
                max1=a[i];
        }
        for(int i=max1;;i++)
        {
            flag=0;//flag这里要不断初始化
            for(int j=0;j<n;j++)
            {
                if(i%a[j]==0)
                    flag++;
            }
            if(flag==n)
            {
                printf("%d\n",i);
                 break;
            }
        }
    }
    return 0;
}

AC代码:
方法二:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

int Gcd(int a,int b)//求最小公约数
{
    return b==0?a:Gcd(b,a%b);
}
int Lcm(int a,int b)//求最小公倍数
{
    return a/Gcd(a,b)*b;
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int m;
        int a,b;
        if(n==1)
        {
            scanf("%d",&m);
            printf("%d\n",m);
        }
        else
        {
            for(int i=0;i<n;i++)//多个一次两个求最小公倍数
            {
                scanf("%d",&b);
                if(i==0)
                    a=b;
                else
                    a=Lcm(a,b);
            }
            printf("%d\n",a);
        }
    }
    return 0;
}

注:求最小公约数可以使用C++的内置函数 “__gcd(a,b)”;

L - Palindromes _easy version

AC代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

char a[1005];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        getchar();
        while(n--)
        {
            gets(a);
            int count1=0;
            int len=strlen(a);
            for(int i=0;i<len/2;i++)
            {
                if(a[i]==a[len-1-i])//就是将单词对半比较
                    count1++;
            }
            if(count1==len/2)
                printf("yes\n");
            else
                printf("no\n");
        }
    }
    return 0;
}

代码二:
不知道为什么这个代码在VJ上会出现这样的错误。
在这里插入图片描述
问了同学之后,发现要用G++提交,就AC了。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

string a;
string b;
int main()
{
    int n;
    scanf("%d",&n);
    getchar();
    while(n--)
    {
        getline(cin,a);
        b=a;
        reverse(a.begin(),a.end());
        if(a==b)
            printf("yes\n");
        else
            printf("no\n");
    }
    return 0;
}

M - 汉字统计

知识点:
汉字内码(机内码)
(1)概念:在计算机内部表示汉字的代码。
(2)特点:汉字内码采用两个字节,一个汉字占两个ASCII字符;汉字内码最高位为1,ASCII码最高位为0
(3)汉字内码与区位码的关系:
汉字内码高位字节=(区号)16+(A0)16
汉字内码低位字节=(位号)16+(A0)16
例:汉字“啊”的区位码为1601,则其汉字内码为(B0A1)16。

所以,每个汉字都是小于0的。非汉字都是大于0的。而每个汉字占用两个字节,最后count1要除以二。

AC代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

char a[1005];
int main()
{
    int n;
    scanf("%d",&n);
    getchar();
    while(n--)
    {
        gets(a);
        int count1=0;
        for(int i=0;i<strlen(a);i++)
        {
            if(a[i]<0)
                count1++;
        }
        printf("%d\n",count1/2);
    }
    return 0;
}

N - 进制转换

知识点:
进制转换和栈一样“先进后出”。
栈的基本操作:
头文件:#include
操作:
定义栈:stacks;
放入栈顶:s.push(item);
返回栈顶元素:s.top();//不会删除
删除栈顶元素:s.pop();//不会返回
返回栈中元素个数:s.size();
检查栈是否为空:s.empty();//为空返回true,否则返回false
AC代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;

int main()
{
    stack<int>a;
    int n,m,i;
    while(~scanf("%d %d",&n,&m))
    {
        if(n<0)
        {
            n=-n;
            printf("-");
        }
        while(n)//进制转换的过程
        {
            a.push(n%m);
            n=n/m;
        }
        while(!a.empty())
        {
            i=a.top();//取栈顶元素
            a.pop();//删除栈顶元素
            char b;
            if(i>9)
            {
                b=i-10+'A';
                printf("%c",b);
            }
            else
                printf("%d",i);
        }
        printf("\n");
    }
    return 0;
}

O - 杨辉三角

AC代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;

int a[105][105];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        memset(a,0,sizeof(a));
       /* for(int i=0;i<n;i++)这一段是w了一次的,这是错误的。
        {
            a[i][0]=1;
            for(int j=1;j<n;j++)
            {
                a[i][j]=a[i-1][j-1]+a[i-1][j];
            }
        }*/
        for(int i=0;i<n;i++)
            a[i][0]=1;
        for(int i=1;i<n;i++)
        {
            for(int j=1;j<n;j++)
            {
                a[i][j]=a[i-1][j-1]+a[i-1][j];
            }
        }
        for(int i=0;i<n;i++)
        {
            printf("%d",a[i][0]);
            for(int j=1;j<=i;j++)
                printf(" %d",a[i][j]);
            printf("\n");
        }
        printf("\n");
    }
    return 0;
}

R - 人见人爱A^B

AC代码:
暴力解题法:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;

int main()
{
    int n,m;
    while(~scanf("%d %d",&n,&m)&&n&&m)
    {
        int sum=n;
        for(int i=1;i<m;i++)
            sum=(sum*n)%1000;
        printf("%d\n",sum%1000);
    }
    return 0;
}

快速幂法:
知识点:
快速幂方法:就是先算a²,然后继续算(a²)²,一直算到n次幂。
模板一:

int fastpow(int a,int n)
{
    if(n==1)
        return a;
    int temp=fastpow(a,n/2);//分治
    if(n%2==1)//if(n&1)
        return temp*temp*a;
    else
        return temp*temp;//偶数个a
}

模板二:

int fastpow(int a,int n)
{
    int res=1;
    while(n)
    {
        if(n&1)//如果N的最后一位是1,表示这个地方需要乘
            res*=a;
        a*=a;//推算乘积 a²--->(a²)²-->
        n>>=1;//n右移一位,把刚处理过的n的最后一位去掉
    }
    return res;
}
与运算可以判断n是否为偶数,如果是偶数,返回0,否则返回1

快速幂取模:

int fastpow(int a,int n)
{
    int res=1;
    while(n)
    {
        if(n&1)//如果N的最后一位是1,表示这个地方需要乘
            res=(res*a)%mod;
        a=(a*a)%mod;//推算乘积 a²--->(a²)²-->
        n>>=1;//n右移一位,把刚处理过的n的最后一位去掉
    }
    return res;
}
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;

int fastpow(int a,int n)
{
    int res=1;
    while(n)
    {
        if(n&1)//如果N的最后一位是1,表示这个地方需要乘
            res=(res*a)%1000;
        a=(a*a)%1000;//推算乘积 a²--->(a²)²-->
        n>>=1;//n右移一位,把刚处理过的n的最后一位去掉
    }
    return res;
}
int main()
{
    int n,m;
    while(~scanf("%d %d",&n,&m)&&n&&m)
    {
        int t=fastpow(n,m);
        printf("%d\n",t);
    }
    return 0;
}

在这里插入图片描述
不知道怎么又出现这个问题了?

S - Text Reverse

AC代码:
方法一:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;

char a[1005];
int main()
{
    int n;
    scanf("%d",&n);
    getchar();
    while(n--)
    {
        gets(a);
        int len=strlen(a);
        for(int i=0;i<len;i++)
        {
            if(a[i]==' ')//遇到空格的时候
            {
                for(int j=i-1;;j--)
                {
                    if(j==-1)//一个单词的时候
                        break;
                    if(a[j]==' ')//多个单词的时候
                        break;
                    printf("%c",a[j]);
                }
                printf(" ");
            }
            if(i==len-1)//最后一个单词
            {
                for(int j=len-1;;j--)
                {
                    if(a[j]!=' ')
                        printf("%c",a[j]);
                    if(j==-1)//忽略了只有一个单词的时候
                        break;
                    if(a[j]==' ')
                        break;
                }
                printf("\n");
            }
        }

    }
    return 0;
}

方法二:
使用栈实现

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;

int main()
{
    int n;
    char ch;
    scanf("%d",&n);
    getchar();
    while(n--)
    {
        stack<char>s;
        while(true)
        {
            ch=getchar();
            if(ch==' '||ch=='\n'||ch=='\0')
            {
                while(!s.empty())
                {
                    printf("%c",s.top());
                    s.pop();
                }
                if(ch=='\n'||ch=='\0')
                    break;
                printf(" ");
            }
            else
                s.push(ch);//入栈
        }
        printf("\n");
    }
    return 0;
}

总结:这些题目其实以前都已经做过了,但是再次来做的时候,发现还是有些不会。但是第二次来做的时候,会发现其他方法。从中学习到了新的知识点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值