C语言基础算法(2)

 

#include <stdio.h>
#include <math.h>
int main(){
    float a,b,c,s,area;
    scanf("%f%f%f",&a,&b,&c);
    if(a+b>c&&a+c>b&&b+c>a)
    {
        s=(a+b+c)/2;
        area=sqrt(s*(s-a)*(s-b)*(s-c));
        printf("%.2f",area);
    }else
    {
        printf("False");
    }
    return 0;
}

 

 

 

  1. 从键盘任意输入a、b、c的值,编程计算并输出一元二次方程ax^2+bx+c=0的根。
#include <stdio.h>
#include <math.h>
int main(){
double a,b,c,disc,x1,x2,p,q;
scanf("%lf%lf%lf",&a,&b,&c);
disc=b*b-4*a*c;
if(disc<0){
printf("无实根");
}
else
{
p=-b/(2.0*a);
q=sqrt(disc)/(2.0*a);
x1=p+q;
x2=p-q;
printf("real roots:x1=%7.2f,x2=%7.2f",x1,x2);
}
return 0;
}

 

 

  1. 从键盘输入任意年值,判此年是否为闰年。

 

#include <stdio.h>
#include <math.h>
int main(){
double a,b,c,disc,x1,x2,p,q;
scanf("%lf%lf%lf",&a,&b,&c);
disc=b*b-4*a*c;
if(disc<0){
printf("无实根");
}
else
{
p=-b/(2.0*a);
q=sqrt(disc)/(2.0*a);
x1=p+q;
x2=p-q;
printf("real roots:x1=%7.2f,x2=%7.2f",x1,x2);
}
return 0;
}

 

  1. 输入成绩,若成绩>=90分,输出A;若成绩>=80分,输出B;若成绩>=70分,输出C;若成绩》=60分,输出D;若成绩<60分,输出E。
#include <stdio.h>
int main(){
int score;
scanf("%d",&score);
switch(score/10)
{
case:10
case 9:printf("A\n");break;
case 8:printf("B\n");break;
case 7:printf("C\n");break;
case 6:printf("D\n");break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:printf("E\n");break;
defailt:printf("The score not between 0 and 100!\n");
}
return 0;
}

 

 

二、循环

  1. 求阶乘(连乘)
#include <stdio.h>
int main()
{
int i,n;
double p=1;
printf("输入一个整数,求其阶乘:");
scanf("%d",&n);
for(i=1;i<=n;i++)
p=p*i;
printf("n!=%f\n",p);
}

 

  1. 输出1!—n!(静态变量)
#include <stdio.h>
long Func(int n);
int main(){
    int i,n;
    long result;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        printf("%d!=%ld\n",Func(i));
    return 0;
}
long Func(int n)
{
    static long p=1;
    p=p*n;
    return p;
}

 

  1. 求n!(递归)
#include <stdio.h>
int main(){
    int n;
    long f;
    long fac(int n);
    scanf("%d",&n);
    f=fac(n);
    printf("%d!=%ld\n",n,f);
    return 0;
}
long fac(int n)
{
    long f;
    if(n==1||n==0) f=1;
    else f=n*fac(n-1);
    return f;
}

 

4、求和

( 1 )求给定项数之和     Sn= 1 + 2的平方 + 4 的平方  +  6的平方+...+50的平方

#include <stdio.h>
int main()
{
    int i,s=1;
    for(i=2;i<=50;i+=2)
        s=s+i*i;
    printf("s=%d\n",s);
    return 0;
}

 

(2)正负符号相间的问题,循环次数依赖于项数值的大小。用π/4≈1-1/3+1/5-1/7+…求π的近似值,当某一项的绝对值<给定值为止。

#include <stdio.h>
#include <math.h>
int main(){
    float j,n,t,pi;
    t=1.0;
    pi=0;
    n=1.0;
    j=1.0;
    while(fabs(t)>=1e-6){
          pi=pi+t;
          n=n+2;
          j=-j;
          t=j/n;
    }
    pi=pi*4
      printf("pi=%10.6f\n",pi);
    return 0;
}

 

 

#include <stdio.h>
int main(){
    double x,p1=1,s=0;
    int i,j=1;
    scnaf("lf",&x);
    for(i=1;i<=10;i++){
        p1*=x;
        p2*=i;
        s+=j*p1/p2;
        j=-j;
    }
    printf("s=%10.5f\n",s);
    return 0;
}

 

 

