首页 > 代码库 > c语言各类问题 代码

c语言各类问题 代码

定义一个结构体,有两个成员变量,一个整型的n,一个字符型的c,利用结构体类型声明一个具有5个元素的数组,并随机初始化,根据成员变量n进行从小到大排序,然后输出
冒泡排序然后 在输出结构体
#include<stdio.h>
struct d
{
int x;
char y;
};
int main(void)
{
struct d a[5];
int i,d;
int b[6];
for(i=0;i<5;i++)
{
scanf("%d%c",&a[i].x,&a[i].y);
}
for(i=0;i<5;i++)
{
b[i]=a[i].x;

}
for(i=0;i<5;i++)
{
for(d=0;d<5-i;d++)
{
if(b[d]>b[d+1])
{
b[6]=b[d]+b[d+1];
b[d]=b[6]-b[d];
b[d+1]=b[6]-b[d];
}
}
}

for(i=0;i<5;i++)
{
for(d=0;d<5;d++)
{
if(b[i]==a[d].x)
{
printf("%d%c",a[d].x,a[d].y);
}
}
}
return 0;
}
//字母 顺序输出
#include<stdio.h>
int main(void)
{
char a,b;
scanf("%c%c",&a,&b);

if(a>b)

{
    
while(a>=b)
   {
     printf("%c",a);
      a--;
   }
}
else
{
       while(b>=a)
         {
            printf("%c",b);
            b--;
         }
}
return 0;
}


//输出数组的个数比较多的 数字
#include<stdio.h>
int main (void)
{
    int a1[10],a2[10]={0,0,0,0,0,0,0,0,0,0},a3[10];
    int i,j,Max=0,ci=0,k=0;
    
    for(i=0;i<10;i++)
    {
        scanf("%d",&a1[i]);
    }
    
    for(j=0;j<10;j++)
    {
       for(i=0;i<10;i++)
       {
          if(a1[j]==a1[i])
          {
            a2[j]++;
          }
        }
    }
    for(i=0;i<10;i++)
    {
    if(Max<a2[i])
    {
        Max=a2[i];
    }
    }
    j=0;
    for(i=0;i<10;i++)
    {
    if(Max==a2[i])
    {
        for(j=0;j<k;j++)
        {
         if(a3[j]==a1[i])
           {
             ci++;
           }
        }
        if(ci==0)
       {
           printf("%d",a1[i]);
              a3[k]=a1[i];
              k++;
       }
       else
       break;
        
    }
    }
    return 0;
}
//杨辉三角
#include  <stdio.h>
main()
{ int i,j,n=0,a[17][17]={0};
  while(n<1 || n>16)
  { printf("请输入杨辉三角形的行数:");
    scanf("%d",&n);
  }
  for(i=0;i<n;i++)
    a[i][0]=1;      /*第一列全置为一*/
  for(i=1;i<n;i++)
    for(j=1;j<=i;j++)
      a[i][j]=a[i-1][j-1]+a[i-1][j];/*每个数是上面两数之和*/
  for(i=0;i<n;i++)   /*输出杨辉三角*/
  { for(j=0;j<=i;j++)
      printf("%5d",a[i][j]);
    printf("\n");
  }
}

//输出数组中增加和减小的数组

#include<stdio.h>
int main(void)
{
int i,j=0,a,Arry[10],Copy[10];
int t=0,f=0;
for(i=0;i<10;i++)//输入数组数据
{
scanf("%d",&Arry[i]);
}
for(i=0;i<10;i++)
{
if(i<9)
{
if(Arry[i]<Arry[i+1])//判断增长还是降低
{
f=1;
}
else
{
t=-1;
}
Copy[i]=Arry[i];//赋值给另外的 数组
}
else
{
Copy[i]=Arry[i];//赋值给另外的 数组
}
if(((t+f) == 0)||(i==9))//若等于9直接输出
{
if(i < 9)
{
for(a=j;a<i+1;a++)
{
printf("%d",Copy[a]);
printf("\n");
t=0;
f=0;
}
j=i;
i--;
}
else
{
for(a=j;a<i+1;a++)
{
printf("%d",Copy[a]);
printf("\n");
t=0;
f=0;
}
break;
}
}
}
return 0;
}


