第一题 闰年判断
给定一个年份,判断这一年是不是闰年。
当以下情况之一满足时,这一年是闰年:
1. 年份是4的倍数而不是100的倍数;
2. 年份是400的倍数。
其他的年份都不是闰年。
#include<stdio.h>
int main(){
int year;
scanf("%d",&year);
if(year%400==0||(year%4==0&&year%100!=0)){
printf("yes");
}
else{
printf("no");
}
return 0;
}
第二题 01字串
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。
#include<stdio.h>
int main(){
int a,b,c,d,e;
for(a=0;a<2;a++){
for(b=0;b<2;b++){
for(c=0;c<2;c++){
for(d=0;d<2;d++){
for(e=0;e<2;e++){
printf("%d%d%d%d%d",a,b,c,d,e);
}
}
}
}
}
return 0;
}
第三题 字母图形
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
#include<stdio.h>
#include<math.h>
int main()
{
int m,n;
scanf("%d%d",&n,&m);
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf("%c",65+abs(i-j));
}
printf("\n");
}
return 0;
}
题目四 数列特征
给出n个数,找出这n个数的最大值,最小值,和。
#include <stdio.h>
int main(){
int n,i,max=-10001,min=10001,sum=0;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
if(max<a[i]){
max=a[i];
}
if(min>a[i]){
min=a[i];
}
sum+=a[i];
}
printf("%d\n%d\n%d\n",max,min,sum);
return 0;
}
第五题 查找整数
给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。
#include<stdio.h>
int main(){
int n,i;
scanf("%d",&n);
int arr[n];
for(i=0;i<n;i++){
scanf("%d",&arr[i]);
}
int z;
scanf("%d",&z);
for(i=0;i<n;i++){
if(arr[i]==z){
printf("%d",i+1);
return 0;
}
}
printf("-1");
return 0;
}
第六题 杨辉三角形
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。
它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行:
1
1 1
1 2 1
1 3 3 1
给出n,输出它的前n行。
思路:利用二维数组,定位数值的位置。
从第三行开始,中间的数为肩上数字的和,所以利用已定位的数值进行求值。
按题目要求输出。
#include<stdio.h>
int main(){
int N;
scanf("%d",&N);
int a[N][N];
int i, j;
for (i = 0; i < N; i++) {
a[i][0] = 1;
a[i][i] = 1;
}
for (i = 2; i < N; i++){
for (j = 1; j < i; j++)
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
}
for (i = 0; i < N; i++) {
for (j = 0; j < i + 1; j++)
printf("%d ", a[i][j]);
printf("\n");
}
return 0;
}
第七题 特殊的数字
153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。
#include<stdio.h>
#include<math.h>
int main(){
int n,a,b,c;
for(n=100;n<1000;n++){
a=n/100;
b=n%100/10;
c=n%10;
if(n==pow(a,3)+pow(b,3)+pow(c,3)){
printf("%d\n",n);
}
}
return 0;
}
第八题 回文数
1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
#include<stdio.h>
int main(){
int n,a,b,c,d;
for(n=1000;n<10000;n++){
a=n/1000;
b=n%1000/100;
c=n%100/10;
d=n%10;
if(a==d&&b==c){
printf("%d\n",n);
}
}
return 0;
}
第九题 特殊回文数
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
思路:用数组存储回文数的每一位。
从五位数的第一个值10000开始进行循环,直到6位数也循环结束。
在循环中进行判断,是否为回文数,且每位数之和是否等于输入的数。
判断方式:
在循环中,求i的每一位数并将之放入数组中,且求和。
判断i是几位数。
最后判断i是否为回文数且等于输入的数,并输出结果。
#include<stdio.h>
int main(){
int arr[10]={0},n,i,j,t,sum;
scanf("%d",&n);
for(i=10000;i<=999999;i++){
t=i;
sum=0;
for(j=0;j<6;j++){
arr[j]=t%10;
t=t/10;
sum=sum+arr[j];
}
if((i<=99999)&&((arr[0]==arr[4])&&(arr[1]==arr[3]))&&(sum==n)){
printf("%d\n",i);
}
if((i>=100000)&&((arr[0]==arr[5])&&(arr[1]==arr[4])&&(arr[2]==arr[3]))&&(sum==n)){
printf("%d\n",i);
}
}
return 0;
}
第十题 十进制转十六进制
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
给出一个非负整数,将它表示成十六进制的形式。
思路:有两种解法:
第一种:运用C语言中各进制的进制数形式,直接转换输出。
第二种:用数组存储转化后的十六进制数,且按照输出格式输出。
具体操作:循环将n除以16的余数存储到数组中。
循环输出,将大于9的数以字符串形式输出。
第一种
#include<stdio.h>
int main(){
long long n;
scanf("%lld",&n);
printf("%llX\n",n);
return 0;
}
第二种
#include<stdio.h>
#include<stdlib.h>
int main() {
long long n;
int t,i=0,j;
int a[100];
scanf("%lld",&n);
if(n==0) printf("%d",n);
while(n!=0) {
t=n;
n=n/16;
a[i]=t%16;
i++;
}
for(j=i-1;j>=0;j--) {
if(a[j]>9&&a[j]<16) printf("%c",(a[j]-10+'A'));
else printf("%d",a[j]);
}
printf("\n");
return 0;
}
第十一题 十六进制转十进制
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
思路:有两种解法:
第一种:运用C语言中各进制的进制数形式,直接转换输出。
第二种:利用十六进制转十进制的运算规则进行转换。
当输入十六进制字符串时,要将字符串转换为整型
#include<stdio.h>
int main(){
int n;
scanf("%X",&n);
printf("%lld\n",n);
return 0;
}
#include<stdio.h>
#include<string.h>
char str[8];
int main(){
scanf("%s", str);
long long m,i,sum = 0,k;
m=strlen(str);
for(k=0;k<m;k++){
if ((str[k]>='0') && (str[k]<='9')){
i=str[k]-'0';
}
else i=str[k]-'A'+10;
sum=sum*16+i;
}
printf("%lld", sum);
return 0;
}
第十二题 十六进制转八进制
给定n个十六进制正整数,输出它们对应的八进制数。
思路:
先将十六进制数转化为二进制数(一位十六进制数转化为四位二进制数),再将三位二进制数转为一位八进制数,
均从后往前转换,其中,二进制转八进制,不够三位前边补零。
#include<stdio.h>
#include<string.h>
char str[100001],Two[400002],e[400002];
int main(){
int n;
scanf("%d",&n);
while(n--){
scanf("%s",str);
int i,len=0;
for(i=strlen(str)-1;i>=0;i--){
int v,j;
if(str[i]>='0' && str[i]<='9') v=str[i]-'0';
else v=str[i]-'A'+10;
for(j=0;j<4;j++){
Two[len++]=v%2+'0';
v/=2;
}
}
Two[len]='\0';
int x=0,cnt=1;
int l=0;
for(i=0;i<len;i++){
if(cnt==4||i==len-1){
x=cnt*(Two[i]-'0')+x;
cnt=1;
e[l++]=x+'0';
x=0;
}
else{
x=cnt*(Two[i]-'0')+x;
cnt*=2;
}
}
i=l-1;
while(i>=0 && e[i]=='0') i--;
if(i<0)
printf("0");
for (;i>=0;i--){
printf("%c",e[i]);
}
printf("\n");
}
return 0;
}
第十三题 数列排序
给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
#include <stdio.h>
int main(){
int arr[200],n,i;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&arr[i]);
}
int t,j,temp;
for(t=1;t<n;t++)
for(j=0;j<n-t;j++)
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
for(i=0;i<n;i++){
printf("%d ",arr[i]);
}
return 0;
}