首页 > 代码库 > 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;
}