/字符数组 逆序输出
//这里边是用二维数组存储
for循环超过了条件才会跳出来,所以下边要i--;
#include<stdio.h>
int main(void)
{
char a[20][3];
int i=0,k;
for(i=0;i<20;i++)
{
scanf("%c",&a[i][0]);
}
i--;
for(k=i;k>=0;k--)
{
// if(a[k][0]!=32)
{
printf("%c\n",a[k][0]);
}
}
return 0;
}<string.h>
int main(void)
{
char a[100][12];
int i=0,k;
for(i=0;i<20;i++)
{
scanf("%c",&a[i][0]);
}
for(k=i;k>=0;k--)
{
printf("%c\n",a[k][0]);
}
return 0;
}

数字分解求和
#include <stdio.h>
void swap(int a)
{
    int i=0,sum=0,j,k,b=0;
    for(j=1;j<a;j++)
    {
        for(i = j; i < a;i ++)
        {
            sum += i;
            if(sum == a )
            {
                    sum = 0;
                    b++;
                    printf("%d=",a);
                   for(k = j;k < i;k ++)
                    printf("%d+",k);
                    printf("%d\n",i);
                     break;
            }
            
        }
        sum=0;//每次用过后清零 否则 影响下次的求和
     }
    if(b==0)
        printf("无法分解");
}
int main( void)
{
    int a;
    scanf("%d",&a);
    swap(a);
    return 0;
}
//输入三个数字 啊a  b  c  c为步长
按顺序 输出 a到b的数组 步长为c  例如
 1 3   1   输出:1 2 3
#include <stdio.h>
void swap(int a, int b, int c)
{
    int i=0;
    if(a>b)
    {
        for(i=a;i>=b;){
            printf("%d",i);
           i-=abs(c);
         }
    }
    else
    {
        for(i=a;i<=b;)
        {
            printf("%d",i);
            i+=abs(c);
        }
    }
}
int main( void)
{
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    swap(a,b,c);
    return 0;
}
//1元钱能买一瓶汽水,喝完后n个空瓶可以换一瓶汽水。实现一个函数,传递一个整形的钱数m,一个整形的兑换比例n,返回最多能喝到的汽水数,并在main函数里将返回值输出。
#include <stdio.h>
int  swap(int x, int y)
{
    int a,sum = x;
    a=x;
    for (;(a/y)>0 ; ) {
        
            sum+=a/y;
            a=a/y+a%y;
    }
    //sum=sum-a%y;
    return sum;
}
int main( void)
{
    int a,b;
    scanf("%d%d",&a,&b);
   
    printf("%d",swap(a,b));
    return 0;
}
//n的末尾的0
的个数
#include <stdio.h>//算法思想 是 把每个因数分解 计算因数中含有5的个数  5的个数就是结果
int Sum(const int n)
{
if(n<5) return 0;
int counter=0,i;
for(i=5;i<=n;i++){
int flag=i;
while(flag%5==0)
{
flag/=5;
counter++;
}
}
return counter;
}
int main( void)
{
int a;
scanf("%d",&a);
int b=Sum(a);
printf("%d",b);
return 0;
}
//魔幻方阵  就是 横竖斜 相加数值都相等
#include"stdio.h"
void main()
{
int a[15][15]={};
int n,i,j,k,p,q;
scanf("%d",&n);
i=0;
j=(n/2);
a[i][j]=1;
for(k=2;k<=n*n;k++)
{
p=i;
q=j;
i--;
j++;
if(i<0)
i=n-1;
if(j>n-1)
j=0;
if(a[i][j]!=0)
{
i=p+1;
j=q;
}
a[i][j]=k;
}
for(i=0;i<n;i++)
{
for(j=n-1;j>=0;j--)
printf(" %3d ",a[i][j]);
printf("\n");
}
}
//字符统计  输入不限个数数字 进行升序排序
、//跳出循环用数字与数字中间的空格判断 如果是\n就跳出循环
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    
    int array[]={};
    int i,j,x=0,k;
    char c;
       for(i = 0 ; ; i++){
        scanf("%d%c",&x,&c);
         array[i] = x;
        if(c == ‘\n‘)
            break;
    }
    for (j=0; j<=i; j++) {
        for (x=0; x <= i-j-1; x++) {
            if (array[x]>array[x+1]) {
            int s=array[x]+array[x+1];
                array[x]=s-array[x];
                 array[x+1]=s-array[x];
            }
        }
    }
    for (k = 0;k <= i ; k ++) {
         printf("%d",array[k]);
    }
