100个经典的C算法

1.题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔

子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数

为多少?

#include<stdio.h>
#include<stdlib.h>
int functionsum(int n)
{
if(n==1||n==2)return 1;
else
return functionsum(n-2)+functionsum(n-1);
}
void main()
{
int n;
printf("题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔 子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少\n");
printf("please input month num=\n");
scanf("%d",&n);
printf("\n totle=%d\n",functionsum(n));
}

2.判断101-200之间有多少个素数,并输出所有素数。

#include<stdio.h>
#include<stdlib.h>

void functionOther(int n,int m)
{
int i,j;
int sum=0;
for(i=n;i<=m;i++)
{
for(j=2;j<i;j++)
{
if(i%j==0)
{
break;
}
else
{
if(j==i-1)
{
sum+=1;
printf("the %d is%d \t",sum,i);
}
continue;
}

}

}

}

void main()
{
 int n,m;
 scanf("%d %d",&n,&m);
 functionOther(n,m);

}

3.

题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位

数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方

+5的三次方+3的三次方。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int reGeWei(int n)
{
int s=n%10;
return s*s*s;
}

int reShiWei(int n)
{
int s=(n/10)%10;
return s*s*s;
}
int reBaiWei(int n)
{
int s=n/100;
return s*s*s;
}
void functionOther()
{
int i,j;
for(i=101;i<1000;i++)
{
int sum=reGeWei(i)+reShiWei(i)+reBaiWei(i);
if(sum==i)
{
printf("%d is shuixianhua shu\n",i);
}
}

}

void main()
{
functionOther();

}

4.题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

#include<stdio.h>
#include<stdlib.h>

void functionOther(int n,int i)
{

if(n%i==0)
{
printf("%d",i);
if(n/i>1)
{
printf("*");
}

functionOther(n/i,i);
}
else
{
functionOther(n,i+1);
}

}

void main()
{
int n;
scanf("%d",&n);

printf("%d=",n);
functionOther(n,2);
}

5.题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

#include<stdio.h>
#include<stdlib.h>
int functionOther(int n,int m)
{
int min=n<m?n:m;
int max=n>m?n:m;
int temp;
while(max%min!=0)
{
temp=min;
min=max%min;
max=temp;
if(max<min)
{
temp=max;
max=min;
min=temp;
}
printf("min=%d,max=%d",min,max);
}
return min;
}

void main()
{
int n,m;
scanf("%d %d",&n,&m);
printf("the max gongyueshu is %d\n",functionOther(n,m));
printf("the min gongbeishu is %d\n",n*m/functionOther(n,m));

}

6.题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数

#include<stdio.h>
#include<stdlib.h>

void main()
{
char c;
int alpnum=0,space=0,otherchar=0;
while((c=getchar())!='\n')//主要是学习了这个字符串输入方式
{
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
{
alpnum++;
}
else if(c==' ')
{
space++;
}
else
{
otherchar++;
}
}
printf("alpnum=%d,space=%d,otherchar=%d",alpnum,space,otherchar);

}

7.验证哥德巴赫猜想:任何大于6的偶数都可以分解为两个素数之和(素数是大于1,且只能被1和本身整除的数,也称质数)

#include<stdio.h>
#include<stdlib.h>

int reSuShu(int n)
{
int i;
for(i=2;i<n;i++)
{
if(n%i==0)
{
return 0;
}

}
return 1;
}

void functionOther(int k)
{
int n,m;

for(n=2;n<k;n++)
{
m=k-n;
if(reSuShu(n)==1&&reSuShu(m)==1)
{
printf("gedebahe is right:%d=%d+%d\n",k,n,m);
}

else printf("gedebahe is wrong:%d=%d+%d\n",k,n,m);
}

}

void main()
{
int k;
scanf("%d",&k);
functionOther(k);
}

8.给定奇数n,打印菱形图案

#include<stdio.h>
#include<stdlib.h>

