1.杨辉三角形
问题描述
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。
它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行:
1
1 1
1 2 1
1 3 3 1
给出n,输出它的前n行。
输入格式
输入包含一个数n。
输出格式
输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。
样例输入
4
样例输出
1
1 1
1 2 1
1 3 3 1
数据规模与约定
1 <= n <= 34。
#include <stdio.h>
int main()
{
int n=34,a[n][n],i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
{
if(j==0||i==j)
{
a[i][j]=1;
}
else
{
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
2.特殊的数字
问题描述
153是一个非常特殊的数,它等于它的每位数字的立方和,即153=111+555+333。编程求所有满足这种条件的三位十进制数。
输出格式
按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。
#include <stdio.h>
int main()
{
int i,j,k;
for(i=1;i<=9;i++)
{
for(j=0;j<=9;j++)
{
for(k=0;k<=9;k++)
{
if(i*i*i+j*j*j+k*k*k==100*i+10*j+k)
{
printf("%d%d%d\n",i,j,k);
}
}
}
}
return 0;
}
3.回文数
问题描述
1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
输出格式
按从小到大的顺序输出满足条件的四位十进制数。
#include <stdio.h>
int main()
{
int a,b,c,d;
for(a=1;a<=9;a++)
{
for(b=0;b<=9;b++)
{
for(c=0;c<=9;c++)
{
for(d=1;d<=9;d++)
{
if(a==d&&b==c)
{
printf("%d%d%d%d\n",a,b,c,d);
}
}
}
}
}
return 0;
}
4.特殊回文数
问题描述
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
输入一行,包含一个正整数n。
输出格式
按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
1<=n<=54。
#include <stdio.h>
int main()
{
int n,a,b,c,d,e,f;
scanf("%d",&n);
for(a=1;a<=9;a++)
{
for(b=0;b<=9;b++)
{
for(c=0;c<=9;c++)
{
for(d=0;d<=9;d++)
{
for(e=1;e<=9;e++)
{
if(a==e&&b==d&&a+b+c+d+e==n)
{
printf("%d%d%d%d%d\n",a,b,c,d,e);
}
}
}
}
}
}
for(a=1;a<=9;a++)
{
for(b=0;b<=9;b++)
{
for(c=0;c<=9;c++)
{
for(d=0;d<=9;d++)
{
for(e=0;e<=9;e++)
{
for(f=1;f<=9;f++)
{
if(a==f&&b==e&&c==d&&a+b+c+d+e+f==n)
{
printf("%d%d%d%d%d%d\n",a,b,c,d,e,f);
}
}
}
}
}
}
}
return 0;
}
5.十进制转十六进制
问题描述
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有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。
给出一个非负整数,将它表示成十六进制的形式。
输入格式
输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647
输出格式
输出这个整数的16进制表示
样例输入
30
样例输出
1E
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
printf("%X",n);//%X和%x都表示十六进制
return 0;
}
6.十六进制转十进制
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
#include <stdio.h>
#include <math.h>
int main()
{
int i;
int len = 0; //计算SUM长度
char SUM[50]; //存储结果
double index = 0; //16的多少次幂
long long sum = 0; //结果
int s_n = 0; //计算十六进制数组长度
double sixteen_1[8];//将输入的字符串数组转换成实数存入其中
char sixteen[8]; //输入的字符串数组
scanf("%s",sixteen);
for(i = 0; i < 8; i++)
{
switch(sixteen[i])
{
case '0':
sixteen_1[s_n++] = 0;
break;
case '1':
sixteen_1[s_n++] = 1;
break;
case '2':
sixteen_1[s_n++] = 2;
break;
case '3':
sixteen_1[s_n++] = 3;
break;
case '4':
sixteen_1[s_n++] = 4;
break;
case '5':
sixteen_1[s_n++] = 5;
break;
case '6':
sixteen_1[s_n++] = 6;
break;
case '7':
sixteen_1[s_n++] = 7;
break;
case '8':
sixteen_1[s_n++] = 8;
break;
case '9':
sixteen_1[s_n++] = 9;
break;
case 'A':
sixteen_1[s_n++] = 10;
break;
case 'B':
sixteen_1[s_n++] = 11;
break;
case 'C':
sixteen_1[s_n++] = 12;
break;
case 'D':
sixteen_1[s_n++] = 13;
break;
case 'E':
sixteen_1[s_n++] = 14;
break;
case 'F':
sixteen_1[s_n++] = 15;
break;
}
}
index = (double)s_n;
for(i = 0; i < s_n; i++)
{
sum += sixteen_1[i] * pow(16,index - 1);
index--;
}
if(sum == 0)
{
SUM[len++] = '0';
}
else
{
for(; sum > 0; )
{
SUM[len++] = sum % 10 + '0';
sum /= 10;
}
}
for(i = len - 1; i >= 0; i--)
{
printf("%c",SUM[i]);
}
return 0;
}
7.十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100000
int main()
{
int n; //十六进制数数量
int i,j,k; //计数变量
int result;
int str_len;
scanf("%d",&n);
char str[n][MAX_SIZE];
/* 建立数组,保存16个十六进制数对应的二进制数 */
char demo[16][4] = {"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
memset(str,0,n*MAX_SIZE); //将str初始化为0
for(i=0;i<n;i++){
scanf("%s",str[i]);
k = 0;
str_len = strlen(str[i]); //计算十六进制数长度
int ss = 4*str_len%3; //判断转换后的二进制数数量是否为3的倍数,如果不是,则需要补0
char temp[4*str_len+3-ss];
memset(temp,0,4*str_len+3-ss);
if( ss == 1){
strcat(temp,"00");
k += 2;
}
if( ss == 2){
strcat(temp,"0");
k += 1;
}
/* 进行十六进制向二进制数的转换 */
for(j=0;j<str_len;j++)
{
if(str[i][j]<65){
temp[k++] = demo[str[i][j]-48][0];
temp[k++] = demo[str[i][j]-48][1];
temp[k++] = demo[str[i][j]-48][2];
temp[k++] = demo[str[i][j]-48][3];
}
else if(str[i][j]>=65){
temp[k++] = demo[str[i][j]-55][0];
temp[k++] = demo[str[i][j]-55][1];
temp[k++] = demo[str[i][j]-55][2];
temp[k++] = demo[str[i][j]-55][3];
}
}
temp[k] = 0;
/* 进行输出操作 */
for(j=0;j<4*str_len;j+=3)
{
if(j==0){
result=(4*(temp[j]-48) + 2*(temp[j+1]-48) + (temp[j+2]-48));
if( result != 0)
printf("%d",result);
}
else{
result=(4*(temp[j]-48) + 2*(temp[j+1]-48) + (temp[j+2]-48));
printf("%d",result);
}
}
printf("\n");
}
return 0;
}
8.数列排序
问题描述
给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
输入格式
第一行为一个整数n。
第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。
输出格式
输出一行,按从小到大的顺序输出排序后的数列。
样例输入
5
8 3 6 4 9
样例输出
3 4 6 8 9
#include <stdio.h>
int main()
{
int n,i,j,temp;
int a[200];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return 0;
}
6.7题没搞懂,下来再看。