#include <stdio.h>
int mian(){
    float i,j,n,m,pi;
    n=1.0;
    m=1.0
    i=0.0;
    j=1.0;
    pi=0.0;
    while(n/m>=1e-6){
        pi+n/m;
        i++;
        j=j+2;
        n=n*i;
        m=m*j;
    }
    printf("%f",pi*2);
    return 0;
}

 

  1. 斐波那契数列:1,1,2,3,5,8,13,21…

(1)一个一个处理Fibonacci数列

#include <stdio.h>
int main(){
    int i,n;
    long a,b,next;
    a=b=1;
    printf("%10ld%10ld"a,b);
    n=2;
    for(i=3;i<=40;i++){
        next=a+b;
        printf("%10ld",next);
        n++;
        if(n%6==0)printf("\n");
        a=b;
        b=next;
    }
    return 0;
}

 

(2)两个两个处理Fibonacci数列

#include <stdio.h>
int main(){
    int f1=1,f2=1;
    int i;
    for(i=1;i<20;i++){
        printf("%12d %12d",f1,f2);
        if(i%2==0)printf("\n");
        f1=f1+f2;
        f2=f2+f1;
    }
    return 0;
}

 

(3)用数组处理Fibonacci数列

#include <stdio.h>
int main(){
    int i;
    int f[40]={1,1};
    for(i=2;i<40;i++)
        f[i]=f[i-2]+f[i-1];
    for(i=0;i<40;i++){
        if(i%5==0)printf("\n");
        printf("%12d",f[i]);
    }
    return 0;
}

 

(4)用递归方法处理Fibonacci数列

#include <stdio.h>
long fib(int n)
{
    if(n<=2)return 1;
    else return fib(n-1)+fib(n-2);
}
int main(){
    int i,a=1,n=1,m;
    printf("%12d%12d",a,b);
    m=2;
    for(i=3;i<40;i++){
        printf("%12ld",fib(i));
        m++;
        if(m%4==0)printf("\n");
    }
    return 0;
}

 

  1. 素数(只能被1和本身整除),一个大于3的整数n,判定它是否为素数。

(1)方法一

#include <stdio.h>
#include <math.h>
int main(){
    int i,n;
    scanf("%d",&n);
    for(i=2;i<=n;i++)
        if(n%i==0)break;
    if(i>=n)printf("%d是素数\n",n);
    else printf("%d不是素数",n);
}

(2)方法二

#include <stdio.h>
#include <math.h>
int int main(){
    int i,n;
    scanf("%d",&n);
    int temp=(int)(sqrt(n));//方法三 n/2
    for(i=2;i<=temp;i++)
        if(n%i==0)break;
    if(i>=n)printf("%d是素数\n",n);
    else printf("%d不是素数",n);
}

(3)用函数判断一个数是否为素数

#include <stdio.h>
int fun(int n);
int main(){
    int n;
    scanf("%d",&n);
    if(fun(n))printf("%d是素数\n",n);
    else printf("%d不是素数",n);
}
int fun(int n)
{
    int i;
    for(i=2;i<n;i++)
        if(n%i==0)return 0;
    return 1;
}

 

  1. break

编程:学校在1000名师生中发起慈善捐款,自愿捐款、款数不限、总数超过20000元活动结束。编写程序,统计参与捐款的师生人数及捐款总数(精确到角币,即保留1位小数)。

#include <stdio.h>
#define M 20000
int main()
{
    float x,sum=0;
    int i;
    for(i=1;i<=1000;i++){
        scanf("%f",&x);
        sum=sum+x;
        if(sum>=M)break;
    }
    if(i>1000){
        printf("捐款人数=%d,总捐款数=%.1f\n",i-1,sum);
    }else{
        printf("捐款人数=%d,总捐款数=%.1f\n",i,sum);
    }
    return 0;
}

 

  1. 利用辗转相除法求两个数的最大公约数和最小公倍数。

 

#include <stdio.h>
int main(){
    int a,b,r,m,n;
    scanf("%d,%d",&a,&b);
    m=a;
    n=b;
    if(a<b){
        r=a;
        a=b;
        b=r;
    }
    while(b){
        r=a%b;
        a=b;
        b=r;
    }
    printf("最大公约数为%d\n",a);
    printf("最小公倍数为%d\n",m*n/a);
    return 0;
}

 

  1. 计数