void functionOther(int n)//分成三部分,第一部分上三角形,中间一条,下三角形
{
int i,j,s=1,k;
for(i=n/2;i>0;--i)
{
for(j=i;j>0;--j)
{
printf(" ");
}
for(k=0;k<s;k++)
{
printf("*");
}
printf("\n");
s+=2;
}
for(k=0;k<n;k++)
{
printf("*");
}
printf("\n");
s=n-2;
for(i=1;i<=n/2;i++)
{
for(j=i;j>0;--j)
{
printf(" ");
}
for(k=0;k<s;k++)
{
printf("*");
}
printf("\n");
s-=2;
}

}

void main()
{
int n;
scanf("%d",&n);
if(n%2!=0)//判断是不是奇数
{
functionOther(n);
}

}

9。经典题:有1,2,5,10,20,50,100元,使最少钱的张数凑成给定钱额n?//我觉得这个题自己做得很经典

#include<stdio.h>
#include<stdlib.h>

int functionOther(int n)
{
int s100=n/100;//
if(s100>0)
{
printf("100=%d\n",s100);
return s100+functionOther(n%100);
}
else
{
int s50=n/50;
if(s50>0)
{
printf("50=%d\n",s50);
return s50+functionOther(n%50);
}
else
{
int s20=n/20;
if(s20>0)
{
printf("20=%d\n",s20);
return s20+functionOther(n%20);
}
else
{
int s10=n/10;
if(s10>0)
{
printf("10=%d\n",s10);
return s10+functionOther(n%10);

}
else
{
int s5=n/5;
if(s5>0)
{
printf("5=%d\n",s5);
return s5+functionOther(n%5);
}
else
{
int s2=n/2;
if(s2>0)
{
printf("2=%d\n",s2);
return s2+functionOther(n%2);
}
else
{
int s1=n;
printf("1=%d\n",s1);
return s1;
}
}
}
}

}
}

}

void main()
{
int n;
scanf("%d",&n);
int s=functionOther(n);
printf("%d",s);
}

10.任意输入一个《1000000的数判断其是不同数的阶乘之和,比如

9=1!+2!+3!,而10就不是这样的数

#include<stdio.h>
#include<stdlib.h>

int rejiecheng(int n)
{
if(n==1)return n;
else
return n*rejiecheng(n-1);
}

int functionOther(int n)
{
int s=1;
while(rejiecheng(s)<=n)
{
s++;
}
return s-1;
}
int main()
{
int buf[100]={0};

int n,i,j,s,k,judge;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&buf[i]);
}
for(i=0;i<n;i++)
{
judge=1;
int records[10]={0};
s=buf[i];
while(s!=0)
{
j=functionOther(s);
records[j]++;
s-=rejiecheng(j);
}
for(k=0;k<10;k++)
{
if(records[k]>1)
{
printf("No\n");
judge=0;
break;
}
}
if(judge==1)
{
printf("Yes\n");
judge=1;
}
}

}

11.

巴斯卡三角形或者杨辉三角

#include<stdio.h>
#include<stdlib.h>

void functionOther(int n)
{
int buf[100][100]={0};
int i,j,s;
buf[0][n+1]=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=2*n+1;j++)
{
buf[i][j]=buf[i-1][j-1]+buf[i-1][j+1];
}
}
for(i=0;i<=n;i++)
{
for(j=1;j<=2*n+1;j++)
{
if(buf[i][j]==0)
printf(" ");
else
printf("%3d",buf[i][j]);
}
printf("\n");

}

}

void main()
{
int n;
scanf("%d",&n);
functionOther(n);

}

12.老鼠走迷宫--------非常经典

#include<stdio.h>
#include<stdlib.h>
// 老鼠走迷宫,递归方向为上,右,下,左
int buf[10][10]={
{2,2,2,2,2,2,2,2,2,2},
{2,0,0,0,0,0,0,0,0,2},
{2,2,2,0,0,2,2,2,2,2},
{2,0,0,0,2,2,2,2,2,2},
{2,2,2,0,0,2,2,2,2,2},
{2,2,2,2,0,0,2,2,2,2},
{2,2,2,2,0,0,0,2,2,2},
{2,2,2,2,0,2,0,0,2,2},
{2,2,2,2,2,2,2,0,0,2},
{2,2,2,2,2,2,2,2,2,2}};