return 0;
}
//围圈报数  输入 4     8   
输出   1  2  3 4
           0  0  0 5
           0  0  0 6
           0  0  8 7
#include<stdio.h>
#include<stdlib.h>
int main(void){
    int **a,i,j,x,y,n,k;
    scanf("%d%d",&n,&k);
    a = (int**) malloc(sizeof(int*)*n);
    for(i=0; i<n; i++)
        a[i]=(int*)malloc(sizeof(int)*n);
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        a[i][j]=0;
    for(i=1,j=0,x=0,y=0; i<=n*n; i++) {
        a[x][y]=i;
        switch (j) //j 为前进方向,0向右,1向下,2向左,3向上。
        {
            case 0:
                if(y+1>n-1|| a[x][y+1]!=0) {j=1;x++;}
                else y++;
                break;
            case 1:
                if(x+1>n-1 || a[x+1][y]!=0){j=2;y--;}
                else x++;
                break;
            case 2:
                if(y == 0 || a[x][y-1]!=0){j=3; x--;}
                else y--;
                break;
            case 3:
                if(a[x-1][y]!=0){j=0; y++;}
                else x--;
                break;
        }
    }
    for(i=0;i<n;i++) {
        for(j=0;j<n;j++)
            if(a[i][j]<=k)
                printf("%4d",a[i][j]);
            else
                printf("%4d",0);
        printf("\n");
        free(a[i]);
    }
    free(a);
    return 0;
}
//报数问题   n 个人  报数 报道i 那个人就退出 然后下个人从1开始报 知道一个人为止  求最后一个人的 号码


#include <stdio.h>
int main(int argc, const char * argv[])
{

    // insert code here...
    int num[100] = {};
    int a , b , i ,c ;
    scanf("%d%d" , &a , &b);
    for (i = 0 ; i < a; i ++) {
        num[i]=1;//有人为1 没人为0
    }
        int count=0;//统计报数
        c=a;
        for (i=0,count=0; a > 1 ; i ++) {
            
            if (num[i] == 1) {
                count++;
                    if(count == b)
                    {
                        a--;
                        num[i]=0;
                        count=0;
                    }
          }
            if(i == c-1) // 循环的范围是   小于人的个数
                i = -1;
        }
            for (i = 0; i < c;  i ++) {
                if (num[i] == 1) {//输出最后一个人的 号码
                    printf("%d",i+1);
                }
            }
    return 0;
}
//小明一次可以爬一级或者二级台阶  试问n级台阶  小明来走共有几种走法   
#include<stdio.h>
int fun(int red,int n,char temp[],int k)
{
    int i,j;
    static int sum=0;
    if(red==0)
    {
        for(i=1;i<=n;++i)
        {
            //printf("y");
        }
        //printf("\n");
        sum++;
    }
    else if(n==red)
    {
        for(i=1;i<=red;++i)
        {//  printf("r");
        }
        //printf("\n");
        sum++;
    }
    else
    {
        //printf("r");
        temp[k++]=‘r‘;
        fun(red-1,n-1,temp,k);
        k--;
        for(j=0;j<k;j++)
        { // printf("%c",temp[j]);
        }
        //printf("y");
        temp[k++]=‘y‘;
        fun(red,n-1,temp,k);
        k--;
    }
    return sum;
}int main()
{
    int n,k,i,d,s=0;
    char temp[100];
    scanf("%d",&n );
    for (i=0; i <= n/2; i++) {
        
                k = n - 2 * i;
                d=i+k;
                s = fun (i,d,temp,0);
            }

    
    printf("%d",s);
    return 0;
}
                                                                                                                                                                                          
