几道C语言的题目!
注:编译环境 VC2010,系统WIN7 64位,其他编译环境和系统未测试
1-1. 编程,输入n,输出如下例(n=5)所示的图形:
*****
*****
*****
*****
*****
# include <stdio.h>
int main()
{
int length;
void print_parallelogram(int length);
scanf("%d", &length);
print_parallelogram(length);
return 0;
}
/**
* 打印平行四边形
* @param int length 边长
*/
void print_parallelogram(int length)
{
char element = '*';//元素
char space =' ';//空格
int i,j,k;
for(i=0; i<length; i++)
{
/** 打印空格 */
for(j=length-(i+1); j>0; j--)
{
printf("%c", space);
}
/** 打印元素 */
for(k=0; k<length; k++)
{
printf("%c",element);
}
printf("\n");
}
}
1-2. 编程,输入n值,输出如下例(n=4)所示的高和上底均为n的等腰梯形:
****
******
********
**********
# include <stdio.h>
int main()
{
int length;
void print_isosceles_trapezoid(int length_of_side);
scanf("%d", &length);
print_isosceles_trapezoid(length);
return 0;
}
/**
* 打印等腰梯形
* @param int length_of_side 边长
* @turn void
*/
void print_isosceles_trapezoid(int length_of_side)
{
char element = '*';//元素
char space =' ';//空格
int i,j,k;
for(i=0; i<length_of_side; i++)
{
/** 打印空格 */
for(j=length_of_side-(i+1); j>0; j--)
{
printf("%c", space);
}
/** 打印元素 */
for(k=0; k<length_of_side+(i*2); k++)
{
printf("%c",element);
}
printf("\n");
}
}
1-3. 编程,输入n,输出如下例(n=3)所示的边长为n的菱形:
*
***
*****
***
*
# include <stdio.h>
int main()
{
int length;
void print_rhombus(int length_of_side);
scanf("%d", &length);
print_rhombus(length);
return 0;
}
/**
* 打印菱形
* @param int length_of_side 边长
* @turn void
*/
void print_rhombus(int length_of_side)
{
char element = '*';//元素
char space =' ';//空格
int times = length_of_side*2-1;//循环次数
int i,j,k,n,m;
for(i=0; i<times; i++)
{
/** 计算 空格的数量 */
n = length_of_side-(i+1);
n = n < 0 ? -n : n;
/** 打印空格 */
for(j=n; j>0; j--){
printf("%c", space);
}
/** 计算 棱形上边点 和下边点的数量 */
m = i<length_of_side ? 1+(i*2) : (times-i) * 2 -1 ;
/** 打印元素 */
for(k=m; k>0; k--){
printf("%c",element);
}
printf("\n");
}
}
1-4. 编程, 输入顶行字符和图形的高。输出如下例(顶行字符为'A',图形的高为5)所示的图形,
A
B C D
E F G H I
J K L M N O P
Q R S T U V W X Y
# include <stdio.h>
int main()
{
char letter; int height;
void letter_pyramid(char letter, int height);
printf("请输入金字塔塔顶字母");
scanf("%c", &letter);
printf("请输入金字塔塔高");
scanf("%d", &height);
letter_pyramid(letter, height);
return 0;
}
/**
* 打印字母金字塔
* @param char word 塔顶字母
* @param int height 塔高
* @return void
*/
void letter_pyramid(char letter, int height)
{
int i,j,k;
/** @TODO 对字符越界做简单处理 */
if(letter+height*height > 256) {
printf("塔高超出限制,拜拜!!!\n");
return ;
}
for ( i = 0; i < height; i++) {
/** 打印空格 */
for(k=height-(i+1); k>0; k--) printf("%c", ' ');
/** 打印字母 */
for ( j = 0; j < (i*2)+1; j++)
{
printf("%c", letter++);
}
printf("\n");
}
}
1-5. 编程,打印下列上三角形式的乘法九九表。
1 2 3 4 5 6 7 8 9
----------------------------
1 2 3 4 5 6 7 8 9
4 6 8 10 12 14 16 18
9 14 15 18 21 24 27
16 20 24 28 32 36
25 30 35 40 45
36 42 48 54
49 56 63
86 72
81
# include <stdio.h>
int main()
{
void multiplication_table();
multiplication_table();
return 0;
}
/**
* @desc 打印 99乘法表
*/
void multiplication_table()
{
int n = 9,i,j,k;
for (i = 1; i <= n; i++) printf("%3d", i);
printf("\n");
for (j = 1; j <= n; j++) printf("---");
printf("\n");
for ( i = 1; i <= n; i++)
{
for ( j = 1; j <= n; j++)
{
if (j<i){
printf(" ");
}else{
printf("%3d", i*j);
}
}
printf("\n");
}
}
2-1. 编程,输出200以内(含200)所有完全平方数C(满足C2=A2+B2)及其个数。
# include <stdio.h>
int main()
{
void pythagorean_theorem();
pythagorean_theorem();
return 0;
}
/**
* @desc 求 200以内构成勾股数的个数
* 勾股数公式(a²+ 1)²=(a²-1)²+(2a)²
*/
void pythagorean_theorem()
{
int n=200,i,a,b,c;
int square[200];//用于存放符合勾股数的数
int num=0;// 计算 勾股数的个数
for (i = 1; i*i+1 <= n; i++)
{
/** 套用勾股数定理 */
a = (i*i+1);
b = (i*i-1);
c = 2*i;
if ( a*a == b*b + c*c && b>0)
{
square[num] = a;
++num;
}
}
if (!num)
{
printf("没有找到符合要求的");return;
}
printf("200内能组成勾股数的个数%d\n",num);
printf("分别是:\n");
while (num)
{
printf("%d\n",square[--num]);
}
}
2-2. 中国古代数学家张丘建在他的《算经》中提出了著名的“百钱百鸡问题”:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何? 编程,输出所有可能的购买方案。
# include <stdio.h>
int main()
{
void money100_chickens100();
money100_chickens100();
return 0;
}
/**
* @desc 《算经》的“百钱百鸡问题”
* 分析得出公式:5x+3y+z/3=100, x+y+z=100;
*/
void money100_chickens100()
{
int max_x = 100/5;//鸡翁最大数
int max_y = 100/3;//鸡母最大数,取整
int x,y,z;//各种鸡个数
for (x = 0; x <= max_x; x++)
{
for (y = 0; y <= max_y; y++)
{
z = 100 - x - y;
if (x *5 + y*3 + z/3.0 == 100)
{
printf("x=%d,y=%d,z=%d\n",x,y,z);
}
}
}
}
2-3. 设N是一个四位数,它的9倍恰好是其反序数(例如:123的反序数是321),编程,输出所有满足条件的N。
# include <stdio.h>
int main()
{
/** 4位数9倍恰好是其反序数,所以其反序也是4位数*/
int max = 10000 /9 ;//最大的反序之前的数
int i;
int antitone(int n);
for ( i= 1001; i < max; i++){
if(i*9 == antitone(i)){
printf("%d\n", i);
}
}
return 0;
}
int antitone(int n){
int i=0;
while (n>0){
i = (n%10)+i*10;
n /=10;
}
return i;
}
2-4. 编程,求全部水仙花数。所谓水仙花数是指一个三位数,其各位数字立方的和等于该数。如:153 = 13 + 53+ 33
# include <stdio.h>
int main()
{
int i,j,k,n,cube;
for ( i = 1; i <= 9; i++) {
for ( j = 0; j <= 9; j++) {
for ( k = 0; k<= 9; k++){
n = i*100+j*10+k;
cube = i*i*i + j*j*j + k*k*k;
if (n==cube) {
printf("%d\n", n);
}
}
}
}
}
2-5. 编程,输出555555的约数中最大的三位数。
# include <stdio.h>
int main()
{
int i ;
for ( i = 999; i >0 ; i--)
{
if (555555 % i == 0)
{
printf("%d\n", i);
break;
}
}
}
2-6. 编程,输出1000到100000之间所有满足下列条件的所有整数及其个数:整数的各位数字之和等于5。
# include <stdio.h>
void main()
{
int min_i=1000;
/** 因为各位位数之和等于5,所以大于50000的数位数之和也大于5 */
unsigned int max_i=50000;
unsigned int n,num=0;
int figure(long number);
for(n=min_i;n<=max_i;n++){
if(figure(n)==5){
printf("%d\n",n);
num++;
}
}
printf("个数:%d\n",num);
}
int figure(long number){
int result=0;
while(number>0){
result += number%10;
number = number/10;
}
return result;
}
2-7.输出1000以内的全部“完全数”。
# include <stdio.h>
void main()
{
int n=1000;
int num=0,i,j,r;
for (i = 1; i <= n; i++){
r = 0;
for (j = 1; j < i; j++){
if (i%j==0){
r +=j;
}
}
if (r==i){
num++;
printf("%d\n",i);
}
}
printf("完全数的个数:%d", num);
}
3-1. 编程,输入10个整数,然后进行查找。输入要查找的整数,若找到,则输出该数在数组中的下标位置,否则输出“can not found!”。
# include <stdio.h>
void main()
{ int num[10],i,find,flag=0;
printf("请输入10个数\n");
for (i = 0; i < 10; i++){
scanf("%d", &num[i]);
}
printf("请输入要查找的数");
scanf("%d", &find);
for (i = 0; i < 10; i++){
if (num[i] == find) {
flag=1;
printf("下标为%d\n", i);
}
}
if (flag==0) {
printf("can not found!\n", i);
}
}
3-2.编程,输入一个字符串并删除其中的指定字符。例如,对于字符串abcdcf,指定删除c,则结果为:abdf。
#include <stdio.h>
void main()
{
char str[80],str2[80],letter;
int i=0, j=0;
printf("请输入一个字符串\n");
gets(str);
printf("请输入字符串中要删除的字符\n");
scanf("%c",&letter);
while (str[i]!='\0'){
if (str[i] != letter) {
str2[j++] = str[i];
}
i++;
}
str2[j]= '\0';
puts(str2);
getch();
}
3-3. 编程,输入一行字符,将其反序后再输出。
#include <stdio.h>
void main()
{
char str[80],letter,str2[80], *p=str, *q=str2;
int len=0;
printf("请输入一个字符串\n");
gets(str);
while (*p){
p++;
}
len = p-str;
while (--len>=0){
*q++ = str[len];
}
*q = '\0';
puts(str2);
}
3-4. 编程,输入一行字符,将其中的每个字符从小到大排列后输出。
#include <stdio.h>
void main()
{
char str[80],*s=str,temp;
int i,j,len;
scanf("%s",str);
while (*s){
s++;
}
len = s - str;
for (i = 0; i < len; i++) {
for ( j = i+1; j < len; j++){
if (str[i]>str[j]){
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
}
printf("%s",str);
getch();
}
3-5. 编程,输入两个已经按从小到大顺序排列好的字符串,将两个字符串合并为一个新的从小到大排列字符串并输出。
#include <stdio.h>
void main()
{
char str[80],str2[80],str3[80],*p=str,*q=str2,*r=str3, *temp_p;
printf("请输入第一个顺序字符串\n");
gets(str);
printf("请输入第二个顺序字符串\n");
gets(str2);
while (*p!='\0' && *q!='\0'){
*r++ = *p <*q ? *p++ : *q++;
}
temp_p = *p=='\0' ? q :p;
while (*r ++ = *temp_p ++ );
*r= '\0';
puts(str3);
getch();
}
3-6. 输入一行文字,判断该行文字是否是回文。是输出:YES。否输出:NO
#include <stdio.h>
void main()
{
char input[80],*p,*q;
p=q=input;
printf("input string:\n");
gets(input);
while(*p!='\0')p++;
p--;
while (p>=input) {
if (*p != *q) {
printf("NO");
getch();
return;
}
p--;q++;
}
printf("YES");
getch();
return;
}
3-7. 编程,输入若干个字符串,当输入字符串的长度为0时停止输入。输出最长的字符串。
#include <stdio.h>
int strlen(char str[]){
char *p=str;
while (*p!='\0' && p++);
return p-str;
}
//把第二个字符串的值复制给第一个
void strcpy(char str1[], char str2[]){
char *p=str2, *q=str1;
while (*q++ = *p++);
}
//求最短字符串
void main()
{
char str[80],str2[80];
int len=0, max_len;
gets(str);
max_len= strlen(str);
strcpy(str2, str);
gets(str);
do{
len = strlen(str);
if (len>max_len){
max_len = len;
strcpy(str2, str);
}
gets(str);
} while (str[0]!='\0');
printf("%s", str2);
getch();
}
3-8. 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。
#include <stdio.h>
void main()
{
char str[80], *p=str;
int num=0,flag=1;
gets(str);
while (*p != '\0'){
printf("%d,",*p == ' ');
if (*p == ' '){
flag=1;
}else{
if(flag)num++;
flag=0;
}
p++ ;
}
printf("total %d words", num);