int startX=1,startY=1;
int endX=8,endY=8;
int success=0;
void prt()

int i,j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(buf[i][j]==2)printf("█");
else if(buf[i][j]==1)printf(" *");
else printf(" ");

}
printf("\n");
}
printf("\n");
}
void prtbuf()

int i,j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
printf("%d ",buf[i][j]);

}
printf("\n");
}
printf("\n");
}
int visit(int x,int y)
{
buf[x][y]=1;
if(x==endX&&y==endY)
success=1;
if(success==0&&buf[x-1][y]==0){ visit(x-1,y);}//上
if(success==0&&buf[x][y+1]==0){ visit(x,y+1);}//右
if(success==0&&buf[x+1][y]==0){ visit(x+1,y);}//下
if(success==0&&buf[x][y-1]==0){ visit(x,y-1);}//左
if(success!=1) buf[x][y]=0; 
return success;
}

void main()
{

prt();
visit(startX,startY);
prt();
prtbuf();
}

13.大数加减乘除

#include<stdio.h>
#include<stdlib.h>
//大数加减乘除

int number1[10]={1234,2345,3456,4567,0};
int number2[10]={2345,3456,6789,5678,0};
int number3[10]={0};

void prt(int number3[])
{
int j;
for(j=9;j>0;j--)
{
if(number3[j]/10<=0)
{
printf("000%d,",number3[j]);
}
else if(number3[j]/100<=0)
{
printf("00%d,",number3[j]);
}
else if(number3[j]/1000<=0)
{
printf("0%d,",number3[j]);
}
else
printf("%d,",number3[j]);
}
if(number3[j]/10<=0)
{
printf("000%d",number3[j]);
}
else if(number3[j]/100<=0)
{
printf("00%d",number3[j]);
}
else if(number3[j]/1000<=0)
{
printf("0%d",number3[j]);
}
else
printf("%d",number3[j]);
printf("\n");
}
void Setnumber3Value()
{
int i;
for(i=0;i<10;i++)
{
number3[i]=0;
}
}
void AddBigNumber(int *a,int *b)//大数加
{
int i,temp=0;
Setnumber3Value();
for(i=0;i<10;i++)
{

number3[i]=a[i]+b[i]+temp;
if(number3[i]<10000) temp=0;
else
{
number3[i]=number3[i]-10000;
temp=1;
}
}
prt(number3);
}
int compare(int *a,int *b)
{
int i;
for(i=9;i>=0;i--)
{
if(a[i]>b[i]) return 1;
else if(a[i]<b[i])
return 0;
else
continue;
}
}
void SubBigNumber(int *a,int *b)//大数减
{
int i,temp=0;
Setnumber3Value();
for(i=9;i>=0;--i)
{
number3[i]=a[i]-b[i];
if(number3[i]>=0)
{

}
else
{
number3[i]+=10000;
number3[i-1]-=1;
}
}
prt(number3);
}

void MultipleBigNumber(int *a,int b)
{
int i,temp=0,carry=0;
Setnumber3Value();
for(i=0;i<10;i++)
{
temp=a[i]*b+carry;
number3[i]=temp%10000;
carry=temp/10000;
}
prt(number3);
}
void DividBigNumber(int *a,int b)
{
int i,temp=0,borrow=0;
Setnumber3Value();
for(i=9;i>=0;--i)
{
number3[i]=(a[i]+temp*10000)/b;
temp=a[i]%b;

}
prt(number3);

}

void main()
{
printf("the first number : ");
prt(number1);
printf("the second number : ");
prt(number2);
printf("add the two number : ");
AddBigNumber(number1,number2);
printf("sub the two number : ");
if(compare(number1,number2)==1) SubBigNumber(number1,number2);
else
SubBigNumber(number2,number1);

int b;
printf("please input one number : ");
scanf("%d",&b);
printf("mul the two number : ");
MultipleBigNumber(number1,b);
printf("divid the two number : ");
DividBigNumber(number1,b);

}

14.各种常用排序算法

