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; } } }
就这样。