输入若干等级制成绩(A、B、C、D、E等级),统计各等级人数,有效输入和无效输入次数,总人数。

#include <stdio.h>
void main(){
    char grade;
    int total=0,errTotal=0;
    int aCount=0,bCount=0,cCount=0,dCount=0,eCount=0;
    while((grade==getchar())!='\n'){
        switch(grade)
        {
            case 'A':
            case 'a':++aCount;++total;break;   
            case 'B':
            case 'b':++bCount;++total;break;
            case 'C':
            case 'c':++cCount;++total;break;
            case 'D':
            case 'd':++dCount;++total;break;
            case 'E':
            case 'e':++eCount;++tatal;break;
            default:printf("输入错误,请重新输入等级(A,B,C,D,E)\n");
                ++errTotal;break;
        }
    }
    printf("总人数:%d A等:%d B等:%d C等:%d D等:%d E等:%d",total,aCount,bCount,cCount,dCount,eCount);
}

 

  1. 完数

一个数如果恰好等于它的因子之和,这个数就成为“完数”。例如6的因子为1,2,3,而6=1+2+3,因此6是完数。(1不是完数)。编程找出1000之内的所有完数。

#include <stdio.h>
int main(){
    int i,s,k;
    for(i=2;i<1000;i++){
        s=0;
        for(k=1;k<i;k++)
            if(i%k==0)s=s+k;
        if(s==i)printf("%d",i);
    }
    return 0;
}

 

12.同构数

一个数恰好等于它的平方数的右端,这个数称为同构数。如5的平方是25,5是25中的右端的数,5就是同构数。找出1~1000之间的全部同构数。

#include <stdio.h>
int main(){
    int i,k,t;
    for(i=1;i<=1000;i++){
        t=i;
        k=i*i;
        while(t)
        {
            if(k%10!=t%10)break;
            else{
                k=k/10;
                t=t/10;
            }
        }
         if(t==0) printf("%d %d\n",i,i*i);
    }
    return 0; 
}

 

  1. 把一个整数分成若干位并输出,水仙花数。
#include <stdio.h>
int main(){
    int i;
    long m1,m2,m3;
    for(i=100;i<=999;i++)
    {
        m1=i%10;
        m2=i/10%10;
        m3=i/100;
        if(m1*m1*m1+m2*m2*m2+m3*m3*m3==i)
            printf("%d\n",i);
    }
    return 0;
}
  1. 构造数据

    (1)2+22+222+…

#include <stdio.h>
int main(){
    int s=0,m=0,a,n,i;
    scanf("%d%d",&a,&n);
    for(i=1;i<=n;i++){
        m=m*10+a;
        s=s+m;
    }
    printf("%d",s);
    return 0;
}

 

(2)输出逆序数

#include <stdio.h>
int main(){
    int num,m=0;
    printf("输入一个整数");
    scanf("%d",&num);
    do
    {
        m=m*10+num%10;
        num/=10;
    }while(num>0);
    printf("%d",m);
    return 0
}

15.回文

(1)判断一个整数是否为回文数。

回文数:整数与倒数一样。如12321就是一个回文数。

#include <stdio.h>
int mian()
{
    long x,a,b=0;
    scanf("%ld",&x);
    a=x;
    while(a!=0)
    {
        b=b*10+a%10;
        a=a/10;
    }
    if(x==b)printf("%ld:yes",x);
    else printf("%ld:no",x);
    return 0;
}

 (2)判断回文(字符串)

#include <stdio.h>
#include <string.h>
int fun(char *s)
{
    char *p,*q;
    p=s;
    q=s+strlen(s)-1;
    for(;p<q;p++,q--)
        if(*p!=*q) return 0;
    return 1;
}
int main(){
    char a[10];
    gets(a);
    if(fun(a)) printf("%s:yes\n",a);
    else printf("%s:no",a);
    return 0;
}
  1. 循环嵌套

(1)直角三角形

#include <stdio.h>
int main(){
    int i,j;
    for(i=1;i<=4;i++){
        for(j=1;j<=i;j++)
            printf("*");
        printf("\n");
    }
}

 

#include <stdio.h>
int main(){
    int i,j;
    for(i=1;i<=4;i++){
        for(j=1;j<=5-i;j++)
            printf("*");
        printf("\n");
    }
}

 