比如:
输入:F
输出:
FEDCBA
 EDCBAB
  DCBABC
   CBABCD
    BABCDE
     ABCDEF


#include<stdio.h>
int main(void)
{
    char i, j , k ,sum=0;;
    int  count=0;
    scanf("%c",&k);
    sum =  k - ‘A‘+1;
   // printf("%d",sum);
    for (i = k ; i >= ‘A‘ ; i --) {
        count = 0;
        for (j = i ; j >= ‘A‘ ; j --) {
            printf("%c",j);
            count++;
             if(count == sum)
                break;
        }
        j++;
        for (j++; ; j++) {
            if (count == sum)
                break;
            printf("%c",j);
            count++;
            
        }
        printf("\n");
    }
    return 0;
}
//二维数组村字符串
用一维指针字符数组来存二维字符数组
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
char *n[90];
int i;
for (i = 0; i < 90; i ++){
n[i]=(char*)malloc(sizeof(char)*50);//动态申请字符的空间
scanf(“%s”,n[i]);//每个字符串
}
for (i=90; i>= 0; i --) {
if(n[i])//如果不为null 那么输出
printf("%s",n[i]);
}
return 0;
}
//输入不定数 数组  来排序
//scanf 与getchar 区别  getchar只会接受字符
scanf(%d,a)只读取数字 留下空格 和回车 每次只读取一个数字
#include <stdio.h>
int main(int argc, const char * argv[])
{
    int a[100] = {};
    
    int n = 0;
    int i = 0;
    
    printf("请输入数字以空格分隔开,以回车结束:\n");
    
    do
    {
        scanf("%d", &n);//读取数字 下个字符是空格正好给了getchar   最后一个是回车 正好给getchar读取    跳出循环
        a[i] = n;
        i++;
    }
    while (getchar() != ‘\n‘);
    
    for (int j = 0; j < i ; j++)
    {
        printf("%d ", a[j]);
        printf("\n");
    }
    
    return 0;
    
}

//指针 排序数组   数组个数不限
void desc( int *a ,int n)
{
    int *i = a,*j = i+ 1,temp,   x= 0,  * k = a + n ;//i是数组初始地址 temp是 变量 k是数组结束地址
  //  printf("%d",*k);
    for ( x = 0; x < n ;x ++ )
    {
        for (  i = a ; i < k - 1 - x ; i ++)
            {
                j= i + 1;//i   与j   是地址  k也是地址
                    if ( *i  >  *j )//*i是 *i指向的  数值
                    {
                        temp = *i;
                        *i = *j;
                        *j = temp;
                    }
           }
    }
}
int main(void)
{
    void desc(int *num, int n);
    int num[10];
    int i = 0, k = 0;
    do{
        scanf("%d",&num[i]);
        i++;
    }while(getchar()!= ‘\n‘);
    desc(num, i);
    for (k=0; k < i;  k ++) {
        printf("%d",num[k]);
    }
    return 0;
}
//定义一个一维字符指针数组,并利用不定长字符串将其初始化,最后一段字符串以‘@’结尾,然后将各字符串输出。
比如:
输入:
abc
ddde
abce@


#include<stdio.h>
#include<stdlib.h>
int main(void)
{
char *n[10];
char p [100][20];

int i = 0 , j , k1 = 0, k2 , k3;
for (i = 0; i < 10; i ++){
n[i]=p[i];
scanf("%s",n[i]);
for (j = 0; j < 20; j ++) {
if(n[i][j] == ‘@‘){
k1=1;
k3=j;
break;
}
}
if (k1 == 1 ) {
break;
}
}
for (k1 = 0; k1 < i; k1 ++) {
printf("%s",n[k1]);
}
for (k2 = 0; k2 < k3; k2 ++) {
printf("%c",n[k1][k2]);
}
return 0;
}