当前位置:首页 » 编程语言 » c语言统计排列
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言统计排列

发布时间: 2023-02-13 15:16:35

c语言,如何得到n个数所有的排列

#include
<stdio.h>
inline
void
Swap(char&
a,
char&
b)
{//
交换a和b
char
temp
=
a;
a
=
b;
b
=
temp;
}
void
Perm(char
list[],
int
k,
int
m)
{
//生成list
[k:m
]的所有排列方式
int
i;
if
(k
==
m)
{//输出一个排列方式
for
(i
=
0;
i
<=
m;
i++)
putchar(list[i]);
putchar('\n');
}
else
//
list[k:m
]有多个排列方式
//
递归地产生这些排列方式
for
(i=k;
i
<=
m;
i++)
{
Swap
(list[k],
list[i]);
Perm
(list,
k+1,
m);
Swap
(list
[k],
list
[i]);
}
}
int
main()
{
char
s[]="123";
Perm(s,
0,
2);
return
0;

② c语言程序题:输入一行字符,分别统计并且按照顺序排列其中的数字和字母

#include "stdio.h"
main()
{
char zifu[100],zimu[100],shuzi[100] ;
int i=0;
int zm=0,sz=0;//zimu和shuzi数组的索引值
printf("请输入一行字符(数目小于100个)\n");//提示用户输入一行字符并换行
do
{
scanf("%c",&zifu[i]);//将用户输入的字符保存到zifu[100]数组中
i++;
}while(zifu[i-1]!='\n');//当用户输入回车时,结束循环

for(int j=0;j<100;j++)//该循环对输入的字符逐个进行判断,当循环结束,数字和字母也就被分别存放到相应的数组里了
{
if(zifu[j]=='\n')//如果判断到回车,说明判断结束,则跳出循环
break;
else if(zifu[j]>='0'&&zifu[j]<='9')//如果是数字,则把它赋给shuzi数组,同时数组索引值自增1;
{
shuzi[sz]=zifu[j];
sz++;
}
else if(zifu[j]>='A'&&zifu[j]<='Z'||zifu[j]>='a'&&zifu[j]<='z')//如果是大写字母或小写字母,则赋给zimu数组
{
zimu[zm]=zifu[j];
zm++;
}
}
zimu[zm]='\n';shuzi[sz]='\n';//循环结束后在数字和字母数组后面添加'\n',为了后面输出方便
zm=0;sz=0;
//下面进行输出操作
do{
printf("%c",shuzi[sz]);
sz++;
}while(shuzi[sz]!='\n');
printf("\n");
do{
printf("%c",zimu[zm]);
zm++;
}while(zimu[zm]!='\n');
printf("\n");
}
代码不是特别长,用的也都是基本语句,耐心看完应该没问题,对于题目中说的按照顺序排列,我是理解为按照用户输入的前后顺序,如果是按照大小的话,只需要再对分离后的数组进行冒泡排序即可。

③ 计数排序c语言

这个程序还有点问题,

1. 动态数组申请

2. 访问越界

3. 输出错误


应该就这三个问题了吧,简单的调试了下。

1. 在第9行出现,比较好解决。使用malloc内存分配函数直接解决,注意,在使用完成后需要用free()去释放这段内存,否则会出现内存泄露。

2. 这个出现在第22行,判断条件写错了,应该判断是j,而不是i。可以将我改过的程序和原始程序进行比较。

3. 这个出现在第38行,因为这里对B数组进行修改,或者说排序,所以应该输出的B数组的元素。而原始程序是输出A数组的元素,这里A数组中的元素并没有改变,所以,输出肯定和定义A时一样,不会出现期望的顺序。


贴一下我执行的结果:

#include<stdio.h>
#include<string.h>
#include<malloc.h>

//计数排序函数
voidcounting_sort(intA[],intB[],intk,intlength)//k为待排序数组A中最大元素
{
inti,j,temp;
int*C=(int*)malloc(sizeof(int)*(k+1));
for(i=0;i<=k;i++)//数组C初始化
{
C[i]=0;
}
for(j=1;j<=length-1;j++)//C[i]中包含等于i的元素的个数
{
C[A[j]]=C[A[j]]+1;
}
for(i=1;i<=k;i++)//C[i]中包含小于或等于i的元素的个数
{
C[i]=C[i]+C[i-1];
}
for(j=length-1;j>=0;j--)//元素重排
{
B[C[A[j]]]=A[j];
C[A[j]]--;
}
free(C);
}

//测试计数排序函数
main()
{
intA[]={2,6,1,2,4,5,9,6,4,5,8,2,3,7};
intB[]={2,6,1,2,4,5,9,6,4,5,8,2,3,7};
intk=9,i;
counting_sort(A,B,9,14);
for(i=0;i<=13;i++)
printf("%d",B[i]);
printf(" ");
return0;
}

④ c语言全排列

基本思想是用回溯法来搜索每一种排列
不过楼主对问题的说明不是很详细,所以我只好写个普适性比较大的了
下面这个程序读取一行字符串,然后对该字符串中的所有字符进行全排列输出
注:输入的字符串不要太长,因为不存在能够在短时间内输出全排列的算法
#include <stdio.h>
#include <string.h>
#include <memory.h>
int m;//记录字符串长度
int n;//记录字符串中的字符种类数
char map[256];//记录是哪几种字符
int count[256];//记录每种字符有多少个

void Make_Map(char *str)//统计字符串的相关信息
{
int s[256];
int i;
memset(s,0,sizeof(s));
memset(count,0,sizeof(count));
m=strlen(str);
while(*str)
{
s[*str]++;
str++;
}
n=0;
for (i=0;i<256;i++)
if (s[i])
{
map[n]=i;
count[n]=s[i];
n++;
}
}

int stack[1000];//递归用的栈,并记录当前生成的排列

void Find(int depth)//递归式回溯法生成全排列
{
if (depth==m)
{
int i;
for (i=0;i<depth;i++) putchar(map[stack[i]]);
putchar('\n');
}
else
{
int i;
for (i=0;i<n;i++)
if (count[i])
{
stack[depth]=i;
count[i]--;
Find(depth+1);
count[i]++;
}
}
}

main()
{
char str[1000];
gets(str);
Make_Map(str);
Find(0);
}

⑤ C语言 在一个学生成绩统计程序里面加上排序

inti,j;
floatk=0;
for(i=0;i<M-1;i++)
{
for(j=0;j<M-i-1;j++)
{
if(stu[j].aver>stu[j+1].aver)
{
k=stu[j].aver;
stu[j].aver=stu[j+1].aver;
stu[j+1].aver=k;
}
}
}

⑥ c语言编程:统计各省份报道情况并按实际人数从多到少排列

编程时输入输出非常重要。因为计算机不懂得人类语言,必须要约定输入输出格式:
比如,
(1)举例一:
输入文件“c:\各省份报道统计.txt”
文件内容:
3 (省份数量)
江苏 4 7
浙江 3 3
安徽 8 6
(文件结束。其中,第一行表示省份数量,下面若干行中每行有3个数据,第一个数据为省份名,第二个数据为报道人数,第三个数据为报道文章数)
(2)举例二:
输入文件“c:\各省份报道统计.txt”
文件内容:
7 (报道数量)
南京**报道 江苏 王**
杭州**报道 浙江 张**
……
合肥**报道 安徽 李**
(文件结束。其中,第一行表示报道篇数。之后若干行中每行有3个数据,第一个为报道名称,第二个为报道省份,第三个为报道人姓名)
以上两个例子虽然都是统计,但是输入数据格式不同,所以统计方法完全不同。这些细节无法忽略。同理,输出的格式也是如此。

⑦ c语言字符统计并排序问题

#include<stdio.h>
#define N 100 /*最大输入个数*/
#define MAX 26 /*26个英文字母*/
void main(){
char put[N];
int a[MAX]={0},i,max=0;

printf("Please input a string:\n");
gets(put);

for(i=0;put[i]!='\0';i++)
a[put[i]-97]++; /*统计各英文字母个数*/

for(i=0;i<MAX;i++)
if(a[i]>max)
max=a[i]; /*找出最大个数英文字母*/

printf("MAX:\n");
for(i=0;i<MAX;i++)
if(a[i]==max)
printf("%c %d\n",i+97,a[i]);

printf("Sort:\n");
for(;max>0;max--)
for(i=0;i<MAX;i++)
if(a[i]==max)
printf("%c %d\n",i+97,a[i]);
}

⑧ c语言编程问题:对10个整形数排列并统计其中素数的个数(要求10个整数从键盘输入)

#include<stdio.h>
#include<math.h>
void main(void)
{
int a[10],i,j,k,temp,m,n=0;
printf("input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)
{
for(j=0;j<9-i;j++)//j++
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
printf("the sorted numbers:\n");
for(i=0;i<10;i++)
printf("%3d",a[i]);
for(i=0;i<10;i++)//改为i
{
k=(int)sqrt((double)a[i]);//改为a[i]
for(m=2;m<=k;m++)
{
if(a[i]%m==0)
break;
}
if(m>k)
n++;
}
printf("素数的个数有:%d",n);

}

⑨ C语言 实现一列字符中各个字符统计 并按ack码排列顺序输出

#include"string.h"
在这里写个伪代码吧,
int i=0,count;//count用于存储当前字符的个数
char* s;
main()
{
将字符串存入s中;
int n=strlen(s);//获得字符串长度
将字符串排序;/*直接使用ASKII码值,像一般数组那样排序,具体排序算法很多,自己选啦*/
//排序之后,字符串中的字符就已经按照askII码排好了,相同的自然在一起
for(i=0;i<n;i++)
{
if(i==0||s[i]==s[i-1])/*如果当前字符与前面的字符相同或者它是开头的字符,count+1*/
{
count++;
}else
//如果不相同则说明这种字符已经统计完了,count置零,开始统计下一种字符,并输出当前字符的统计结果
{
printf("The charactor '%c'appears %d times.\n",s[i-1],count);
count=0;
}
}
}