在此整理出之前做的一些题目,所有函数包含在同一个头文件中,可在main函数中自行测试,都是些经典题目,供新手老手参阅。转载标明出处,谢谢。
// mywork.c
// data_struct
//
// Created by sdd on 17/8/22.
// Copyright © 2017年 sdd. All rights reserved.
//
#include "mywork.h"
#include <stdio.h>
#include "math.h"
#include <string.h>
#include <stdlib.h>
//题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
//程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。
int first() {
// insert code here...
// insert code here.
printf("there are numbers:\n");
int count=0;
for(int i=1;i<5;i++){
for(int j=1;j<5;j++){
for(int k=1;k<5;k++){
if(i!=j && i!=k && j!=k){
printf("%d\n",i*100+j*10+k);
count++;
}
}
}
}
printf("there are total %d numbers\n",count);
return 0;
}
//一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
int second(){
int a=-100;
while(a<1000){
int temp1=(int)(sqrt(a+100));
int temp2=(int)(sqrt(a+168));
if(temp1*temp1==(a+100) &&temp2*temp2 == (a+168)){
break;
}
a++;
}
printf("this number is %d\n",a);
return 0;
}
//给出日期,计算出是今年的第几天
int third(int year,int month,int day){
int date[12];
int result=0;
//判断闰年
switch(month){
case(1): date[0]=0;
case(2): date[1]=31;
case(3): date[2]=59;
case(4): date[3]=90;
case(5): date[4]=120;
case(6): date[5]=151;
case(7): date[6]=181;
case(8): date[7]=212;
case(9): date[8]=243;
case(10): date[9]=273;
case(11): date[10]=304;
case(12): date[11]=334;
}
if((year%4==0&&year%100!=0)||(year%400==0)){
if(month>=3){
for(int i=3;i<12;i++){
date[i]=date[i]+1;
}
}
result=date[month]+day;
}else{
result=date[month]+day;
}
printf("third is %d\n",result);
return result;
}
//将xyz永远由由小到大的顺序输出
//程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。
void fifth(int x,int y,int z){
int tmp;
if(x>y){ //第一句
tmp=x;
x=y;
y=tmp;
}
if(x>z){ //第二句,和第一句都是为了将x赋予最小值
tmp=x;
x=z;
z=tmp;
}
if(y>z){
tmp=y; //第三句,就是为了将z赋予成为最大值
y=z;
z=tmp;
}
printf("%d\t%d\t%d\t",x,y,z);//编程的重要要求:固定输出
return;
}
//画出一个c
void sixth(){
printf("this is the c i draw!\n");
printf(" * *\n");
printf(" * *\n");
printf(" *\n");
printf("*\n");
printf(" *\n");
printf(" * *\n");
printf(" * *\n");
return;
}
//打印九九乘法表
void eighth(){
int result=0;
printf("九九乘法表打印如下:\n");
for(int i=1;i<10;i++){
for(int j=1;j<10;j++){
result=i*j;
printf("%dx%d=%d\t",i,j,result);
}
printf("\n");
}
return;
}
//打印斐波那契数列
//古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月
// 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
// 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
int ninth(int month){
int result=1;
if(month==1||month==2){
result= 1;
return result;
}
while(1){
result = ninth(month-1)+ninth(month-2);
return result;
}
}
//打印101到200之间所有的素数并算出总数
void tenth(){
int count=0;
for(int i=101;i<201;i++){
int temp=(int)sqrt(i);
int j=2;
for(j=2;j<(temp+1);j++){
if(i%j==0){
break;
}
}
if(j>temp){
count++;
printf("%d\n",i);
}
}
printf("total:%d\n",count);
}
//打印所有的水仙花数,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身
void eleventh(){
for(int i=100;i<1000;i++){
int hundred,ten,one;
hundred=(int)(i/100);
ten=(int)((i-hundred*100)/10);
one=(int)(i-hundred*100-ten*10);
if(hundred*hundred*hundred+ten*ten*ten+one*one*one==i){
printf("%d\n",i);
}
}
}
//判断一个数字是否为质数
int iszhishu(unsigned int a){
int temp=(int)sqrt(a);
for(int i=2;i<(temp+1);i++){
if(a%i==0){
return 0;
}
}
return 1;
}
//将正整数分解质因数
//程序分析:1. 若i与number相等,则空伦一遍循环跳出for,打印出最后一个数字。2. 若可以整除,则打印出来i并赋予number新值,继续进行while的判 断!!!(巧妙!!!),这样可以非常方便地判断剩下数字是否还可以被这个最小质数整除!!!
// 3. 若不可整除,则进行正常的下一轮for循环。
// 最后的排列顺序一定是由小到大的排列顺序。
int twelfth(unsigned int number){
printf("%d=",number);
int i;
for(i=2;i<(number+1);i++){
while(i!=number){
if(number%i==0){
printf("%dx",i);
number=number/i;
}else{
break;
}
}
}
printf("%d\n",number);
return 0;
}
//利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
//程序分析:(a>b)?a:b这是条件运算符的基本例子。
void thirteenth(unsigned int score){
char grade;
grade=(score<60)?'C':(score>=90)?'A':'B';
printf("%c\n",grade);
}
//输入两个正整数m和n,求其最大公约数和最小公倍数。
//使用辗转相除法,最小公倍数是两数相乘再除以最小公约数
void forteenth(int big,int small){
int a1=big;
int a2=small;
while(small!=0){
int tmp=big%small;
if(tmp>small){
big=tmp;
}else{
big=small;
small=tmp;
}
}
printf("最大公约数:%d\n",big);
printf("最小公倍数:%d\n",a1*a2/big);
return;
}
//输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
void fifteenth(){
char c;;
int count1=0;
int count2=0;
int count3=0;
int count4=0;
while((c=getchar())!='\n'){
if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){
count1++;
}else if (c==' '){
count2++;
}else if(c>='0'&&c<='9'){
count3++;
}else{
count4++;
}
}
printf("the english number is:%d\nthe blank number is:%d\nmath number is:%d\nother number is:%d\n",count1,count2,count3,count4);
return;
}
//求s=a+aa+aaa+aaaa+a…a的值,其中a是一个数字。例如2+22+222+2222+22222(共有5个数相加),几个数相加有键盘控制。
void sixteenth(int number,int mount){
int multi=1;
int sum=0;
int result=0;
for(int i=1;i<(mount+1);i++){
sum=sum+number*multi;
multi=multi*10;
result=result+sum;
}
printf("%d\n",result);
}
//一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。
void seventeenth(){
int storage[100]; //定义得稍微大一点防止溢出
for(int i=1;i<1000;i++){
int count=0;
for(int j=1;j<i;j++){
if(i%j==0){
storage[count]=j;
count++;
}
}
int sum=0;
for(int k=0;k<(count);k++){ //一定是count,因为最后count还加了1,所以最后的count代表了数组内存入有效数字的个数
sum=sum+storage[k];
}
if(sum==i){
printf("%d\n",i);
}
}
}
//一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
void eighteenth(){
double hight=50;
double sum=100;
for(int i=1;i<10;i++){
sum=hight*2+sum;
hight=hight/2;
}
printf("%f\n%f\n",hight,sum);
}
//猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
void ninteenth(){
int day=9;
int sum=1;
while(day!=0){
sum=(1+sum)*2;
day--;
}
printf("%d\n",sum);
return;
}
//:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
//程序分析: 先将所有可能的结果用三重循环全部列出,再加上两两对战和某某与某某不比的条件,通过条件筛选的即为最后对战次序。
void twentieth(){
char i,j,k;
for(i='x';i<='z';i++){
for(j='x';j<='z';j++){
for(k='x';k<='z';k++){
if((i!=k)&&(i!=j)&&(j!=k)){
if(i!='x'&&k!='x'&&k!='z'){
printf("a battle with %c\nb battle with %c\nc battle with %c\n",i,j,k);
}
}
}
}
}
}
//打印出如下图案(菱形)
// *
// ***
// ******
// ********
// ******
// ***
// *
//解答这道题建立在深入理解循环以及for小括号中各个量值的具体含义的基础上。
void twefirst(){
for(int i=0;i<4;i++){
for(int j=1;j<(4-i);j++){
printf(" ");
}
for(int k=0;k<(2*i+1);k++){
printf("*");
}
printf("\n");
}
for(int i=0;i<3;i++){
for(int j=0;j<(i+1);j++){
printf(" ");
}
for(int k=0;k<(5-i*2);k++){
printf("*");
}
printf("\n");
}
}
//有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
//程序分析:请抓住分子与分母的变化规律。
void twesecond(){
double a=2;
double b=1;
double tmp;
double sum=0;
for(int i=0;i<20;i++){
sum=sum+(a/b);
tmp=a+b;
b=a;
a=tmp;
}
printf("%9.6f\n",sum);//表示数字一共占9位,其中小数点保留6位
}
//题目:求1+2!+3!+...+20!的和
//程序分析:此程序只是把累加变成了累乘。
//应当注意sum的数据类型应该设置为long int(%ld)或float(%lf)
void twethird(){
float sum=0;
int now=1;
for(int i=1;i<=20;i++){
now=now*i;
sum=sum+now;
}
printf("%lf\n",sum);
return;
}
//题目:利用递归方法求5!。
//程序分析:递归公式:fn=fn_1*4!
int tweforth(int number){
if(number==1||number==0){ //注意0!=1
return 1;
}
while(number!=1){
return number*tweforth(number-1);
}
return 0;
}
//题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
void twefifth(){
}
//题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
//程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。
int twesixth(int number){
if(number==1){
return 10;
}
while(number!=1){
return twesixth(number-1)+2;
}
return 0;
}
//给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
//解发一如下是一种非常简单的算法,十分笨拙。1000之类的数字会打印错误。
void tweseventh(long int number){
int a1=(int)(number/10000);
int a2=(int)((number-10000*a1)/1000);
int a3=(int)((number-10000*a1-1000*a2)/100);
int a4=(int)((number-10000*a1-1000*a2-100*a3)/10);
int a5=(int)(number%10);
if(a1!=0){
printf("there is 5,%d%d%d%d%d\n",a5,a4,a3,a2,a1);
}else if(a2!=0){
printf("there is 4,%d%d%d%d\n",a4,a3,a2,a1);
}else if(a3!=0){
printf("there is 3,%d%d%d\n",a3,a2,a1);
}else if(a4!=0){
printf("there is 2,%d%d\n",a2,a1);
}else if(a5!=0){
printf("there is 1,%d\n",a1);
}else{
printf("0\n");
}
}
//解法二十分巧妙!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!
void tweighth(long int number){
int sum=0;
int count=0;
int a;
while(number!=0){
a=number%10;
number=number/10;
sum=sum*10+a; //这是十分重要的一步,这一步使得填写的总是最后一位!前面相加的值不停地向左移位(不停地乘10)
count++;
}
printf("%d\nthere is total:%d number\n",sum,count);
}
//一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
void tweninth(long int number){
if(number<10000||number>999999){
printf("you have input a wrong number!\n");
return;
}
long int a[5];
int count=0;
for(int i=0;i<5;i++){
a[i]=number%10;
number=number/10;
}
for(int i=0;i<2;i++){
if(a[i]==a[4-i]){
count++;
}
}
if(count==2){
printf("yes!\n");
}else{
printf("no!\n");
}
}
//请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母
int thirtieth(){
printf("please input the first char:\n");
char c;
scanf("%c",&c);
rewind(stdin);
//setbuf(stdin,NULL);//rewind和setbuf都可以用作清除缓存区使用,但是fflush在xcode中不可使用。
if(c=='m'){
printf("this is monday\n");
}else if(c=='w'){
printf("the is is wednesday\n");
}else if(c=='f'){
printf("this is friday\n");
}else if(c=='s'){
printf("please input second char:\n");
scanf("%c",&c);
if(c=='u'){
printf("this is sunday\n");
}else if(c=='a'){
printf("this is saturday\n");
}
}else if(c=='t'){
printf("please input second char:\n");
scanf("%c",&c);
if(c=='u'){
printf("this is tuesday\n");
}else if(c=='h'){
printf("this is thursday\n");
}
}
return 0;
}
//求100之内的素数
void thirfirst(){
int sushu[50];
int mark=0;
for(int i=2;i<101;i++){
int tmp=sqrt(i);
int count=0;
for(int j=2;j<=tmp;j++){
if(i%j==0){
count=1;
break;
}
}
if(count==0){
sushu[mark]=i;
mark++;
}
}
for(int i=0;i<mark;i++){
printf("%d\n",sushu[i]);
}
printf("the total number is:%d\n",mark);
return;
}
//对10个数进行排序
//程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。
void thirsecond(double*pre){
for(int i=0;i<10;i++){
double tmp;
for(int j=0;j<(9-i);j++){
if(pre[j]<pre[j+1]){
tmp=pre[j];
pre[j]=pre[j+1];
pre[j+1]=tmp;
}
}
}
for(int i=0;i<10;i++){
printf("%f\n",pre[i]);
}
}
//题目:求一个3*3矩阵对角线元素之和
//程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。
void thirthird(double pre[][3]){ //后面这个三表示一行有几个数字,
double sum=0;
for(int i=0;i<3;i++){
sum=sum+pre[i][i];
}
printf("sum is %f\n",sum);
}
//题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
//程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。
void thirforth(int *pre,int size,int number){
int *after=(int*)malloc((size+1)*sizeof(int));
if(number<=pre[size]){
for(int i=0;i<size;i++){
after[i]=pre[i];
}
after[size]=number;
}else{
for(int i=0;i<size;i++){
if(number>=pre[i]){
//number占i位,0~i-1,after和pre一样,i+1到size是pre[i-1]=after[i]
after[i]=number;
for(int j=0;j<(size+1);j++){
printf("%d\n",after[j]);
}
printf("\n");
for(int j=0;j<i;j++){
after[j]=pre[j];
}
for(int j=0;j<(size+1);j++){
printf("%d\n",after[j]);
}
printf("\n");
for(int j=(i+1);j<=size;j++){
after[j]=pre[j-1];
}
for(int j=0;j<(size+1);j++){
printf("%d\n",after[i]);
}
printf("\n");
}
}
}
// for(int i=0;i<(size+1);i++){
// printf("%d\n",after[i]);
// }
}
//将一个数组逆序输出。
//程序分析:用第一个与最后一个交换
void thirfifth(int* pre,int number){
printf("number/2 is:%d\n",number/2);
int i;
i=(double)(number/2);
printf("the previous is:\n");
for(int j=0;j<number;j++){
printf("%d\n",pre[j]);
}
for(int j=0;j<i;j++){
int tmp;
tmp=pre[j];
pre[j]=pre[number-1-j];
pre[number-1-j]=tmp;
}
printf("the after is:\n");
for(int j=0;j<number;j++){
printf("%d\n",pre[j]);
}
}
//学习static定义静态变量的用法
void static_fun(){
int i=0;
static int j=0;
printf("i=%d\n",i);
i++;
printf("static j=%d\n",j);
j++;
}
以下为头文件:
// mywork.h
// data_struct
//
// Created by sdd on 17/8/22.
// Copyright © 2017年 sdd. All rights reserved.
//
#ifndef mywork_h
#define mywork_h
#include <stdio.h>
//1234不重复的三位数,分别输出并计算总数
int first();
//某数+100,+168均为完全平方数,求这个值
int second();
//
int third(int year,int month,int day);
void fifth(int x,int y,int z);
void sixth();
void seventh();
void eighth();
int ninth(int month);//斐波那契数列
void tenth();//判断101到200之间有多少素数,并打印出来
void eleventh();//打印所有的水仙花数
int twelfth(unsigned int number);//将正整数分解质因数
int iszhishu(unsigned int a);
void thirteenth(unsigned int score);
void forteenth(int big, int small);
void fifteenth();
void sixteenth(int number,int mount);
void seventeenth();
void eighteenth();
void ninteenth();
void twentieth();
void twefirst();
void twesecond();
void twethird();
int tweforth(int number);
void twefifth();
int twesixth(int number);
void tweseventh(long int number);
void tweighth(long int number);
void tweninth(long int number);
int thirtieth();
void thirfirst();
void thirsecond(double*pre);
void thirthird(double pre[][3]);
void thirforth(int pre[],int size,int number);
void thirfifth(int* pre,int number);
void static_fun();
#endif /* mywork_h */