#include <stdio.h>
int main(){
    int i,j,k;
    for(i=1;i<=4;i++){
        for(k=1;k<=i;k++)
            printf(" ");
        for(j=1;j<=5-i;j++)
            printf("*");
        printf("\n");
    }
}

 

#include <stdio.h>
int main() {
    int i, j, k;
    for (i = 1; i <= 4; i++) {
        for (k = 1; k <= 5-i; k++)
            printf(" ");
        for (j = 1; j <=  i; j++)
            printf("*");
        printf("\n");
    }
}

 

#include <stdio.h>
int main() {
    int i, j, k;
    for (i = 1; i <= 4; i++) {
        for (k = 1; k <= 5-i; k++)
            printf(" ");
        for (j = 1; j <= 2*i-1; j++)
            printf("*");
        printf("\n");
    }
}

 

#include <stdio.h>
int main() {
    int i, j, k;
    for (i = 1; i <= 4; i++) {
        for (k = 1; k <= 5-i; k++)
            printf(" ");
        for (j = 1; j <= 2*i-1; j++)
            printf("*");
        printf("\n");
    }
    for (i = 3; i>=1; i--) {
        for (k = 1; k <= 5 - i; k++)
            printf(" ");
        for (j = 1; j <= 2 * i - 1; j++)
            printf("*");
        printf("\n");
    }
}

 

  1. 数制转换
#include <stdio.h>
int main(){
    int x,rem[10],i=0,k;
    printf("输入一个十进制数");
    scanf("%d",&x);
    while(x!=0){
        rem[i]=x%2;//x%8 八进制
        x=x/2; //x/8 八进制
    }
      for(k=i,k>=0,k--){
            printf("%d",rem[k]);
        }
    return 0;
}

 

十六进制

#include <stdio.h>
int main() {
    int x, rem[10], i = 0, k;
    printf("输入一个十进制数");
    scanf("%d", &x);
    while (x != 0) {
        rem[i] = x % 16;
        x = x / 16;
        i++;
    }
    for (k = i - 1; k >= 0; k--)
    {
        if (rem[k] < 10)
        {
            printf("%d", rem[k]);
        }
        else {
            switch (rem[k])
            {
            case 10:printf("%c", 'A'); break;
            case 11:printf("%c", 'B'); break;
            case 12:printf("%c", 'C'); break;
            case 13:printf("%c", 'D'); break;
            case 14:printf("%c", 'E'); break;
            case 15:printf("%c", 'F'); break;
            }
        }
    }
    return 0;
}

 

三、数组、函数、结构体

  1. 输入十个数,输出其中最大数

 

#include <stdio.h>
int main(){
    int i,max,a[10];
    for(i=0;i<10;i++)
        scanf("%d",&a[i]);
    max=a[0];
    for(i=1;i<10;i++)
        if(a[i]>max) max=a[i];
    printf("maxnumber=%d",max);
    return 0;
}
  1. 求矩阵中最大元素值,以及其所在的行号和列号。
#include <stdio.h>
int main(){
    int i,j,row,colum,max;
    int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,5,2}};
    max=a[0][0],row=0,colum=0;
    for(i=0;i<=2;i++)
        for(j=0;j<=3;j++)
            if(a[i][j]>max){
                max=a[i][j];
                row=i;
                colum=j;
            }
    printf("max=%d,row=%d,colum=%d\n",max,row,colum);
    return 0;
}
  1. 选择排序
for(i=0;i<n-1;i++){
    k=i;
    for(j=i+1;j<n;j++)
        if(a[j]<a[k]) k=j;
    x=a[i];
    a[i]=a[k];
    a[k]=x;
}
for(i=0;i<n-1;i++){
    for(j=0;j<n-i-1;j++){
         if(a[j]<a[j+1]){
            temp=a[j];
            a[j]=a[j+1];
            a[j+1]=temp;
        }
    }
}

 

冒泡排序
4. 矩阵转置(不允许放到其他数组中)方阵

a[3][3]={1,2,3,4,5,6,7,8,9};
for(i=0;i<3;i++)
    for(j=0;j<i;j++)
        a[i][j]=a[j][i];
  1. 杨辉三角
#include <stdio.h>
int main()
{
    int a[10][10],i,j;
    for(i=0;i<10;i++)
    {
        a[i][0]=1;
        a[i][i]=1;
    }
    for(i=2;i<10;i++){
        for(j=1;j<i;j++)
            a[i][j]=a[i-1][j-1]+a[i-1][j];
    }
    for(i=0;i<10;i++)
    {
        for(j=0;j<=i;j++)
            printf(“%6d”,a[j][j]);
        printf('\n');
    }
    return 0;
}

 

  1. 逆序问题

