C语言基础:常见算法

  1. #include<stdio.h>
  2. int prime(int m); 
  3. int isPerfect(int n,int a[]); 
  4. void selectSort(int a[],int n); 
  5. void bubbleSort(int a[],int n);
  6. int search(int a[],int n,int x); 
  7. void converse(int n,int k,char st[]);
  8. void fun(int *p,int n,int m);
  9.  
  10. main(){
  11.     /*1.输入两个整数存放于变量中,实现两变量值交换 */
  12.     
  13.     int num1,num2,temp;
  14.     printf("Please input two Integers:");
  15.     scanf("%d %d",&num1,&num2);
  16.     temp=num1;
  17.     num1=num2;
  18.     num2=temp;
  19.     printf("After exchange,num1=%d,num2=%d",num1,num2); 
  20.     
  21.     
  22.     
  23.     /*2.求和,从键盘输入正整数n,求1+2+3+。。。+*/
  24.  
  25.     int n,sum,i;
  26.     printf("Please inout n(>0)");
  27.     scanf("%d",&n);
  28.     sum=0;
  29.     for(i=1;i<=n;i++){
  30.         sum+=i;        
  31.     } 
  32.     printf("1+2+3+...+%d=%d",n,sum);
  33.  
  34.  
  35.     
  36.     /*3.求阶乘*/
  37.    
  38.     int n,i;
  39.     long fac;
  40.     printf("Please input n(>0)");
  41.     scanf("%d",&n);
  42.     fac=1;
  43.     for(i=1;i<=n;i++){
  44.         fac*=i;
  45.     } 
  46.     printf("1*2*3*...*%d=%ld",n,fac);
  47.   
  48.  
  49.     
  50.     /*4.用随机函数产生100个【0,99】内的随机整数,要求每行5个打印,并统计小于60,60-85,大于85个数并打印结果*/
  51.  
  52.     int a[100],i,count1,count2,count3;
  53.     count1=count2=count3=0;
  54.     for(i=0;i<100;i++){
  55.         a[i]=rand()%100;
  56.         if(a[i]<60)
  57.             count1++;
  58.         else if(a[i]>=60&&a[i]<80)
  59.             count2++;
  60.         else
  61.             count3++;
  62.     } 
  63.     
  64.     for(i=0;i<100;i++){
  65.         if(i%5==0)
  66.             printf("\n");
  67.         printf(" %d ",a[i]);
  68.     }
  69.     printf("\n count1=%d,count2=%d,count3=%d\n",count1,count2,count3);
  70.   
  71.     
  72.     /*5.从键盘输入一行字符,统计出字母,数字,空格及其他字符的个数*/
  73.    
  74.     char c[80],i=0,letter,digit,space,other;
  75.     letter=digit=space=other=0;
  76.     while((c[i]=getchar())!='\n'){
  77.         if(c[i]>='a'&&c[i]<='z'||c[i]>='A'&&c[i]<='Z')
  78.             letter++;
  79.         else if(c[i]>='0'&&c[i]<='9')
  80.             digit++;
  81.         else if(c[i]=' ')
  82.             space++;
  83.         else
  84.             other++;           
  85.         i=i+1;
  86.     } 
  87.     printf("letter=%d,digit=%d,space=%d,other=%d",letter,digit,space,other);
  88.  
  89.  
  90.     
  91.     /*6.求两个数的最大公约数和最小公倍数*/
  92.  
  93.     int m,n,nm,r,t;
  94.     printf("Please input m,n:");
  95.     scanf("%d",&m);
  96.     scanf("%d",&n);
  97.     nm=m*n;
  98.     if(m<n){
  99.         t=m;
  100.         m=n;
  101.         n=t;
  102.     } 
  103.     r=m%n;
  104.     while(r!=0){
  105.         m=n;
  106.         n=r;
  107.         r=m%n;
  108.     }
  109.     printf("最大公约数=%d\n",n);
  110.     printf("最小公倍数=%d",nm/n);
  111.    
  112.   
  113.  
  114.     /*7.输入一个整数,判断是否是素数*/
  115.   
  116.     int m;
  117.     printf("请输入一个数:");
  118.     scanf("%d",&m);
  119.     if(prime(m))
  120.         printf("是素数");
  121.     else
  122.         printf("不是素数"); 
  123.     
  124.     
  125.         
  126.     /*8.一个数如果恰好等于他的因子之和,这个数就称为完数*/ 
  127.    
  128.     int i,a[1000],j;
  129.     for(i=1;i<=1000;i++){
  130.         for(j=0;j<1000;j++)
  131.             a[j]=0;
  132.         
  133.         if(isPerfect(i,a)){
  134.             printf("%d its factors are ",i);
  135.             j=0;
  136.             while(a[j]!=0)
  137.                 printf("%d ,",a[j++]);
  138.             printf("\n");
  139.         }
  140.     }
  141.    
  142.     
  143.     /*9.选择排序法*/
  144.    
  145.     int a[10],i;
  146.     printf("Please input 10 numbers:");
  147.     for(i=0;i<10;i++){
  148.         scanf("%d",&a[i]);
  149.     }
  150.     selectSort(a,10);
  151.     printf("After sorted:");
  152.     for(i=0;i<10;i++){
  153.         printf("%d ",a[i]);
  154.     }
  155.     printf("\n");
  156.    
  157.   
  158.  
  159.     /*10.冒泡排序法*/
  160.     
  161.     int a[10],i;
  162.     printf("Please input 10 numbers:");
  163.     for(i=0;i<10;i++){
  164.         scanf("%d",&a[i]);
  165.     }
  166.     bubbleSort(a,10);
  167.     printf("After sorted:");
  168.     for(i=0;i<10;i++){
  169.         printf("%d ",a[i]);
  170.     }
  171.     printf("\n");
  172.    
  173.     
  174.     /*11.折半查询法*/
  175.    
  176.     int a[10]={1,3,4,6,9,12,45,56,78,98,};
  177.     int result,x;
  178.     printf("Please input x:");
  179.     scanf("%d",&x);
  180.     result=search(a,10,x);
  181.     if(result==-1)
  182.         printf("%d is not found!",x);
  183.     else
  184.         printf("%d is in the %d position of array ",x,result);
  185.  
  186.  
  187.     
  188.     /*12求二维数组中最大元素,所在行,列*/
  189.  
  190.     int max,row,col,i,j;
  191.     int a[5][5]={{1,2,3,4,5},
  192.              {2,3,4,5,6},
  193.              {3,4,5,6,155},
  194.              {4,5,112,7,8},
  195.              {5,6,7,8,9}
  196.              };
  197.     
  198.     printf("Please input array elements:");
  199.     for(i=0;i<5;i++){
  200.         for(j=0;j<5;j++){
  201.             scanf("%d",&a[i][j]);
  202.         }
  203.     } 
  204.     
  205.     max=a[0][0];
  206.     row=0;
  207.     col=0;
  208.     for(i=0;i<=4;i++){
  209.         for(j=0;j<=4;j++){
  210.             if(a[i][j]>max){
  211.                 max=a[i][j];
  212.             }
  213.             row=i;
  214.             col=j;
  215.         }
  216.     }
  217.     printf("max=%d,row=%d,col=%d",max,row,col);
  218.     
  219.  
  220.     
  221.     /*13.输出杨辉三角形*/
  222.   
  223.     int i,j,a[10][10];
  224.     for(i=0;i<10;i++){
  225.         a[i][0]=1;
  226.         a[i][i]=1;
  227.     }
  228.     for(i=2;i<10;i++){
  229.         for(j=1;j<i;j++){
  230.             a[i][j]=a[i-1][j-1]+a[i-1][j];
  231.         }
  232.     } 
  233.     for(i=0;i<10;i++){
  234.         for(j=0;j<=i;j++){
  235.             printf("%6d",a[i][j]);
  236.         }
  237.         printf("\n");
  238.     }
  239.     
  240.     
  241.     /*14.将一个十进制数转换成k(2-36)进制字符串*/
  242.   
  243.     int n,k;
  244.     char str[10]={'\0'};
  245.     printf("Please input n,k:");
  246.     scanf("%d %d",&n,&k);
  247.     converse(n,k,str);
  248.     printf("%s",str); 
  249.  
  250.  
  251.     
  252.     /*15.输入一行字符,统计有多少个单词*/
  253.     
  254.     char string[81];
  255.     int i,num=0,word=0;
  256.     char c;
  257.     gets(string);
  258.     for(i=0;(c=string[i])!='\0';i++){
  259.         if(c==' ') word=0;
  260.         else if(word==0){
  261.             word=1;
  262.             num++;
  263.         }
  264.     } 
  265.     printf("There are %d words int the line.\n",num);
  266.   
  267.  
  268.     
  269.     /*16.迭代法*/
  270.    
  271.     float fSqrt(float a){
  272.         float x0,x1;
  273.         x0=a/2;
  274.         x1=0.5*(x0+a/x0);
  275.         while(fabs(x1-x0)>0.00001){
  276.             x0=x1;
  277.             x1=0.5*(x0+a/x0);
  278.         }
  279.         return 1;
  280.     } 
  281.     
  282.  
  283.     
  284.     /*17.插入法*/
  285.   
  286.     void insert(int a[],int n,int x){
  287.         int p,i;
  288.         p=0;
  289.         while(x>a[p]&&p<=n){
  290.             p=p+1;
  291.         }
  292.         for(i=n-1;i>=p;i--)
  293.             a[i+1]=a[i];
  294.         a[p]=x;
  295.     } 
  296.    
  297.  
  298.     
  299.     /*18.穷举法*/
  300.     
  301.     int i,j,k;
  302.     printf("5元    1元    0.5元\n");
  303.     for(i=1;i<=20;i++){
  304.         for(j=1;j<=100-i;j++){
  305.             k=100-i-j;
  306.             if(5*i+1*j+k/2==100&&k%2==0){
  307.                 printf("%d    %d    %d\n",i,j,k);
  308.             }
  309.         }
  310.     } 
  311.  
  312.  
  313.     
  314.     /*19.递归算法*/
  315.    
  316.     long fac(int n){
  317.         if(n==1) 
  318.             return 1;
  319.         else
  320.             return n*fac(n-1);
  321.     } 
  322.     float pn(float x,int n){
  323.         if(n==0) 
  324.             return 1;
  325.         else if(n==1)
  326.             return x;
  327.         else
  328.             return((2*n-1)*x-pn(x,n-1)-(n-1)*pn(n-2,x))/n;
  329.     }
  330.    
  331.   
  332.  
  333.     /*20.有n个整数,使前后各数顺序向后移动m个位置,最后m个数变成最前面m个数*/
  334.   
  335.     int i,a[15]={1,6,9,8,5,4,3,5,2,4};
  336.     fun(a,10,3);
  337.     for(i=0;i<10;i++)
  338.         printf("%d ",a[i]); 
  339.     
  340.  
  341.     
  342.     /*21.从键盘输入一个字符,将小写字符转换成大写字母,然后输出到磁盘文件中一!结束输入*/
  343.     
  344.     FILE *fp;
  345.     char str[100];
  346.     int i=0;
  347.     if((fp=fopen("test","w"))==NULL){
  348.         printf("cannot open the file\n");
  349.         exit(0);
  350.     } 
  351.     printf("please input a string:\n");
  352.     gets(str);
  353.     while(str[i]!='!'){
  354.         if(str[i]>='a'&&str[i]<='z'){
  355.             str[i]=str[i]-32;
  356.             fputc(str[i],fp);
  357.         }
  358.         i++;
  359.         if(i>strlen(str)) break;
  360.     }
  361.     fclose(fp);
  362.     fp=fopen("test","r");
  363.     fgets(str,strlen(str)+1,fp);
  364.     printf("%s\n",str);
  365.     fclose(fp);    
  366.   
  367.     
  368. }
  369. int prime(int m){
  370.     int i,result;
  371.     result=1;
  372.     for(i=2;i<=(int)(sqrt(m));i++){
  373.         if(m%i==0){
  374.             result=0;
  375.             break;
  376.         }
  377.     }
  378.     return result;
  379. }
  380.  
  381. int isPerfect(int n,int a[]){
  382.     int i,sum=0,j=0;
  383.     for(i=1;i<=n/2;i++)
  384.         if(n%i==0){
  385.             sum=sum+i;
  386.             a[j++]=i;    
  387.             }
  388.         if(sum==n)
  389.             return 1;
  390.         else
  391.             return 0;
  392.     
  393. }
  394.  
  395. void selectSort(int a[],int n)
  396. {
  397.     int i,min_index,j,temp;
  398.     for(i=0; i<n-1; i++)
  399.     {
  400.         min_index = i; 
  401.        
  402.         for(j=i+1; j<n; j++)
  403.         {
  404.             if(a[j] < a[min_index])
  405.             {
  406.                 min_index = j;
  407.             }
  408.         }
  409.         
  410.         if( i != min_index)
  411.         {
  412.             temp = a[i];
  413.             a[i] = a[min_index];
  414.             a[min_index] = temp;
  415.         }
  416.     }
  417. }
  418. void bubbleSort(int a[],int n){
  419.     int temp,i,j;
  420.     for(i=0;i<n-1;i++){
  421.         for(j=0;j<n-1-i;j++){
  422.             if(a[j]>a[j+1]){
  423.                 temp=a[j];
  424.                 a[j]=a[j+1];
  425.                 a[j+1]=temp;
  426.             }
  427.         }
  428.     }
  429. }
  430. int search(int a[],int n,int x){
  431.     int bot,top,mid;
  432.     int find;
  433.     bot=0;
  434.     top=n-1;
  435.     find=-1;
  436.     while(bot<=top&&find==-1){
  437.         mid=(top+bot)/2;
  438.         if(x==a[mid]){
  439.             find=mid;
  440.             break;
  441.         }else if(x<a[mid]){
  442.             top=mid-1;
  443.         }else{
  444.             bot=mid+1;
  445.         }
  446.     } 
  447.     return find;
  448. }
  449. void converse(int n,int k,char st[]){
  450.     int r,j,i;
  451.     char temp;
  452.     i=0;
  453.     while(n!=0){
  454.         r=n%k;
  455.         if(r>=10){
  456.             st[i++]=65+r-10;
  457.         } else{
  458.             st[i++]=r+48;
  459.         }
  460.         n=n/k;
  461.     }
  462. }
  463. void fun(int *p,int n,int m){
  464.     int b[10],i;
  465.     for(i=0;i<m;i++)
  466.         b[i]=*(p+n-m+i);
  467.     for(i=n-m-1;i>=0;i--)
  468.         *(p+i+m)=*(p+i);
  469.     for(i=0;i<m;i++)
  470.         *(p+i)=b[i];
  471. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值