#include<stdio.h>
#include<stdlib.h>

#define N 8
int buf[8]={8,33,3,25,77,66,2,9};
//int para[8]={0,33,13,25,77,66,21,9};
void prt(int *a)
{
int i,j;
for(i=0;i<N;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
}
//选择排序:总是从未排序中找出最小的值插入排好序的后面
int selectmin(int *a,int n)
{
int i,j=n,min=a[n];
for(i=n;i<N;i++)
{
if(min>a[i]){
min=a[i];
j=i;
}
}
return j;
}
void select_sort(int *a)
{
int i,temp,s;

for(i=0;i<N;i++)
{
s=selectmin(a,i);
temp=a[s];
a[s]=a[i];
a[i]=temp;
}
prt(a);
}
//冒泡排序
void select_bubble(int *a)
{
int i,j,temp;
for(i=0;i<N;i++)
{
for(j=0;j<N-i;j++)
{
if(a[j]>a[j+1]) {
temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
}
}
}
prt(a);
}
//插入排序:总在排好序的数组 中插入一个数,使其有序,如此循环
void select_insert(int *a)
{
int i,j,temp,s;
for(i=2;i<N;i++)
{
a[0]=a[i];
for(j=1;j<i;j++)
{
temp=i;
if(a[j]>a[0])
{
a[i]=a[j];
temp=j;
break;//在插入排序中,是在已经有序的数组中插入元素,所以当一遇到大值,就可以确定插入位置
}

}
for(s=i;s>temp;s--)
{
a[s]=a[s-1];
}
a[temp]=a[0];
}
prt(a);
}
//快排: 通过一种排序方式让数组分成 一部分小于pivotkey基准值的 部分,一部分大于基准值的部分,再循环使其有序,通常默认 pivotkey=a[low];
int partition(int a[],int low,int high)
{
int pivotkey=a[low];
while(low<high)
{
while(low<high&&a[high]>=pivotkey)--high;
a[low]=a[high];
while(low<high&&a[low]<=pivotkey)++low;
a[high]=a[low];

}
a[low]=pivotkey;
return low;

}

void quick_sort(int a[],int low,int high)
{
int pivotloc;
if(low<high)
{
pivotloc=partition(a,low,high);
quick_sort(a,low,pivotloc-1);
quick_sort(a,pivotloc+1,high);
}
}

//希尔排序
int s_sort(int a[],int flag,int length)
{
int i,j,s,temp;
for(i=0;i<length&&(i+flag)<length;i++)
{
for(j=i;j<length;j+=flag)
{
temp=a[j];
for(s=j-flag;s>=0&&a[s]>temp;s-=flag)//重点处,仔细体会此处
a[s+flag]=a[s];
a[s+flag]=temp;
}

}
return 1;
}
int shell_sort(int a[],int length)
{
int flag=length/2;
while(flag>0)
{
s_sort(a,flag,length);
flag/=2;
}
return 1;
}

//归并排序:先是将一个大数组分裂成概念上的小数组,再将其递归回溯的合并成一个有序大大数组
void merge(int arr[],int low,int mid,int high)//将概念上分裂的小数组 合并成一个有序的数组
{
int left_low,right_low,i,k,j;
int *temp=(int *)malloc((high-low+1)*sizeof(int));
if(temp==NULL) return;
for(left_low=low,right_low=mid+1,i=0;left_low<=mid&&right_low<=high;i++)//将low到mid之间的数和mid+1到high之间的数有序合并
{
if(arr[left_low]<=arr[right_low])temp[i]=arr[left_low++];
else temp[i]=arr[right_low++];
}

if(left_low<=mid)
for(k=left_low;k<=mid;k++)
{
temp[i++]=arr[k];
}
if(right_low<=high)
for(j=right_low;j<=high;j++)
{
temp[i++]=arr[j];
}

for(i=0;i<high-low+1;i++)
arr[low+i]=temp[i];
free(temp);
}
void merge_sort(int arr[],int low,int high)
{
int mid=0;
if(low<high)
{
mid=(low+high)/2;
merge_sort(arr,low,mid);
merge_sort(arr,mid+1,high);
merge(arr,low,mid,high);
}

}

int main()
{
prt(buf);
//quick_sort(buf,0,N-1);
merge_sort(buf,0,N-1);
prt(buf);
//select_insert(para);

//select_bubble(buf);
//select_sort();
system("pause");
return 0;
}

15.文件操作

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

void readFile()
{
FILE *fp;
if((fp=fopen("F:\\c项目\\openfileoperation.txt","rt"))==NULL)
{
printf("\n can't open the file!\n'");
getch();//属于 conio.h
//exit(1);
}
char ch;
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
}
void writeFile()
{
FILE *fp;
if((fp=fopen("F:\\c项目\\writefile.txt","wt+"))==NULL)
{
printf("\n can't open the file!\n'");
getch();//属于 conio.h
//exit(1);
}
char ch;
ch=getchar();
while(ch!='\n')
{
fputc(ch,fp);
ch=getchar();
}
rewind(fp);
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);

}