(1)数值型数组逆序

for(i=0;i<n/2;i++)
    a[i]=a[n-i-1];

(2)字符串逆序

//方法一
#include <stdio.h>
#include <string.h>
int main(){
    char a[10];
    int i,j,k,t;
    gets(a);
    k=strlen(a)/2;
    j=strlen(a)-1;
    for(i=0;i<k;i++;j--)
    {
        t=a[i];
        a[i]=a[j];
        a[j]=t;
    }
    puts(a);
    return 0;
}
//方法二
#include <stdio.h>
#include <string.h>
int main(){
    char a[10],*p,*q;
    gets(a);
    p=a;
    q=a+strlen(a)-1;
    for(;p<q;p++;q--)
    {
        t=*p;
        *p=*q;
        *q=t;
    }
    puts(a);
    return 0;
}
//方法三
#include <stdio.h>
#include <string.h>
void swap(int *arr,int n)
{
    int t,i;
    for(i=0;i<n/2;i++){
        t=arr[i];
        arr[i]=arr[n-i-1];
        arr[n-i-1]=t;
    }
}
int main(){
    int a[10]={1,3,6,7,9,11,13,15,17,19},i,n;
    swap(a,10);
    for(i=0;i<10;i++)
        printf(%d,a[i]);
    return 0;
}

 

  1. 四个函数

(1)实现字符串连接

#include <stdio.h>
int main(){
    void scat(char str1[],char str2[]);
    char s1[50],s2[50];
    int i,k;
    printf("Input s1");
    gets(s1);
    printf("Input s2");
    gets(s2);
    scat(s1,s2);
    printf("Output s1:%s\n",s1);
    printf("Output s2:%s\n",s2);
    return 0;
}
void scat(char str1[],char str2[])
{
    int i=0,k=0;
    while(str[i]!='\0') i++;
    while(str2[k]!='\0')
    {
        str[i]=str2[k];
        i++;
        k++;
    }
    str[i]='\0';
}

(2)字符串长度

#include <stdio.h>
//递归
int strlength(char *a)
{
    int b;
    if(*a=='\0') b=0;
    else b=1+strlength(a+1);
    return b;
}
//非递归:
int strlength(char *p)
{
    int k=0;
    while(*p!='\0')
    {
        k++;
        p++;
    }
    return k;
}
int main(){
    char a[10];
    int k=0;
    gets(a);
    k=strlength(a);
    printf("%d",k);
    return 0;
}
  1. 字符串赋值-用字符指针编程
void MyStrcpy(char *dstStr,char *srcStr)
{
    while(*srcStr!='\0'){
        *dstStr=*srcStr;
        srcStr++;
        dstStr++;
    }
    *dstStr='\0';
}

 

4.用指针方式编写函数mystrcmp(char *,char *),实现字符串的比较。

#include <stdio.h>
int mystrcmp(char *s,char *t)
{
    while(*s==*t)
    {
        if(*s=='\0') return 0;
        s++;
        t++;
    }
    return (*s-*t);
}
int main()
{
   char *pa="CHINA",b[10]="CANADA",*pb;
    pb=b;
    if(mystrcmp(pa,pb)>0)
        printf("%s>%s\n",pa,pb);
    else if(mystrcmp(pa,pb)==0)
        printf("%s=%s\n",pa,pb);
    else printf("%s<%s\n",pa,pb);
}

 

  1. 结构体

(1)编写对候选人得票的统计程序。设有三个候选人,每次输入一个得票候选人的名字,要求最后输出各候选人的得票结果。

#include <stdio.h>
#include <string.h>
struct person{
    char name[20];
    int count;
}leader[3]={{"li",0},{"zhang",0},{"wang",0}};
int main(){
    int i,j;
    char leader_name[20];
    for(i=1;i<=100;i++)
    {
        scanf("%s",leader_name);
        for(j=0;j<3j++)
            if(strcmp(leader_name,leader[i]))
                leader[i].count++;
    }
    for(i=0;i<3;i++)
        printf("%15s%5",leader[i].name,leader[i].count);
    return 0;
}

 

-------转载 CSDN

 

posted @ 2023-05-07 21:16  长河饮马、  阅读(220)  评论(0编辑  收藏  举报