1:如何保證int char數組 輸入時的正確性和安全性?
# include <stdio.h>//int char 輸入容易出問題 下面的代碼可以解決這個問題
# define N 10 //如果要錄入X個字節則 N=X
int Getchar(char A[],int min,int max);//直到用戶輸入的字符串長度在[min,max]之間時 函數結束 返回字符串A的長度
int gainint(int *p,int a,int b);
int main(){
char A[N+1];//最後一位存'\0'
int L,min,max;
do{
printf("請輸入字符串的長度的最小值[0,%d]:",N);
gainint(&min,0,N);
printf("請輸入字符串的長度的最大值[%d,%d]:",min,N);
gainint(&max,min,N);
printf("請輸入字符串[%d,%d]:",min,max);
Getchar(A,min,max);
printf("字符串:%s\n",A);
}while(1);
return 0;
}
int gainint(int *p,int a,int b)//輸入int *p直至滿足(a,b)輸入結束,並返回*p的位數
{
do{
*p=a-1; //此處是爲了減少意外情況的發生 雖然那種意外情況不常見
scanf("%d",p);
while(getchar()!='\n');
if(*p>b||*p<a)
printf("輸入有誤,請重新輸入[%d--%d]:",a,b);
}while(*p>b||*p<a);
return *p;
}
int Getchar(char *A,int min,int max)//長度在[min,max] <閉區間> 之間時 函數結束 返回字符串A的長度
{
int B,C;
do{
A[max]=B=C=0;
while((A[B++]=getchar())!='\n'&&B<max);
if(A[B-1]!='\n')while(getchar()!='\n'&&++C);
else A[--B]=0;
if(C||B&&B<min)
printf("您錄入的字符串長度:%d字節\n只錄入(%d--%d)個字節!\n",B+C,min,max);
}while(C||B<min);
return B;
}
具體網址在:int-char-輸入
2:字符串全匹配:
# include <stdio.h>
# define N 100 //如果要錄入X個字節則 N=X
int Getchar(char A[],int min,int max);//直到用戶輸入的字符串長度在[min,max]之間時 函數結束 返回字符串A的長度
int BF(char a[],char b[],int c[]);//a爲主串 b爲次串 c[]存儲匹配的下標 函數返回 匹配的個數
int main(){
char A[N+1],B[N+1];
int C[N],L,num,i;
do{
printf("請輸入主字符串A[%d,%d]:",1,N);
L=Getchar(A,1,N);
printf("請輸入次字符串B[%d,%d]:",1,L);
Getchar(B,1,L);
num=BF(A,B,C);
printf("B在A中共%d個,下標:",num);
for(i=0;i<num;i++)
printf("%d ",C[i]);
printf("\n");
}while(1);
return 0;
}
int BF(char a[],char b[],int c[])//a爲主串 b爲次串 c[]存儲匹配的下標 函數返回 匹配的個數
{
int i=0,j=0,k=0;
do{
if (b[j]&&a[i++]==b[j])++j;
else
{
b[j]?(i-=j):(c[k++]=i-j);
j=0;
}
}while(a[i-1]);
return k;
}
int Getchar(char *A,int min,int max)//長度在[min,max] <閉區間> 之間時 函數結束 返回字符串A的長度
{
int B,C;
do{
A[max]=B=C=0;
while((A[B++]=getchar())!='\n'&&B<max);
if(A[B-1]!='\n')while(getchar()!='\n'&&++C);
else A[--B]=0;
if(C||B&&B<min)
printf("您錄入的字符串長度:%d字節\n只錄入(%d--%d)個字節!\n",B+C,min,max);
}while(C||B<min);
return B;
}
-----------字符串直接替換
# include <stdio.h>
# define N 101
int BF(char A[],char B[],char C[],char D[])
{//將A[]中的所有B[]換成C[] 所形成的新字符串存到D[]中
int i=0,j=0,k=0,m=0,n=0;//返回替換的個數
do{
if (B[j]&&A[i++]==B[j])j++;
else
{
if(!B[j]&&++n) while(C[m])D[k++]=C[m++];
else (i-=j)&&(D[k++]=A[i-1]);
j=m=0;
}
}while(A[i-1]);
return n;
}
int main()
{
char A[N],B[N],C[N],D[N];
gets(A);
gets(B);
gets(C);
printf("替換個數:%d\n新字符串:\n",BF(A,B,C,D));
puts(D);
}
更多關於字符串匹配的函數和代碼鏈接:字符串替換-C語言
3:埃氏篩法:
常用的:
# include <stdio.h>
# include <math.h>
# define N 10000
char A[N];
int main()
{
int i,j,Q;
for(A[0]=A[1]=1,Q=sqrt(N)+1,i=2;i<Q;i++)
if(!A[i])for(j=i*i;j<N;j+=i)
A[j]=1;//經過篩法後 如果i是質數則S[i]=0 否則爲1
printf("[2,%d)的質數:\n",N);
for(i=0;i<N;i++)
if(!A[i])printf("%d ",i);
return 0;
}
保存質數的:
# include <stdio.h>
# include <math.h>
int ZHISHU(char S[],int T[]);//調用完此函數後 如果一個數X爲質數 則S[X]=0 否則S[X]=1 T存儲質數 返回質數的個數
# define N 10000
char A[N];
int B[N/10];
int main(){
int i,num;
num=ZHISHU(A,B);
for(i=0;i<num;i++)
printf("%d ",B[i]);
printf("\n區間[2,%d)的質數個數共%d個\n",N,num);
return 0;
}
int ZHISHU(char S[],int T[])//調用完此函數後 如果一個數X爲質數 則S[X]=0 否則S[X]=1
{
int i,j,k=0,Q=sqrt(N)+1;
for(S[0]=S[1]=1,i=2;i<Q;i++)
if(!S[i])
{
for(j=i*i;j<N;j+=i)
S[j]=1;
T[k++]=i;
}
do{
if(!S[i])T[k++]=i;
}while(++i<N);
return k;
}
更多內容鏈接:質數
4:快速排序一維和二維:
一:
# include <stdio.h>
# define N 100
void change(int *a,int *b)//交換函數 交換a b的值
{
int c=*a;
*a=*b;
*b=c;
}
void Qsort(int A[],int L,int R)//快速排序 升序
{
int i=L,j=R,T=A[L]; //T爲基準數
if(L>R) return;
while(i!=j) //當數組左右兩邊沒相遇
{
while(A[j]>=T&&i<j)j--; //從右向左找 改爲while(A[j]<=T&&i<j)
while(A[i]<=T&&i<j)i++; //從左向右找 改爲while(A[i]>=T&&i<j) 這兩處 改完即爲降序
if(i<j)change(&A[i],&A[j]); //交換兩數
}
if(L!=i)change(&A[L],&A[i]); //基準數歸位
Qsort(A,L,i-1); //遞歸左
Qsort(A,i+1,R); //遞歸右
}
int main(){
int i,A[N]={10,15,1,2,789,456,145,41525}; //總共8個數字
Qsort(A,0,7);//數組下標爲0--7
for(i=0;i<8;i++)
printf("%d ",A[i]);
return 0;
}
二維:
# include <stdio.h>
# define N 50
void change(int *a,int *b){//交換函數
int c=*a;
*a=*b;
*b=c;
}
void paixu(int A[][N],int left,int right)//快速排序升序
{
int i=left,j=right,temp[2]={A[0][left],A[1][left]};
if(left>=right) return;
while(i!=j)
{
while((A[0][j]>temp[0]||A[0][j]==temp[0]&&A[1][j]>=temp[1])&& i<j)j--;
while((A[0][i]<temp[0]||A[0][i]==temp[0]&&A[1][i]<=temp[1])&& i<j)i++;
if(i<j)
{
change(&A[0][i],&A[0][j]);
change(&A[1][i],&A[1][j]);
}
}
if(i!=left)
{
change(&A[0][left],&A[0][i]);
change(&A[1][left],&A[1][i]);
}
paixu(A,left,i-1);
paixu(A,i+1,right);
}
int main(){
int i,T[2][N]={{8,8,6,6,3,3},{1,2,2,1,1,2}};
paixu(T,0,5);//共2行8列 以第一行爲基準升序 下標0--7
for(i=0;i<6;i++)
printf("%d %d\n",T[0][i],T[1][i]);
return 0;
}
相關題目:心急的小加C
5:堆--優先隊列:
一維《最小堆:
# include <stdio.h> //WEI行 N列的優先隊列
# include <stdlib.h>
# include <time.h>
# define N 100
void insert(int Tree[],int X);//向堆中插入值 S[WEI]
int Delmin(int Tree[]); //刪除最小值-並返回最小值
int tree[N+1];
int main(){
int S,i,j;
srand(time(0));
printf("隨機生成的數字:");
for(j=0;j<N;j++)
{
S=rand()%100+50;
printf("%d \n",S);
insert(tree,S);
}
printf("堆的全部刪除>以第每一列的第一個數字爲基準:\n");
while(tree[0])
{
printf("%d \n",Delmin(tree));
}
return 0;
}
void insert(int Tree[],int X)
{
int par,i=++Tree[0]; //插入X 後 Tree[0]+1
while(i>1) //直到i不是根節點
{
par=(i>>1); //父節點爲par
if(Tree[par]<=X) break; //將<=改爲>=即改爲最大堆了
Tree[i]=Tree[par]; //否則調整堆 即位置上移
i=par;
}
Tree[i]=X;//插入新節點
}
int Delmin(int Tree[])
{
int i=1,root=Tree[1],R,L,X=Tree[Tree[0]--];
while((i<<1)<=Tree[0])
{
L=i<<1;R=L+1;//Left Right 記錄左右節點
if(R<=Tree[0]&&Tree[R]<Tree[L])//如果將tree[R]<tree[L] 改爲tree[R]>[L]
L=R;
if(Tree[L]>=X) break; //並且將>=改爲<=即爲最大堆
Tree[i]=Tree[L];//否則繼續調整堆
i=L;
}
Tree[i]=X;
return root;
}
二維堆:
# include <stdio.h> //WEI行 N列的優先隊列
# include <stdlib.h>
# include <time.h>
# define N 101
# define WEI 2 //如果改爲3行的 直接將WEI改爲3
void insert(int Tree[][N],int S[]);//向最小堆中插入值 S[WEI]
void Delmin(int Tree[][N],int S[]);//刪除堆的最小值 將最小值存在S中
int tree[WEI][N]; //初始化只需要將tree[0][0]設爲0即可
int main(){
int S[WEI],i,j;
srand(time(0));
printf("隨機生成的數字:");
for(j=0;j<10;j++)
{
for(i=0;i<WEI;i++)
{
S[i]=rand()%100+50;
printf("%d ",S[i]);
}
insert(tree,S);
printf("\n");
}
printf("堆的全部刪除>以第每一列的第一個數字爲基準:\n");
while(tree[0][0]){//tree[0][0]數值=存儲的數字組數
Delmin(tree,S);//每次刪除完 tree[0][0]自動--
for(i=0;i<WEI;i++)
printf("%d ",S[i]);
printf("\n");
}
return 0;
}
void insert(int Tree[][N],int S[]) //向最小堆Tree[]裏插入元素S[WEI]
{
int par,i=++Tree[0][0],j; //插入X 後 Tree[0]+1
while(i>>1) //直到i不是根節點
{
par=(i>>1); //父節點爲par
if(Tree[0][par]<=S[0]) break;//如果父節點滿足堆的特性 則插入當前的位置即可
for(j=0;j<WEI;j++) //如果將Tree[0][par]<=S[0]改爲Tree[0][par]>=S[0] 即爲最大堆插入方式
Tree[j][i]=Tree[j][par]; //否則調整堆 即位置上移
i=par;
}
for(j=0;j<WEI;j++)
Tree[j][i]=S[j];
}
void Delmin(int Tree[][N],int S[])//刪除最值 將最值存在S中
{
int i=1,j,R,L,m=Tree[0][0],T[WEI];
for(j=0;j<WEI;j++)
{
T[j]=Tree[j][m];
S[j]=Tree[j][1];
}
while((i<<1)<m)
{
L=(i<<1);R=L+1;
if(R<m&&Tree[0][R]<Tree[0][L])//如果將 Tree[0][R]<Tree[0][L]改爲Tree[0][R]>Tree[0][L]
L=R;
if(Tree[0][L]>=T[0]) break;//並將 Tree[0][L]>=T[0]改爲Tree[0][L]<=T[0]即爲最大堆的刪除代碼
for(j=0;j<WEI;j++)
Tree[j][i]=Tree[j][L];//否則繼續調整堆
i=L;
}
for(Tree[0][0]--,j=0;j<WEI;j++)
Tree[j][i]=T[j]; //調整好並賦值
}
堆排序:
# include <stdio.h>
# include <time.h>
# include <stdlib.h>
# define N 10000000
# define M 5000000
int tree[N];
void Dsort(int *tree,int n);
int main()
{
int i;
srand(time(0));
for(i=0;i<N;i++)
tree[i]=rand()%M+1;
//printf("%d\n",tree[i]=rand()%M+1);
Dsort(tree,N);
printf("\n");
// for(i=0;i<N;i++)
// printf("%d ",tree[i]);
printf("over\n");
}
void Dsort(int *tree,int n)
{
int i,j=1,L,R;
tree--;
while((i=++j)<=n)
{
R=tree[i];
while(i>1)
{
L=(i>>1);
if(tree[L]>=R) break;
tree[i]=tree[L];
i=L;
}
tree[i]=R;
}
while(n)
{
R=tree[n]; tree[n--]=tree[1];
i=1; L=2;
while(L<=n)
{
L+=L<n&&tree[L+1]>tree[L];
if(tree[L]<=R) break;
tree[i]=tree[L];
i=L; L<<=1;
}
tree[i]=R;
}
}
二維堆排序:
# include <stdio.h>
# include <time.h>
# include <stdlib.h>
# define M 70
# define N 50
# define U 5
int tree[M][N];
void Dsort(int *tree[],int n);
int main()
{
int A[M][N],*p[M],i,j;
srand(time(0));
for(i=0; i<M; i++)
{
for(j=0; j<N; j++)
//A[i][j]=rand()%U+1;
printf("%d ",A[i][j]=rand()%U+1);
printf("\n");
p[i]=&A[i][0];
}
printf("<\n");
Dsort(p,M);
printf("\n");
for(i=0; i<M; i++)
{
for(j=0; j<N; j++)
printf("%d ",p[i][j]);
printf("\n");
}
printf("over\n");
return 0;
}
void Dsort(int *tree[],int n)
{
int i,j=0,k,L,*R;
tree--;
while((i=++j)<=n)
{
R=tree[i];
while(i>1)
{
L=(i>>1);
for(k=0; k<N&&tree[L][k]==R[k]; k++);
if(tree[L][k]>=R[k]) break;
tree[i]=tree[L];
i=L;
}
tree[i]=R;
}
while(n)
{
R=tree[n];
tree[n--]=tree[1];
i=1;
L=2;
while(L<=n)
{
if(L<n)
{
for(k=0; k<N&&tree[L+1][k]==tree[L][k]; k++);
if(tree[L+1][k]>tree[L][k])L++;
}
for(k=0; k<N&&tree[L][k]==R[k]; k++);
if(tree[L][k]<=R[k]) break;
tree[i]=tree[L];
i=L;
L<<=1;
}
tree[i]=R;
}
tree++;
}
相關題目:ON-MYgodness || POJ-2431
6:大數斐波那契:
# include <stdlib.h>
# include <stdio.h>
# define M 1000000000/*每一個int存9位*/
# define size 9290/*第40萬個斐波那契需要9290個int的存儲空間*/
# define MAX 400000
int add(int a[][size],int d);
int main()
{
int shu[3][size]={0,0,0},num,wei=0,k,t;/*初始化shu[][];*/
do{
while(wei<1||wei>MAX){
printf("顯示第幾個斐波納挈數?(1--%d):\n",MAX);
scanf("%d",&wei);
while(getchar()!='\n');
}
t=num=add(shu,wei);
wei=(wei-1)%3;
k=printf("%d",shu[wei][num]);
shu[wei][num--]=0;
while(num>0)
{
printf("%09d",shu[wei][num]);
shu[wei][num--]=0;
}
printf("\n共%d位\n",(t-1)*9+k);
}while(t);
return 0;
}
int add(int a[][size],int b)
{
int i,j,m,k,c[]={0,1,2},index=1;
a[0][1]=a[1][1]=1;/*初值爲1 1*/
for (i=1;i<=b;i++)
{
for (j=1;j<=index; j++)
a[c[2]][j]=a[c[0]][j]+a[c[1]][j];
for (k=1;k<index; k++)
if (a[c[2]][k]>=M)
{
a[c[2]][k+1]+=a[c[2]][k]/M; /* 當前位向前進位 */
a[c[2]][k]%=M; /*當前位進位之後的值 */
}
while (a[c[2]][index]>=M)
{
a[c[2]][index+1] = a[c[2]][index]/M; /* 向最高位進位 */
a[c[2]][index++]%=M; /* 進位之後的值,位數+1*/
}
for(m=0;m<3;m++)
c[m]=(c[m]+1)%3;//對c[0--2]循環做加法
}
return index;
}
7:大數階乘:
#include <stdio.h>
#define SIZE 77200
# define N 10000 /*每四位進一位 每一個int 存四位*/
int BigFact(int m,int data[]);//計算m的階乘
void main()
{
int data[SIZE] = {0}; /*存儲SIZE位數,元素全部初始化爲0,data[0]空着 */
int index,n=0,k; /* 數組元素個數,表示階乘值的位數 */
printf("10000!用時約2秒\n20000!用時約5秒\n30000!用時約11秒\n40000!用時約21秒\n50000!用時約37秒\n60000!用
時約52秒\n70000!用時約73秒\n");
do{
do{
printf("輸入n 求n!(1-70000):");
scanf("%d", &n);
while(getchar()!='\n');
}while(n<1||n>70000);
printf("%d!=\n", n);
n=index = BigFact(n,data);/* 計算階乘n!,返回階乘值的位數 */
if (index) /* 檢驗數組是否溢出,若未溢出,則打印階乘值 */
k=printf("%d",data[index]);
data[index--]=0;
while(index>0)
{
printf("%04d",data[index--]);
data[index--]=0;
}
printf("\n位數共%d位\n",(n-1)*4+k);
}while(1);
}
int BigFact(int m, int data[])/*函數功能:計算m!,存於數組data中返回階乘值的位數*/
{
int i, j, k,index = 1; /* 數組元素個數,表示階乘值的位數 */
for (data[1]=i=1; i<=m; i++) /* 初始化,令1!=1 計算階乘m!*/
{
for (j=1; j<=index; j++)
data[j]=data[j] * i;/*每一位數字都乘以i,模仿乘法計算*/
for (k=1; k<index; k++)
if (data[k]>=N) /*階乘值的每位數字應在0~9之內若>=10,則進位*/
{
data[k+1]+=data[k]/N; /* 當前位向前進位 */
data[k]%=N;
/*當前位進位之後的值 */
}
/* 單獨處理最高位,若計算之後的最高位>=10,則位數index加1 */
while (data[index] >=N)
{
data[index+1] = data[index]/N; /* 向最高位進位 */
data[index++]%=N; /* 進位之後的值 位數index加1 */
}
}
return index;/*返回階乘值的位數 */
}
更多代碼內容鏈接:大數