① 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;
}
}
}