c语言错题
【题目16】数字字符0的ASCII值为48,若有以下程序
#include “stdio.h”
main()
{
char a=‘1’,b=‘2’;
printf("%c,",b++);
printf("%d\n",b-a);
}
程序运行后的输出结果是_。
答案:2,2
以下选项中,值为1的表达式是:
以下fun函数的功能是将形参s所指字符串内容颠倒过来
void fun( char *s ) { int i, j, k; for( i=0, j=strlen(s) __________ ; i<j; i++,j-- ) { k=s[i]; s[i]=s[j]; s[j]=k; } }在横线处应填入的内容是
一1
有以下程序
#include <stdio.h>
fun( int a, int b )
{
int static m=0, i=2;
i=i+m+1;
m=i+a+b;
return m;}
main(){
int k=4, m=1, p;
p=fun( k, m);
printf("%d,",p);
p=fun( k, m);
printf("%d\n",p);
}程序运行后的输出结果是8,17
题目:求100之内的素数。
程序分析:质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除。
#include<stdio.h>
#include<math.h>
int main()
{ int i,j,k,n=0;
for(i=2;i<=100;i++)
{ k=(int)sqrt(i);
for(j=2;j<=k;j++)
if(i%j0) break;
if(j>k)
{
printf("%d ",i);
n++;
if(n%50) printf("\n"); }
}
return 0;
}
题目:对10个数进行排序。
程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换, 下次类推,即用第二个元素与后8个进行比较,并进行交换。
#include<stdio.h>
#define N 10
int main()
{ int i,j,a[N],temp;
printf(“请输入 10 个数字:\n”);
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N-1;i++)
{ int min=i;
for(j=i+1;j<N;j++)
if(a[min]>a[j]) min=j;
if(min!=i)
{ temp=a[min]; a[min]=a[i];
a[i]=temp;
} } printf(“排序结果是:\n”);
for(i=0;i<N;i++) printf("%d “,a[i]);
printf(”\n");
return 0;}
:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
假设该数为 x。
1、则:x + 100 = n2, x + 100 + 168 = m22、计算等式:m2 - n2 = (m + n)(m - n) = 1683、设置: m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶数4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要么都是偶数,要么都是奇数。5、从 3 和 4 推导可知道,i 与 j 均是大于等于 2 的偶数。6、由于 i * j = 168, j>=2,则 1 < i < 168 / 2 + 1。7、接下来将 i 的所有数字循环计算即可。
#include <stdio.h>
int main (void){ int i, j, m, n, x; for (i = 1; i < 168 / 2 + 1; i++) { if (168 % i == 0) { j = 168 / i; if ( i > j && (i + j) % 2 == 0 && (i - j) % 2 == 0) { m = (i + j) / 2; n = (i - j) / 2; x = n * n - 100; printf ("%d + 100 = %d * %d\n", x, n, n); printf ("%d + 268 = %d * %d\n", x, m, m); } } } return 0;}
题目:输入某年某月某日,判断这一天是这一年的第几天?
程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。
#include <stdio.h>
int main(){ int day,month,year,sum,leap; printf("\n请输入年、月、日,格式为:年,月,日(2015,12,10)\n"); scanf("%d,%d,%d",&year,&month,&day); // 格式为:2015,12,10 switch(month) // 先计算某月以前月份的总天数 { case 1:sum=0;break; case 2:sum=31;break; case 3:sum=59;break; case 4:sum=90;break; case 5:sum=120;break; case 6:sum=151;break; case 7:sum=181;break; case 8:sum=212;break; case 9:sum=243;break; case 10:sum=273;break; case 11:sum=304;break; case 12:sum=334;break; default:printf(“data error”);break; } sum=sum+day; // 再加上某天的天数 if(year%4000||(year%40&&year%100!=0)) {// 判断是不是闰年 leap=1; } else { leap=0; } if(leap==1&&month>2) { // *如果是闰年且月份大于2,总天数应该加一天 sum++; } printf(“这是这一年的第 %d 天。”,sum); printf("\n");}
题目:输入三个整数x,y,z,请把这三个数由小到大输出。
程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。
#include <stdio.h>
int main(){ int x,y,z,t; printf("\n请输入三个数字:\n"); scanf("%d%d%d",&x,&y,&z); if (x>y) { /交换x,y的值/ t=x;x=y;y=t; } if(x>z) { /交换x,z的值/ t=z;z=x;x=t; } if(y>z) { /交换z,y的值/ t=y;y=z;z=t; } printf(“从小到大排序: %d %d %d\n”,x,y,z);}
输出99口诀。
程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
#include<stdio.h>
int main(){ int i,j,result; printf("\n"); for (i=1;i<10;i++) { for(j=1;j<10;j++) { result=ij; printf("%d*%d=%-3d",i,j,result); /-3d表示左对齐,占3位/ } printf("\n"); /每一行后换行/ }}
乘法口诀改进版:
#include<stdio.h>int main(){ int i,j,result; printf("\n"); for (i=1;i<10;i++) { for(j=1;j<=i;j++) { result=ij; printf("%d%d=%-3d",j,i,result); /-3d表示左对齐,占3位/ } printf("\n"); /每一行后换行/ }}
题目:古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)
程序分析:兔子的规律为数列1,1,2,3,5,8,13,21…,即下个月是上两个月之和(从第三个月开始)。
#include<stdio.h>
int main(){ int f1=1,f2=1,i; for(i=1;i<=20;i++) { printf("%12d%12d",f1,f2); if(i%2==0) printf("\n"); f1=f1+f2; f2=f1+f2; } return 0;}
判断101到200之间的素数。
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数
#include <stdio.h>
int main(){ int i,j; int count=0; for (i=101; i<=200; i++) { for (j=2; j<i; j++) { // 如果j能被i整出在跳出循环 if (i%j==0) break; } // 判断循环是否提前跳出,如果j<i说明在2~j之间,i有可整出的数 if (j>=i) { count++; printf("%d “,i); // 换行,用count计数,每五个数换行 if (count % 5 == 0) printf(”\n"); } } return 0;}
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
#include<stdio.h>
int main(){ int i,x,y,z; for(i=100;i<1000;i++) { x=i%10; y=i/10%10; z=i/100%10; if(i==(xxx+yyy+zzz)) printf("%d\n",i); } return 0;}
题目:将一个正整数分解质因数。例如:输入90,打印出90=233*5。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于(小于的时候,继续执行循环)n,则说明分解质因数的过程已经结束,另外 打印出即可。(2)但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n.重复执行第二步。(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
#include<stdio.h>
int main(){ int n,i; printf(“请输入整数:”); scanf("%d",&n); printf("%d=",n); for(i=2;i<=n;i++) { while(n%i==0) { printf("%d",i); n/=i; if(n!=1) printf("*"); } } printf("\n"); return 0;}
题目:利用递归方法求5!。
程序分析:递归公式:fn=fn_14!
#include <stdio.h>
int main(){ int i; int fact(); for(i=0;i<6;i++){ printf("%d!=%d\n",i,fact(i)); }}int fact(int j){ int sum; if(j==0){ sum=1; } else { sum=jfact(j-1); } return sum;}
题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来
#include <stdio.h>
int main(){ int i=5; void palin(int n); printf(“请输入5个字符\40:\40”); palin(i); printf("\n");}void palin(n)int n;{ char next; if(n<=1) { next=getchar(); printf(“相反顺序输出结果\40:\40”); putchar(next); } else { next=getchar(); palin(n-1); putchar(next); }}
题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。。
#include <stdio.h>
int age(n)int n;{ int c; if(n==1) c=10; else c=age(n-1)+2; return©;}int main(){ printf("%d\n",age(5));}