青少年软件编程(C语言)等级考试试卷(三级)

1.因子问题

因子问题

任给两个正整数N、M,求一个最小的正整数a,使得a和(M-a)都是N的因子。

时间限制:10000
内存限制:65536
输入
包括两个整数N、M。N不超过1,000,000。
输出
输出一个整数a,表示结果。如果某个案例中满足条件的正整数不存在,则在对应行输出-1
样例输入
35 10
样例输出
5
#include <stdio.h>
int main(int argc, char *argv[])
{
  int N,M,a=0,t;
  scanf("%d%d",&N,&M);
  t=M/2;
  for(a=1;a<=t;a++)
  {
      if( N%a==0 && (N%(M-a)==0) ) { t=-1; break; }
  }
  if(t!=-1) printf("-1
");
  else printf("%d
",a);
  return 0;
}

2.质数的和与积

质数的和与积

两个质数的和是S,它们的积最大是多少?

时间限制:10000
内存限制:65536
输入
一个不大于10000的正整数S,为两个质数的和。
输出
一个整数,为两个质数的最大乘积。数据保证有解。
样例输入
50
样例输出
589
#include <bits/stdc++.h>
int prime(int h)
{
     if(h < 2)
     {
       return 0;
     }
     for(int i=2;i<=h/2;++i)
     {
           if(!(h%i))return 0;
     }
    return 1;
}
int main( )
{ 
  int n;
  int max=0;
  int sj=1;
  int m;
  scanf("%d",&n);
  for(int i=2;i<n;++i)
  {
        if(prime(i))
        {
             m=n-i;
        
          if(prime(m))
          {
               sj=m*i;
             if(max<sj)max=sj;
          }
    }


}
printf("%d",max);


}

3.扩号匹配问题

扩号匹配问题
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注.
时间限制:3000
内存限制:65536
输入
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100
输出
对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?"和空格组成,"$"和"?"表示与之对应的左括号和右括号不能匹配。
样例输入
((ABCD(x)
)(rttyy())sss)(
样例输出
((ABCD(x)
$$
)(rttyy())sss)(
?            ?$
#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct node
{
    char ch[100];
    char sign[100];
    char index[100];
    int length;
}
Stack;
void init(Stack *&s,int n)
{
    s=(Stack*)malloc(n*sizeof(Stack));
    int i;
    for(i=0;i<n;i++)
    {
        s->ch[i]=' ';
        s->sign[i]=' ';
        s->index[i]=0;
    }
    s->length=0;
}
void push(Stack *&s,char ch ,int index)
{
    if(s->length<100)
    {
        s->ch[s->length]=ch;
        s->index[s->length]=index;
        if(ch=='(')
        s->sign[s->length]='$';
        if(ch==')')
        s->sign[s->length]='?';
    }
    s->length++;
}
void pop(Stack *&s,char ch,int index)
{
    if(s->length>0&&s->ch[s->length-1]=='(')
    {
        s->length--;
    }
    else
    {
    push(s,ch,index);
    } 
} 
 
int main()
{
    char str[101];
    char result[101];
    int i,j,k,len,index;
    Stack *s; 
    while(gets(str))
    {
        len = strlen(str);
        init(s,len);
        for(i=0;i<len;i++)
        {
            if(str[i]=='(')
            {
                push(s,str[i],i);
            }
            else if(str[i]==')')
            {
                pop(s,str[i],i);
            }
            else 
            {
                continue;
            }
        } 
        k = 0;
        for(j=0;j<len;j++)
        result[j]=' ';
        while(k<s->length)
        { 
          index = s->index[k];
          result[index]=s->sign[k];
          k++; 
        } 
        printf("%s
",str);
        for(i=0;i<len;i++)
        printf("%c",result[i]);
        printf("
");
        free(s);
    }
    return 0;
}

4.不会

5.铺砖

铺砖

对于一个2行N列的走道。现在用1*2,2*2的砖去铺满。问有多少种不同的方式。


时间限制:3000
内存限制:131072
输入

整个测试有多组数据,请做到文件底结束。每行给出一个数字N,0 <= n <= 250

输出

如题

样例输入
2
8
12
100
200
样例输出
3
171
2731
845100400152152934331135470251
10712920295059935170279747282274417350148
#include<iostream>
#include<cstdio>
using namespace std;
int a[301][501];
int max(int x,int y){return x>y?x:y;}
int main()
{
    a[1][0]=1;
    a[1][1]=1;
    a[2][0]=1;
    a[2][1]=3;
    for(int i=3;i<=300;i++)
    {
        for(int j=1;j<=max(a[i-2][0],a[i-1][0]);j++)
        {
            a[i][j]=a[i-1][j]+a[i-2][j]*2;
        a[i][0]=max(a[i-2][0],a[i-1][0]);
        }
        for(int j=1;j<=a[i][0];j++)
        {
            a[i][j+1]+=a[i][j]/10;
            a[i][j]%=10;
        }
        while(a[i][a[i][0]+1])
        {
            a[i][0]++;
            a[i][a[i][0]+1]+=a[i][a[i][0]]/10;
        }
    }
    int n;
    while(cin>>n)
    {
        if(n==0)
        {
          cout<<1<<endl;
        }
        else
        {
            for(int i=a[n][0];i>=1;i--)
            {
              cout<<a[n][i];
            }
            cout<<endl;
        }
    }
}

就这样。

原文地址:https://www.cnblogs.com/iamxuwu/p/13660079.html