블 루 브리지 컵 VIP 연습 문제 및 답안 기초 연습(C 언어)
10512 단어 블 루 브리지 컵 C 언어
1.기초 훈련 단계 곱 하기 계산 문제 설명
정수 n 을 입력 하고 n 을 출력 하 십시오!의 값.그 중 n!=123*…*n。
알고리즘 설명
n!이 가능 하 다,~할 수 있다,...하나의 배열 A 를 사용 하여 하나의 큰 정수 a 를 나타 내 고 A[0]는 a 의 한 자 리 를 나타 내 며 A[1]는 a 의 10 자 리 를 나타 내 고 순서대로 유추 한다.a 곱 하기 하나의 정수 k 를 배열 A 의 모든 요 소 를 k 로 바 꾸 고 해당 하 는 진 위 를 처리 하 는 데 주의 하 십시오.먼저 a 를 1 로 설정 한 다음 에 2 를 곱 하고 3 을 곱 하면 n 을 곱 하면 n 을 얻 을 수 있 습 니 다!의 값.
입력 형식
입력 은 정수 n,n<=1000 을 포함 합 니 다.
출력 형식
출력 n!의 정확 치.
샘플 입력
10
샘플 출력
3628800
#include
#define N 10000
int main()
{
int a[N]={1};
int k=0,l=1,n;
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=0;j=0;i--)
printf("%04d",a[i]);
printf("
");
return 0;
}
고밀도 덧셈 문제 설명
두 정수 a 와 b 를 입력 하고 이 두 정수 의 합 을 출력 합 니 다.a 와 b 는 모두 100 명 을 넘 지 않 는 다.
알고리즘 설명
a 와 b 가 비교적 크기 때문에 언어의 표준 데이터 형식 으로 직접 저장 할 수 없습니다.이런 문제 에 대해 서 는 일반적으로 배열 로 처리한다.하나의 배열 A,A[0]를 a 의 한 자 리 를 저장 하 는 데 사용 하고 A[1]는 a 의 10 자 리 를 저장 하 는 데 사용 하 는 것 으로 유추 된다.같은 배열 B 로 b 를 저장 할 수 있다.c=a+b 를 계산 할 때 먼저 A[0]와 B[0]를 더 하고 진 위 를 발생 시 키 면 진 위(즉 합 의 된 10 자리)를 r 에 넣 고 합 의 된 한 자 리 를 C[0],즉 C[0]는(A[0]+B[0])%10 과 같다.그 다음 에 A[1]와 B[1]을 더 하면 낮은 위치 에서 올 라 온 값 r 도 더 해 야 한다.즉,C[1]는 A[1],B[1]와 r 세 개의 수의 합 이 어야 한다.만약 에 또 진 위 를 만 들 면 새로운 진 위 를 r 에 저장 하고 한 자 리 를 C[1]에 저장 할 수 있다.이런 유추 에 의 하면 C 의 모든 위 치 를 구 할 수 있다.마지막 으로 C 를 출력 하면 됩 니 다.
입력 형식
입력 은 두 줄 을 포함 하고 첫 번 째 행 위 는 마이너스 정수 a 가 아니 며 두 번 째 행 위 는 마이너스 정수 b 가 아 닙 니 다.두 정수 모두 100 위 를 넘 지 않 고 두 수의 최고 위 는 0 이 아니다.
출력 형식
한 줄 을 출력 하면 a+b 의 값 을 표시 합 니 다.
샘플 입력
20100122201001221234567890 2010012220100122
샘플 출력
20100122203011233454668012
#include
#include
#include
void f(char a[],char b[])
{
int w=200,i,j,la,lb;
la=strlen(a);lb=strlen(b);
char c[200];
for(i=la;i=0;i--)
{
j=a[i]+b[i]-96;
if(j>9)a[i-1]=a[i-1]+j/10;
c[i]=j%10+48;
}
c[w-1]=0;
for(i=0;i
Huffuman 트 리 문제 설명
Huffman 트 리 는 인 코딩 에서 광범 위 하 게 응용 되 고 있다.여기 서 우 리 는 Huff man 나무의 구조 과정 에 만 관심 을 가진다.{pi}={p0,p1,...,pn-1}을 보 여 줍 니 다.이 열 로 Huffman 트 리 를 구성 하 는 과정 은 다음 과 같 습 니 다.1.{pi}에서 가장 작은 두 수 를 찾 아 pa 와 pb 로 설정 하고 pa 와 pb 를{pi}에서 삭제 한 다음{pi}에 합 친 것 을 추가 합 니 다.이 과정의 비용 은 pa+pb 로 기록 합 니 다.2.{pi}에 한 개의 숫자 만 남 을 때 까지 1 단 계 를 반복 합 니 다.위의 조작 과정 에서 모든 비용 을 더 하면 구조 허 프 맨 트 리 의 총 비용 을 받는다.이 문제 의 임무:주어진 수열 에 대해 서 는 이 수열 로 Huff man 나 무 를 구성 하 는 총 비용 을 구 해 주 십시오.
예 를 들 어 수열{pi}={5,3,8,2,9}에 대해 Huff man 트 리 의 구조 과정 은 다음 과 같다.2.{5,8,9,5}에서 가장 작은 두 개 수 를 찾 아 각각 5 와 5 로{pi}에서 삭제 하고 10 을 추가 하여{8,9,10}을 얻 으 면 비용 은 10 입 니 다.3.{8,9,10}에서 가장 작은 두 개 수 를 찾 아 각각 8 과 9 로{pi}에서 삭제 하고 17 을 추가 하여{10,17}을 얻 으 면 비용 은 17 입 니 다.4.{10,17}에서 가장 작은 두 개 수 를 찾 으 면 각각 10 과 17 입 니 다.{pi}에서 삭제 하고 27 을 추가 하여{27}을 얻 으 면 비용 은 27 입 니 다.5.현재 수열 에는 하나의 수 27 만 남 았 고 구조 과정 이 끝 났 으 며 총 비용 은 5+10+17+27=59 이다.
입력 형식
입력 한 첫 줄 은 정수 n(n<=100)을 포함 합 니 다.다음은 n 개의 정수 로 p0,p1,...,pn-1 을 나타 내 며 각 수 는 1000 을 초과 하지 않 습 니 다.
출력 형식
출력 은 이 숫자 로 Huff man 트 리 를 구성 하 는 총 비용 입 니 다.
샘플 입력
5 5 3 8 2 9
샘플 출력
59
#include
typedef struct
{
int a[100];
int len;
}huf;
int sum=0;
int del(huf* in,int t)
{
int i,j;
for(i=0;ilen && in->a[i]!=t;i++);
for(;ilen-1;i++)
in->a[i]=in->a[i+1];
in->len--;
return 1;
}
int add(huf* in,int t)
{
in->a[in->len]=t;
in->len++;
}
int find_two_mins(huf* in)
{
int i,j,t;
int mina,minb;
for(i=0;ilen-1;i++)
for(j=i+1;jlen;j++)
if(in->a[i]>in->a[j])
{
t=in->a[i];
in->a[i]=in->a[j];
in->a[j]=t;
}
mina=in->a[0];
minb=in->a[1];
del(in,mina);
del(in,minb);
add(in,mina+minb);
return mina+minb;
}
int main()
{
huf in;
int i,j,n;
scanf("%d",&n);
in.len=n;
for(i=0;i
문자열 대비 문 제 는 대문자 나 소문 자로 만 구 성 된 두 문자열(길 이 는 1 에서 10 사이)을 지정 합 니 다.이들 의 관 계 는 다음 과 같은 4 가지 상황 중 하나 입 니 다.1:두 문자열 의 길이 가 다 릅 니 다.예 를 들 어 베 이 징 과 허 베 이 2:두 문자열 은 길이 가 같 을 뿐만 아니 라 해당 위치 에 있 는 문자 가 완전히 일치 합 니 다(대소 문자 구분).예 를 들 어 베 이 징 과 베 이 징 3:두 문자열 의 길이 가 같 고 해당 위치 에 있 는 문 자 는 대소 문 자 를 구분 하지 않 는 전제 에서 만 완전히 일치 할 수 있 습 니 다(즉,상황 2).예 를 들 어 beijing 과 BEIjing 4:두 문자열 의 길 이 는 같 지만 대소 문 자 를 구분 하지 않 아 도 이 두 문자열 을 일치 시 킬 수 없습니다.예 를 들 어 베 이 징 과 난 징 프로 그래 밍 은 입력 한 두 문자열 간 의 관 계 를 이 네 가지 중 어느 종류 에 속 하 는 지 판단 하고 소속 클래스 의 번 호 를 제시한다.
입력 형식
두 줄 을 포함 하여 줄 마다 문자열 출력 형식 입 니 다.
이 두 문자열 의 관계 번 호 를 나타 내 는 숫자 만 있 습 니 다.
BEIjingbeiJing
샘플 출력
3
#include
#include
int main()
{
char a[10],b[10],i,n,l=2;
gets(a);gets(b);
n=strlen(a);
if(strlen(b)!=n)l=1;
else
{
for(i=0;i
2n 황후 문제 설명 은 n*n 의 바둑판 을 정 하고 바둑판 에 황 후 를 놓 을 수 없 는 위치 가 있 습 니 다.이제 바둑판 에 n 개의 흑 황후 와 n 개의 백 황 후 를 넣 어 임의의 두 흑 황 후 를 같은 줄,같은 열 또는 같은 대각선 에 두 지 않 게 해 야 한다.임의의 두 백 황 후 는 같은 줄,같은 열 또는 같은 대각선 에 있 지 않다.--총 몇 가지 방 법 이 있 나.n 보다 작 으 면 8 이다.
입력 형식
입력 한 첫 번 째 행동 의 정수 n 은 바둑판 의 크기 를 나타 낸다.다음 n 행,각 행 n 개 0 또는 1 의 정수,하나의 정수 가 1 이면 해당 하 는 위 치 는 황 후 를 놓 을 수 있 음 을 나타 내 고,하나의 정수 가 0 이면 해당 하 는 위 치 는 황 후 를 놓 아 서 는 안 된다 는 것 을 나타 낸다.
출력 형식
하나의 정 수 를 출력 하 는 것 은 모두 몇 가지 방 법 이 있 는 지 를 나타 낸다.
샘플 입력
4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
샘플 출력
2
샘플 입력
4 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
샘플 출력
0
#include
int a[9][9],n,sum;
int row1[9],diagl1[17],diagr1[17],row2[9],diagl2[17],diagr2[17];
void dfs2(int i)
{
int j;
if(i==n+1)
{
sum++;
return;
}
for(j=1;j<=n;j++)
{
if(a[i][j]==1&&row2[j]!=0&&diagl2[n-i+j]!=0&&diagr2[i+j]!=0)
{
a[i][j]=0;
row2[j]=0;
diagl2[n-i+j]=0;
diagr2[i+j]=0;
dfs2(i+1);
row2[j]=1;
diagl2[n-i+j]=1;
diagr2[i+j]=1;
a[i][j]=1;
}
}
}
void dfs1(int i)
{
int j,h,r;
if(i==n+1)
{
for(h=1,r=1;r<=n;r++)
{
if(a[1][r]==1)
{
a[1][r]=0;
row2[r]=0;
diagl2[n-h+r]=0;
diagr2[h+r]=0;
dfs2(h+1);
row2[r]=1;
diagl2[n-h+r]=1;
diagr2[h+r]=1;
a[1][r]=1;
}
}
}
for(j=1;j<=n;j++)
{
if(a[i][j]==1&&row1[j]!=0&&diagl1[n-i+j]!=0&&diagr1[i+j]!=0)
{
a[i][j]=0;
row1[j]=0;
diagl1[n-i+j]=0;
diagr1[i+j]=0;
dfs1(i+1);
row1[j]=1;
diagl1[n-i+j]=1;
diagr1[i+j]=1;
a[i][j]=1;
}
}
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
sum=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for(i=1;i<=n;i++)
row1[i]=row2[i]=1;
for(i=1;i<=2*n;i++)
diagl1[i]=diagr1[i]=diagl2[i]=diagr2[i]=1;
for(i=1,j=1;j<=n;j++)
{
if(a[1][j]==1)
{
a[1][j]=0;
row1[j]=0;
diagl1[n-i+j]=0;
diagr1[i+j]=0;
dfs1(i+1);
row1[j]=1;
diagl1[n-i+j]=1;
diagr1[i+j]=1;
a[1][j]=1;
}
}
printf("%d
",sum);
}
return 0;
}
시간 을 알 리 는 조수 문 제 는 현재 시간 을 설명 합 니 다.영어 로 읽 으 십시오.시간 은 h 와 m 로 나 누 어 영어 의 독법 에서 한 시간 을 읽 는 방법 은 m 가 0 이면 시 를 읽 은 다음 에'o'clock'을 더 하 는 것 이다.예 를 들 어 3:00 에'three o'clock'으로 읽 는 것 이다.만약 m 가 0 이 아니라면 시 를 읽 은 후에 5 시 30 분 에'five thirty'로 나 누 어 읽 을 것 이다.시 와 분 의 독법 은 영문 숫자의 독법 을 사용 하 는데 그 중에서 0~20 은 0:0,1:one,2:two,3:three,4:four,5:five,6:six,7:seven,8:eight,9:nine,10:ten,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:19,19:19,20 이다.30 은 삼십 으로 읽 고 40 은 사십 으로 읽 고 50 은 오십 으로 읽는다.20 보다 60 보다 작은 숫자 에 대해 서 는 먼저 전체 10 의 수 를 읽 은 다음 에 한 자릿수 를 더 한다.예 를 들 어 31.먼저 30 에 1 을 더 한 독법 을 읽 고'thirty one'으로 읽는다.위의 규칙 에 따라 21:54 는'twentone fifty four',9:07 은'nine seven',0:15 는'zero fifteen'으로 읽는다.
입력 형식
두 개의 부정 정수 h 와 m 를 포함 하여 시간 과 분 을 입력 하 십시오.0 이 아 닌 숫자 앞 에는 선도 0 이 없다.h 는 24 보다 작고 m 는 60 보다 작다.
출력 형식
출력 시간의 영어.
샘플 입력
0 15
샘플 출력
zero fifteen
#include
#include
int main()
{
int h,m;
char g[50][50]={"zero","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty"};
char s[10][10]={"twenty","thirty","forty","fifty"};
scanf("%d%d",&h,&m);
if(m==0)if(h<21)printf("%s o'clock",g[h]);else {printf("%s %s o'clock",s[h/10-2],g[h%10]);}
else {
if(h<21)printf("%s ",g[h]);else {printf("%s %s ",s[h/10-2],g[h%10]);}
if(m<21)printf("%s ",g[m]);else {printf("%s %s ",s[m/10-2],g[m%10]);}
}
printf("
");
return 0;
}
회 형 취 수 문제 에 대한 설명 회 형 취 수 는 행렬 의 변 을 따라 수 를 취 하 는 것 이다.만약 에 현재 방향 에서 무수 한 취 할 수 있 거나 이미 취 했 으 면 좌회전 90 도 이다.처음에는 행렬 왼쪽 상단 에 위치 하고 방향 은 아래로 내 려 갑 니 다.
입력 형식
첫 번 째 줄 을 입력 하 는 것 은 200 을 넘 지 않 는 정수 m,n 으로 행렬 의 줄 과 열 을 표시 합 니 다.다음 m 줄 마다 n 개의 정 수 는 이 행렬 을 나타 낸다.
출력 형식
출력 은 한 줄 뿐 입 니 다.총 mn 개 수 는 행렬 의 회 형 취 수 를 입력 하기 위해 얻 은 결과 입 니 다.수 사이 에 빈 칸 으로 구분 하고 줄 끝 에 빈 칸 이 있어 서 는 안 된다.
샘플 입력
3 3 1 2 3 4 5 6 7 8 9
샘플 출력
1 4 7 8 9 6 3 2 5
샘플 입력
3 2 1 2 3 4 5 6
샘플 출력
1 3 5 6 4 2
#include
#include
#define MAX_N 200
int m,n;
int a[MAX_N][MAX_N],b[MAX_N][MAX_N];
int s=0;
void solve(int i,int j)
{
if(i=0 && j=0 && b[i][j] == 0)
{
printf("%d ",a[i][j]);
b[i][j] = 1;
}
else
{
s++;
return ;
}
if(s%4 == 0)
solve(i+1,j);
if(s%4 == 1)
solve(i,j+1);
if(s%4 == 2)
solve(i-1,j);
if(s%4 == 3)
solve(i,j-1);
if(s%4 == 0)
solve(i+1,j);
if(s%4 == 1)
solve(i,j+1);
if(s%4 == 2)
solve(i-1,j);
if(s%4 == 3)
solve(i,j-1);
return ;
}
int main()
{
memset(b,0,sizeof(b));
scanf("%d%d",&m,&n);
int i,j;
for(i=0; i