maintainer:小支
一、数位分离
1、水仙花数(153):水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身
#include <stdio.h>
int main()
{
int i=0,g=0,s=0,b=0;
for(i=100;i<1000;i++)
{
g=i%10;
s=i/10%10;
b=i/100;
if(g*g*g+s*s*s+b*b*b==i)
printf("%d\n",i);
}
return 0;
}
2、同构数:正整数n若是它平方数的尾部,则称n为同构数。例如:5的平方数是25
#include <stdio.h>
int main()
{
int i=0,g=0;
for(i=1;i<100;i++)
{
g=i%10;
if(g*g==i)
printf("%d\n",i);
}
return 0;
}
3、各位数加起来和为7
#include <stdio.h>
int main()
{
int i=0,g=0,s=0,b=0;
for(i=100;i<1000;i++)
{
g=i%10;
s=i/10%10;
b=i/100;
if(g+s+b==7)
printf("%d\n",i);
}
return 0;
}
4、输出能被3整除且个位数为6的数
#include <stdio.h>
int main()
{
int i=0,t=0;
for(i=0;i<10;i++)
{
t=i*10+6;
if(t%3==0)
printf("%d\n",t);
}
return 0;
}
5、完数:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 找出1000以内的所有完数
#include <stdio.h>
int main()
{
int i=0,j=0,s=0;
for(i=1;i<=1000;i++)
{
s=0;
for(j=1;j<i;j++)
if(i%j==0)
s+=j;
if(s==i)
printf("%d\n",i);
}
return 0;
}
6、设计一个程序可以实现以下功能:寻找以下特征的四位正整数,其百位数为0,去掉百位数0可得到一个三位正整数,而该三位正整数乘以9等于原四位正整数。如6075=675*9。
#include <stdio.h>
int main()
{
int i=0,t=0;
for(i=1000;i<10000;i++)
{
if(i/100%10!=0)
continue;
t=i/1000*100+i%100;
if(t*9==i)
printf("%d\n",i);
}
return 0;
}
7、回文数
#include <stdio.h>
int main()
{
int i=0,t=0,n=0;
scanf("%d",&i);
t=i;
do
{
n=n*10+t%10;
t/=10;
}while(t);
if(n==i)
printf("是回文");
return 0;
}
8、"-1234"到数字-1234
#include <stdio.h>
int main()
{
char s[]="-1234",*p=s;
int flag=0,num=0;
if(*p=='-')
{
p++;flag=1;
}
while(*p!='\0')
{
num=num*10+*p-'0';
p++;
}
if(flag)
num=-num;
printf("%d",num);
return 0;
}
二、求和
1、1+1+2+1+2+3+1+2+3+4…+1+2+3+4+…+100
#include <stdio.h>
int main()
{
int i=0,j=0,sum=0;
for(i=1;i<=100;i++)
{
for(j=1;j<=i;j++)
sum+=j;
}
printf("%d",sum);
return 0;
}
2、1+12+123+…+123456789
#include <stdio.h>
int main()
{
int i=0;
long j=1,sum=0;
for(i=1;i<=9;i++)
{
sum+=j;
j=j*10+(i+1);
}
printf("%ld",sum);
return 0;
}
3、1+22+33+…+999999999
#include <stdio.h>
int main()
{
long i=0,j=0,t=0,sum=0;
for(i=1;i<=9;i++)
{
t=0;
for(j=1;j<=i;j++)
t=t*10+i;
sum+=t;
}
printf("%ld",sum);
return 0;
}
4、6+66+666+…+666666666
#include <stdio.h>
int main()
{
long i=0,t=0,sum=0;
for(i=1;i<=9;i++)
{
t=t*10+6;
sum+=t;
}
printf("%ld",sum);
return 0;
}
5、1*2+2*3+3*4+…+20*21
#include <stdio.h>
int main()
{
int i=0,sum=0;
for(i=1;i<=20;i++)
sum+=i*(i+1);
printf("%d",sum);
return 0;
}
6、1/2+2/3+3/4…9/10
#include <stdio.h>
int main()
{
float i=0.0,sum=0.0;
for(i=1.0;i<=9;i++)
sum+=i/(i+1);
printf("%f",sum);
return 0;
}
7、1-100的和
#include <stdio.h>
int main()
{
printf("%d",100*(1+100)/2); //5050
return 0;
}
三、统计
1、统计’a’-'z’出现的次数
#include <stdio.h>
int main()
{
char s[100];
int i=0,count=0;
gets(s);
while(s[i]!='\0')
{
if(s[i]>='a'&&s[i]<='z')
count++;
i++;
}
printf("%d",count);
return 0;
}
2、统计年龄在16-31岁的人数
#include <stdio.h>
int main()
{
int a[16]={0},n=0,i=0,t=0;
printf("请输入要输入的学生的个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&t);
if(t>=16&&t<=31)
a[t-16]++;
}
for(i=0;i<16;i++)
printf("%d岁的人数:%d\n",i+16,a[i]);
return 0;
}
3、统计分数在80-90分的人数
#include <stdio.h>
int main()
{
int a[11]={0},n=0,i=0,t=0;
printf("请输入要输入的学生的个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&t);
if(t>=80&&t<=90)
a[t-80]++;
}
for(i=0;i<11;i++)
printf("%d分的人数:%d\n",i+80,a[i]);
return 0;
}
四、数组
1、逆序存放
#include <stdio.h>
int main()
{
char s[]="hello",t=0,*p=s,*q=s+sizeof(s)-2;
while(p<q)
{
t=*p;
*p++=*q;
*q--=t;
}
puts(s);
return 0;
}
2、简单排序
#include <stdio.h>
int main()
{
int a[10]={8,5,9,2,3,4,6,8,4,0},i=0,j=0,t=0;
for(i=0;i<10-1;i++)
for(j=i+1;j<10;j++)
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
for(i=0;i<10;i++)
printf("%d ",a[i]);
return 0;
}
3、选择排序
#include <stdio.h>
int main()
{
int a[10]={8,5,9,2,3,4,6,8,4,0},i=0,j=0,t=0,flag=0;
for(i=0;i<10-1;i++)
{
flag=i;
for(j=i+1;j<10;j++)
if(a[flag]>a[j])
flag=j;
if(flag!=i)
{
t=a[i];
a[i]=a[flag];
a[flag]=t;
}
}
for(i=0;i<10;i++)
printf("%d ",a[i]);
return 0;
}
4、冒泡排序
#include <stdio.h>
int main()
{
int a[10]={8,5,9,2,3,4,6,8,4,0},i=0,j=0,t=0;
for(i=0;i<10-1;i++)
for(j=0;j<10-i-1;j++)
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for(i=0;i<10;i++)
printf("%d ",a[i]);
return 0;
}
5、行列元素互换
#include <stdio.h>
int main()
{
int a[3][3]={8,5,9,2,9,0,4,6,7},i=0,j=0,t=0;
for(i=0;i<3;i++)
for(j=i;j<3;j++)
{
t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t;
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
6、标记(例:将字符串的数字标记为T,字母标记为F)
#include <stdio.h>
int main()
{
char s[]="12 xiaopeng yyds",a[100];
int i=0;
for(i=0;i<sizeof(s)-1;i++)
{
if(s[i]>='0'&&s[i]<='9')
a[i]='T';
else if(s[i]>='a'&&s[i]<='z'&&s[i]>='A'&&s[i]<='Z')
a[i]='F';
}
for(i=0;i<sizeof(s)-1;i++)
printf("%c ",a[i]);
return 0;
}
7、数组左移、右移
#include <stdio.h>
int main()
{
char s[]="123456",*p=s,*q=s+sizeof(s)-2,t=0;
t=*p;
while(p<q)
{
*p=*(p+1);
p++;
}
*q=t;
puts(s); //234561
return 0;
}
8、n 个学生的信息(包括学生的姓名、m门的成绩、住址)存储在一个结构体 数组 s 中,现需设计一个函数,统计学生各科成绩平均分的总和,并通过函数返回。
#include <stdio.h>
struct STU{
char name[20];
float score[10];
char address[20];
};
double avg_fun(struct STU s[],int n,int m) //n名学生 m科成绩
{
int i=0,j=0;
double avg=0.0,sum=0.0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%f",&s[i].score[j]);
avg+= s[i].score[j]/n;
}
sum+=avg;avg=0.0;
}
return sum;
}
int main()
{
struct STU s[100];
double avg=0.0;
avg=avg_fun(s,3,3);
printf("%lf",avg);
return 0;
}
9、判断二维数组是否为对称数组
#include <stdio.h>
int main()
{
int a[3][3]={8,5,9,2,9,0,4,6,7},i=0,j=0,flag=1;
for(i=0;i<3;i++)
for(j=i;j<3;j++)
if(a[i][j]!=a[j][i])
{
flag=0;
break;
}
if(flag)
printf("是对称数组");
else
printf("不是对称数组");
return 0;
}
10、二维数组最大值及下标
#include <stdio.h>
int main()
{
int a[3][3]={59,100,9,5,4,3,600,11,15};
int i=0,j=0,imax=0,jmax=0;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(a[i][j]>a[imax][jmax])
{
imax=i;
jmax=j;
}
printf("max=%d,行下标:%d,列下标:%d",a[imax][jmax],imax,jmax);
return 0;
}
11、杨辉三角
#include <stdio.h>
int main()
{
int a[10][10]={0},i=0,j=0;
for(i=0;i<10;i++)
a[i][0]=a[i][i]=1;
for(i=2;i<10;i++)
for(j=1;j<i;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0;i<10;i++)
{
for(j=0;j<=i;j++)
{
printf("%d ",a[i][j]);
}
putchar('\n');
}
return 0;
}
12、二维数组存放在一维数组里
#include <stdio.h>
int main()
{
int a[3][3]={59,100,9,5,4,3,600,11,15};
int b[9],i=0,j=0,k=0;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
b[k++]=a[i][j];
for(k=0;k<9;k++)
printf("%d ",b[k]);
return 0;
}
五、字符数组
1、基本:输入输出
#include <stdio.h>
int main()
{
char s1[10],s2[10];
scanf("%s",s1);
printf("%s\n",s1);
return 0;
}
#include <stdio.h>
int main()
{
char s1[10],s2[10];
gets(s2);
puts(s2);
return 0;
}
2、字符串连接
#include <stdio.h>
void my_strcat(char *s1,char *s2)
{
while(*s1!='\0')
s1++;
while(*s2!='\0')
*s1++=*s2++;
*s1='\0';
}
int main()
{
char str1[50]="xiaopeng",str2[10]="yyds";
my_strcat(str1,str2);
puts(str1); //xiaopengyyds
return 0;
}
3、字符串复制
#include <stdio.h>
void my_strcpy(char *s1,char *s2)
{
while(*s2!='\0')
*s1++=*s2++;
*s1='\0';
}
int main()
{
char str1[50]="xiaopeng",str2[10]="yyds";
my_strcpy(str1,str2);
puts(str1); //yyds
return 0;
}
4、字符串比较
#include <stdio.h>
int my_strcmp(char *s1,char *s2)
{
while(*s1!='\0'&&*s2!='\0')
if(*s1++!=*s2++)
return *(s1-1)-*(s2-1);
return 0;
}
int main()
{
char str1[50]="xiaopeng",str2[10]="yyds",result=0;
result=my_strcmp(str1,str2);
printf("%d",result); //-1
return 0;
}
5、字符串有效长度
#include <stdio.h>
int my_strlen(char *s1)
{
int count=0;
while(*s1++!='\0')
count++;
return count;
}
int main()
{
char str1[50]="xiaopeng",result=0;
result=my_strlen(str1);
printf("%d",result); //8
return 0;
}
6、统计某类字符、删除某类字符(删除数字)
#include <stdio.h>
int main()
{
char str1[50]="xia4345openg564365 yyds",*p,*q;
for(p=q=str1;*p!='\0';p++)
if(*p<'0'||*p>'9')
*q++=*p;
*q='\0';
puts(str1); //xiaopeng yyds
return 0;
}
7、回文字符串
#include <stdio.h>
int main()
{
char str1[50]="xia4345openg564365 yyds",*p=str1,*q=str1;
int flag=1;
while(*q!='\0')
q++;
q--;
while(p<q)
if(*p++!=*q--)
{
flag=0;break;
}
if(flag)
printf("是回文字符串");
else
printf("不是回文字符串");
return 0;
}
8、重点:子串在主串中出现的次数
#include <stdio.h>
int main()
{
char str1[50]="abnbcababaabaab",str2[]="ab";
char *p,*t1,*t2;
int count=0;
for(p=str1;*p!='\0';p++)
{
for(t1=p,t2=str2;*t2!='\0';t1++,t2++)
if(*t1!=*t2)
break;
if(*t2=='\0')
count++;
}
printf("%d",count); //5
return 0;
}
9、请设计一个程序,其功能为:自左至右取出非空字符串a中的所有数字字符,将这些数字字符组成一个十进制整数并输出,并输出取出所有数字字符后的其他字符。例如:字符串a为"ch20an4gch12un 2ro3ad",程序输出:“2041223"和"changchun road”
#include <stdio.h>
int main()
{
char str1[50]="xia4345openg565 yyds",*p,*q;
int a=0;
for(p=str1,q=str1;*p!='\0';p++)
if(*p>='0'&&*p<='9')
a=a*10+*p-'0';
else
*q++=*p;
*q='\0'; //xiaopeng yyds
puts(str1);
printf("%d",a); //4345565
return 0;
}
六、函数
1、编写自定义函数
(1)编写函数让三个数从大到小输出(关键:地址传递)
#include <stdio.h>
void my_sort(int *a,int *b,int *c)
{
int t=0;
if(*a<*b)
{t=*a;*a=*b;*b=t;}
if(*a<*c)
{t=*a;*a=*c;*c=t;}
if(*b<*c)
{t=*b;*b=*c;*c=t;}
}
int main()
{
int a=10,b=30,c=20;
my_sort(&a,&b,&c);
printf("%d %d %d",a,b,c);
return 0;
}
(2)编写函数对数组进行排序(关键:实参:数组名和长度)
#include <stdio.h>
void my_sort(int a[],int n)
{
int i=0,j=0,t=0;
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
if(a[j]>a[j+1])
{
t=a[j];a[j]=a[j+1];a[j+1]=t;
}
}
int main()
{
int a[50],n=0,i=0;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
my_sort(a,n);
for(int i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
(3)编写一个函数判断对称数组
#include <stdio.h>
int dc(int n)
{
int i=0,j=0,flag=1;
for(i=0;i<n&&flag;i++)
for(j=i;j<n;j++)
if(a[i][j]!=a[j[i]])
flag=0;
return flag;
}
(4)编写一个函数求主串中子串的个数
#include <stdio.h>
int Fun(char *s1,char *s2)
{
int count=0;
char *t1,*t2;
while(*s1)
{
for(t1=s1,t2=s2;*t2!='\0';t1++,t2++)
if(*t1!=*t2)
break;
if(*t2=='\0')
count++;
s1++;
}
return count;
}
int main()
{
printf("%d",Fun("abababbbab","bab")); //3
return 0;
}
2、递归函数
(1)递归求阶乘和
#include <stdio.h>
long Fun(int n)
{
return n==1?1:n*Fun(n-1);
}
int main()
{
int a=0;
long sum=0;
scanf("%d",&a);
for(int i=1;i<=a;i++)
sum+=Fun(i);
printf("%ld",sum);
return 0;
}
(2)递归求平方和
#include <stdio.h>
double Fun(int n)
{
return n==1?1:n*n+Fun(n-1);
}
int main()
{
printf("%.2lf",Fun(2));
return 0;
}
(3)递归求x的n次方
#include <stdio.h>
double Fun(int x,int n)
{
return n==0?1:x*Fun(x,n-1);
}
int main()
{
printf("%.2lf",Fun(2,2));
return 0;
}
(4)递归求斐波那契数列前n项
#include <stdio.h>
int Fun(int n)
{
return n==1||n==2?1:Fun(n-1)+Fun(n-2);
}
int main()
{
int n=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
printf("%d ",Fun(i));
return 0;
}
(5)递归求杨辉三角前n行
#include <stdio.h>
int Fun(int i,int j)
{
return i==j||j==1?1:Fun(i-1,j-1)+Fun(i-1,j);
}
int main()
{
int n=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
printf("%d ",Fun(i,j));
putchar('\n');
}
return 0;
}
(6)递归求最大公约数
#include <stdio.h>
int Fun(int a,int b)
{
int t=0;
if(a<b)
{
t=a;a=b;b=t;
}
return a%b?Fun(b,a%b):b;
}
int main()
{
int a=0,b=0;
scanf("%d %d",&a,&b);
printf("%d",Fun(a,b));
return 0;
}
七、结构体
1、结构体求平均成绩
#include <stdio.h>
struct stu{
char name[20];
double score;
};
int main()
{
struct stu a[30];
int n=0,i=0;
double avg=0.0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
gets(a[i].name);
scanf("%lf",&a[i].score);
avg+=a[i].score/n;
}
printf("%lf",avg);
return 0;
}
2、结构体按某成员进行排序
#include <stdio.h>
struct stu{
char name[20];
int id;
double score;
};
int main()
{
struct stu a[30],t=0;
int n=0,i=0,j=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
gets(a[i].name);
scanf("%d%lf",&a[i].id,&a[i].score);
}
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i].id>a[j].id)
{
t=a[i];a[i]=a[j];a[j]=t;
}
for(i=0;i<n;i++)
printf("%s\t%d\t%lf\n",a[i].name,a[i].id,a[i].score);
return 0;
}
3、结构体求最高分并输出该学生的所有信息
#include <stdio.h>
struct stu{
char name[20];
int id;
double score;
};
int main()
{
struct stu a[30],t;
int n=0,i=0,imax=0;
double max=0.0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
gets(a[i].name);
scanf("%d%lf",&a[i].id,&a[i].score);
if(a[i].score>max)
{
max=a[i].score;
imax=i;
}
}
printf("%s\t%d\t%lf\n",a[imax].name,a[imax].id,a[imax].score);
return 0;
}
八、其他
1、可逆素数
#include <stdio.h>
int convert(int a)
{
int t=0;
do{
t=t*10+a%10;
a/=10;
}while(a);
return t;
}
int issushu(int b)
{
for(int i=2;i<b/2;i++)
if(b%i==0)
return 0;
return 1;
}
int Fun(int m,int n,int c[])
{
int j=0;
for(int i=m;i<=n;i++)
if(issushu(i)&&issushu(convert(i)))
c[j++]=i;
return j;
}
int main()
{
int m=0,n=0,a[100],w=0;
scanf("%d%d",&m,&n);
w=Fun(m,n,a);
for(int i=0;i<w;i++)
{
printf("%d ",a[i]);
if((i+1)%5==0)
putchar('\n');
}
return 0;
}
2、已知数组a中的元素已按由小到大顺序排列,以下程序的功能是将输入的一个数插入数组a中,插入后,数组a中的元素仍然由小到大顺序排列
#include <stdio.h>
int main()
{
int a[10],b=0,i=0,*p=a;
for(i=0;i<9;i++)
scanf("%d",p++);
scanf("%d",&b);
p--;
while(b<*p)
*(p+1)=*p--;
*(p+1)=b;
for(i=0;i<10;i++)
printf("%d ",a[i]);
return 0;
}
3、分段函数(if语句)
#include <stdio.h>
int main()
{
double y=0.0,x=0.0;
scanf("%lf",&x);
if(x<1)
y=x;
else if(x>=10)
y=3*x-11;
else
y=2*x-1;
printf("%.2lf",y);
return 0;
}
4、求e的近似值
#include <stdio.h>
double jc(int i)
{
return i==1?1:i*jc(i-1);
}
int main()
{
double e=1.0;
int i=0,n=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
e+=1/jc(i);
printf("%lf",e);
return 0;
}
5、九九乘法表
#include <stdio.h>
int main()
{
int i=0,j=0;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
printf("%d*%d=%d\t",j,i,i*j);
putchar('\n');
}
return 0;
}
6、输出倒三角
#include <stdio.h>
int main()
{
int i=0,j=0,t=0;
for(i=0;i<4;i++)
{
for(t=0;t<i;t++)
printf(" ");
for(j=0;j<4-i;j++)
printf("* ");
putchar('\n');
}
return 0;
}
7、猴子吃桃
/*
一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。
到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?
*/
#include <stdio.h>
int fun(int n)
{
return n==1?1:(fun(n-1)+1)*2;
}
int main()
{
printf("%d",fun(3)); //10
return 0;
}
8、温度转换
/*
本题要求编写程序,计算华氏温度150°F对应的摄氏温度。计算公式:C=5×(F-32)/9,
式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型。
*/
#include <stdio.h>
int main()
{
double hs=150;
int c=0;
c=5*(hs-32)/9;
printf("%d",c);
return 0;
}
9、计算物体自由下落的距离
/*
一个物体从100米的高空自由落下。编写程序,求它在前3秒内下落的垂直距离。设重力加速度为10m/s^2 .
思路:利用物理公式H=1/2*g*t^2。
*/
#include <stdio.h>
int main()
{
double h=0.0;
h=10*3*3/2;
printf("%lf",h);
return 0;
}