int main()
{
readFile();
printf("\nplease input some char write into the file:\n");
writeFile();
return 0;
}

16.struct结构体 和字符串的赋值

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include<conio.h>
#define Sure 1
int main()
{
struct student{
int age;
char name[20];
char sex[8];
}student,*stu;
char ch_name[20],ch_sex[8];
printf("please input your name and sex:\n");
gets(ch_name);
gets(ch_sex);
struct student *sp;
sp=(struct student *)malloc(sizeof(student));
sp->age=18;
strcpy(sp->name,ch_name);//字符串的赋值
strcpy(sp->sex,ch_sex);

#ifdef Sure
printf("name:%s age:%d sex:%s\n",sp->name,sp->age,sp->sex);
#else
printf("it is wrong!\n");
#endif
free(sp);
return 0;
}

17.数据结构,二叉树

#include<stdio.h>
#include<stdlib.h>
#include<stack>
using namespace std;
//注意输入方法与格式 :1 2 4 8 0 0 9 0 0 5 0 0 3 6 0 0 7 0 0
typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

int prt(BiTree T)
{
if(T!=NULL)
{
printf("%d ",T->data);

}

return 1;
}
int CreateTree(BiTree &T)
{
int da;
scanf("%d",&da);
if(da==0){
T=NULL;
return 0;
}
else
{
if(!(T=(BiTree)malloc(sizeof(BiTNode)))) return 0;
T->data=da;
CreateTree(T->lchild);
CreateTree(T->rchild);
}
return 1;
}
int preOrderTree(BiTree T)
{
if(T!=NULL)
{
if(prt(T))
{
if(preOrderTree(T->lchild))
{
if(preOrderTree(T->rchild)) return 1;
}
}
return 0;
}
return 1;
}
int midOrderTree(BiTree T)
{
if(T)
{
midOrderTree(T->lchild);
prt(T);
midOrderTree(T->rchild);
}
}
int afterOrderTree(BiTree T)
{
if(T)
{
afterOrderTree(T->lchild);
afterOrderTree(T->rchild);
prt(T);
}
}

//交换二叉树的左右子树
int Change_left_right_Tree(BiTree &node)
{
if(node==NULL) return 0;
else
{
BiTree temp=node->lchild;
node->lchild=node->rchild;
node->rchild=temp;
Change_left_right_Tree(node->lchild);
Change_left_right_Tree(node->rchild);
return 1;
}
}

int MiddleOrderTree(BiTree T)
{
BiTree p=T;
stack<BiTree> s;
while(!s.empty()||p!=NULL)
{
if(p!=NULL)
{
s.push(p);
p=p->lchild;
}
else
{
p=s.top();
s.pop();
prt(p);
p=p->rchild;
}
}
return 1;
}
int main()
{
BiTree T;
CreateTree(T);
preOrderTree(T);
printf("\n");
midOrderTree(T);
printf("\n");
MiddleOrderTree(T);
printf("\n");
afterOrderTree(T);

}

上一篇:Swift 版本很好的卡片切换效果基于ZLSwipeableView


下一篇:CSDN CODE平台,中国版Github简要使用说明