C语言题目
1.数字正序输出
递归
void zhe(int n){
if(n<10){
printf("%d",n);
return ;
}
zhe(n/10);
printf("%d",n%10);
}
非递归
int n=0;
int num=1245;
while(num!=0){
num/=10;
n++;
}
int i,j=1;
num=1245;
for(i=n;i>1;i--){
j=j*10;
}
for(i=n;i>0;i--){
printf("%d\n",num/j);
num=num%j;
j/=10;
}
2.数字倒序输出 递归
void nui(int n){
if(n<10){
printf("%d",n);
return ;
}
printf("%d",n%10);
nui(n/10);
}
3.鞍点
int i,j,k,flag=1;
int max,maxj;
int a[4][5]={{1,2,3,4,5},{2,4,6,8,10},{3,6,9,12,15},{4,8,12,16,20}};
for(i=0;i<4;i++){
max=a[i][0];
maxj=0;
for(j=0;j<5;j++){
if(a[i][j]>max){
max=a[i][j];
maxj=j;
}
}
for(k=0;k<4;k++){
if(max>a[k][maxj]){
flag=0;
}
}
if(flag) {
printf("a[%d][%d]=%d",i,maxj,max);
break;
}
}
if(!flag){
printf("no");
}
4.兔子繁殖递归
int f(int n){
if(n==1||n==2)
{
return 1;
}
else{
return f(n-1)+f(n-2);
}
}
5.插入法
int a[5]={4,7,8,2,5}; //
int i,j,m;
for(i=1;i<5;i++){
m=a[i]; //
j=i-1;
while(j>=0&&m<a[j]){
a[j+1]=a[j];
j--;
}
a[j+1]=
m;
}
6.已经拍好的数据插入一个数
int a[5]={1,2,3,5,7};
int num=6;
int temp1,temp2;
int i,j;
if(num>a[4]){
a[5]=num;
}else{
for(i=0;i<5;i++){
if(a[i]>num){
temp1=a[i];
a[i]=num;
for(j=i+1;j<=5;j++){
temp2=a[j];
a[j]=temp1;
temp1=temp2;
}
break;
}
}
}
7.杨辉三角递归
int yan(int i,int j){
if(j==0||j==i){
return 1;
}
return yan(i-1,j)+yan(i-1,j-1);
}
一维数组
int i,j;
int arr[100];
for(i=0;i<5;i++){
for(j=0;j<5-i;j++){
printf(" ");
}
for(j=i;j>=0;j--){
if(j==0||j==i){
arr[j]=1;
}
else{
arr[j]=arr[j-1]+arr[j];
}
printf("%2d",arr[j]);
}
printf("\n");
}
杨辉三角等腰三角形
int yan(int i,int j){
if(j==0||j==i){
return 1;
}
return yan(i-1,j)+yan(i-1,j-1);
}
for(i=0;i<4;i++){
for(j=0;j<(4-i)*3;j++){
printf(" ");
}
for(j=0;j<=i;j++){
printf("%6d", yan(i,j)); //6d 等腰,3d左边直角
8.字符串比较 不用strcmp
char s1[100];
char s2[100];
gets(s1);
gets(s2);
int i=0;
int resu;
while(s1[i]!='\0'&&s1[i]==s2[i]) i++;
if(s1[i]=='\0'&&s2[i]=='\0') resu=0;
else resu=s1[i]-s2[i];
printf("%d",resu);
字符串转换 a-z A-Z 26-(a[j]-64)+1+64 26-(a[j]-96)+1+96 a 65 A 97
9.删除指定字符串
循环法
char a[100]="aafbasd";
char b[100]="aadcd";
int i,j,k;
for(i=0;i<strlen(b);i++){
for(j=k=0;j<strlen(a);j++){
if(a[j]!=b[i]){
a[k++]=a[j];
}
}
a[k]='\0';
}
puts(a);
指针法
void de(char *s1,char *s2){
char *p1=s1,*p2;
while(*s1){
p2=s2;
while(*p2&&(*p2!=*s1)) p2++;
if(*p2=='\0') *p1++=*s1;
s1++;
}
*p1='\0';
}
10.删除指定位置字符串
char dele(char *p, int n) {
if (p == NULL || n < 0||n >strlen(p)) {
return '\0'; // 返回空值表示删除失败
}
char deleted_char = *(p + n); // 保存被删除的字符
while (*(p + n) != '\0') {
*(p + n) = *(p + n + 1);
n++;
}
return deleted_char; // 返回被删除的字符
}
11.删除数字字符把数字字符存进新数组
void de1(char *s1,char *s2){
char *p1=s1;
while(*s1){
if(!isdigit(*s1)){
*p1++=*s1;
}
else{
*s2++=*s1;
}
s1++;
}
*p1='\0';
*s2='\0';
}
12.反转字符串
数组
char a[100]="abc105aoui";
int i,j;
char t;
for(i=0,j=strlen(a);i<strlen(a)/2;i++,j--){
t=a[i];
a[i]=a[j-1];
a[j-1]=t;
}
printf("%s",a);
递归
求字符串长度
int my_strlen(char *arr){
if(*arr=='\0') return 0;
else
return 1+my_strlen(1+arr);
}
反转字符串
void reverse_string(char arr[]){
int len=my_strlen(arr);
if(len<=1) return;
else{
char tem=arr[0];
arr[0]=arr[len-1];
arr[len-1]='\0';
reverse_string(arr+1);
arr[len-1]=tem;
}
}
13.判断一个字符里最长的单词
#include <ctype.h>
int longest(char str[]){
int flag=1,place,point,length=0,len,i;
for(i=0;i<=strlen(str);i++){
if(isalpha(str[i])){
if(flag){
point=i;
flag=0;
}
else len++;
}
else{
flag=1;
if(len>=length){
length=len;
place=point;
len=0;
}
}
}
return (place);
}
char a[100];
gets(a);
int i;
for(i=longest(a);isalpha(a[i]);i++)
printf("%c",a[i]);
14.递归将数字转为字符
void convert(int n){
int i;
if((i=n/10)!=0) convert(i);
putchar(n%10+'0');
putchar(32);
}
15.汉诺塔
void hanoi(int n,char A,char B,char C){
if(n==1){
printf("%c--->%c ",A,B);
}
else{
hanoi(n-1,A,C,B);
printf("%c--->%c ",A,B);
hanoi(n-1,C,B,A);
}
}
16.是否回文
指针
char str[200]=“abccba”;
char *end=str+strlen(str)-1;
char *start=str;
while(end>start){
if(*end!=*start){
printf(“no”);
break;
}
end–;
start++;
}
if(*end==*start){
printf(“yes”);
}
数组写法
char a[100]=“abc”;
char b[100];
int j;
int k=0;
for(j=strlen(a)-1;j>=0;j–){
b[k++]=a[j];
}
b[k]=‘\0’;
int i=0;
while(a[i]!=‘\0’&&a[i]b[i]) i++;
if(a[i]‘\0’&&b[i]==‘\0’){
printf(“yes”);
}else{
printf(“no”);
}
17.阶乘递归
int fac(int n){
if(n<=1) return 1;
else return n*fac(n-1);
}
18.josephus报数
指针
void josephus(int n,int m){
int a[n];
int *p=a;
int i;
for(i=0;i<n;i++){
*(p+i)=i+1;
}
int k=0,count=0;
i=0;
while(count<=n-1){
if(*(p+i)!=0) k++;
if(k==m){
//printf("%d",*(p+i));
*(p+i)=0;
k=0;
count++;
}
i++;
if(n==i) i=0;
}
// 不等于,最后一个出局while(count<n-1) while(*p==0) p++; printf("%d",*p);
}
非指针
void josephus(int a[],int n,int m){
int i,j,count=0;
int c=0;
for(i=0;i<n;i++){
a[i]=i+1;
}
/* 1 2 3
1 0 3
count=1
count=2
count=0
0 0 3
*/
for(i=0;i<n;i++){
j=0;
count=0;
while(j<m){
if(a[count]!=0){
j++;
}
count=(count+1)%n;
}
printf("%d",a[(count+n-1)%n])
a[(count+n-1)%n]=0;
}
// 不等于,最后一个出局for(i=0;i<n-1;i++) while(a[l]==0) l++; printf(“%d”,a[l]);
19.求Π 4/Π=1-1/3+1/5-1/7……
#include math.h
double pi=0.0,n=1.0,term=1.0;
int sign=1;
while(fabs(term)>1e-6){
pi=pi+term;
n+=2;
sign=-sign;
term=sign/n;
}
printf(“%.6f”,pi);
2/Π=1+1/3+1/32/5+1/32/5*3/7……
#include math.h
void pi(){
double pi=2.0,temp=2.0;
int fz=1,fm=3;
while(temp>1e-16){
temp=temp*fz/fm;
pi+=temp;
fz++;
fm+=2;
}
printf("%.6f",pi);
20.火车从始发站(称为第 1 站)开出,
在始发站上车的人数为 a,然后到达第 2 站,在第 2 站有人上、下车,但上、下车的人数相同,
因此在第 2 站开出时(即在到达第 3 站之前)车上的人数保持为 a 人。
从第 3 站起(包括第 3 站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,
而下车人数等于上一站上车人数,一直到终点站的前一站(第(n?1) 站),都满足此规律。
现给出的条件是:共有n 个车站,始发站上车的人数为 a ,最后一站下车的人数是 m(全部下车)。
试问x 站开出时车上的人数是多少?
输入只有一行四个整数,分别表示始发站上车人数 a,车站数 n,终点站下车人数 m 和所求的站点编号 x。
其中,1≤a≤20, 1≤x≤n≤20, 1≤m≤2×104。
int C1[21]={0,1,1,2},C2[21]={0,0,0,0};
int a,n,m,x;
scanf("%d%d%d%d",&a,&n,&m,&x);
int i;
for (i=4;i<n;i++)
{
C1[i]=C1[i-2]+C1[i-1]-1;
C2[i]=C2[i-2]+C2[i-1]+1;
}
int b=(m-a*C1[n-1])/C2[n-1];//最后一站等于上一站车上的总人数
printf("%d",a*C1[x]+b*C2[x]);