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\n"); else printf("%d\n",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\n",str); for(i=0;i<len;i++) printf("%c",result[i]); printf("\n"); 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; } } }
就這樣。