(原创)一些常见小程序(C)

1、求一个数的全部素因子(形如60=1*2*2*3*5)

#include<stdio.h>

void main()
{
    int m,n,i=1;
    printf("请输入一个整数: ");
    scanf("%d",&m);
    printf("%d=%d",m,i);
    for(n=2;n<=m;n++)
    {
        while(m%n==0)
        {
            printf("* %d",n);
            m=m/n;
        }
    }
    printf("
");
    system("pause"); //屏幕结果显示语句
}

结果显示:

(原创)一些常见小程序(C)

2、求一个数的全部因子

#include<stdio.h>

void main()
{
    int m,i;
    printf("请输入一个整数: ");
    scanf("%d",&m);
    printf("%d的全部因子有:
",m);
    for(i=1;i<=m/2+1;i++)
    {
        if(m%i==0)
            printf(" %d",i);
    }
    printf("
");
    system("pause"); //屏幕结果显示语句
}

结果显示:

(原创)一些常见小程序(C)

3、求100~200之间的全部素数

#include<stdio.h>
#include<math.h>

void main()
{
    int n,j,i,m=0;
    for(n=101; n<200; n=n+2) /**偶数不可能是,直接过滤掉**/  
    {   
        j = sqrt(n);
        for (i = 2; i <= j; i++)  
        {    
            if (n%i == 0)
            {     
                break;   
            }  
        }  
        if (i >= j + 1)   
        {    
            printf("  %d",n);   
            m = m + 1;   
        }  
        if (m%10 == 0)    /**m表示输入每10个数字一行,为了结果友好显示**/   
        {   
            printf("
");
        }
    }  
    printf("
");

    system("pause"); //屏幕结果显示语句
}

结果显示:

(原创)一些常见小程序(C)

4、判断一个数是否是素数

#include<stdio.h>
#include<math.h>
 
void main()
{
 int number,i,j;
 printf("请输入一个数:");  
 scanf("%d",&number);
 j = sqrt(number);
 for(i = 2; i <= j; i++)
      if (number%i == 0) break;
 if (i > j) 
     printf("
 %d是一个素数。

",number);
 else 
     printf("
 %d不是素数。

",number);

 system("pause"); //屏幕结果显示语句 

}

结果显示:
(原创)一些常见小程序(C)

5、判断一个年份是否是闰年

#include<stdio.h>
void main()
{
    int year,a;
    printf("请输入年份:");
    scanf("%d",&year);
    if((year%4==0&&year%100!=0)||(year%400==0)) 
        a=1;
    else 
        a=0;        
    if(a==1)
        printf("
 %d年是闰年
",year);
    else 
        printf("%d年非闰年
",year);

    system("pause"); //屏幕结构显示
}

结果显示:

(原创)一些常见小程序(C)

 6、求两个正整数a和b的最大公约数p与最小公倍数q

方法1:

pa开始,检测p是否能同时整除ab, 若是则停止循环,不是则令p1,继续检测。

qb开始,检测q是否能同时被ab整除,若是则停止循环,不是则令q1,继续检测。

#include<stdio.h>
void main()
{ 
    int a,b, temp,p, q; 

    printf("请输入a和b:
");  
    scanf("%d%d",&a,&b); 
 
    if (b<a)   //将输入的两个数中小的放在a中,大的放在b中
    {
        temp=b;
        b=a;
        a=temp;
    }

    p=a;
    while( a%p!=0 || b%p!=0)
        p--;
    printf("这两个数的最大公约数是%d
",p); 

    q=b;
    while( q%a!=0 || q%b!=0) 
        q++;
    printf("这两个数的最小公倍数是%d
",q); 
    system("pause"); //屏幕结果显示
}

结果显示:

(原创)一些常见小程序(C)

方法2:(方法1的改进)

已知整数a,b及其最大公约数p,则直接可推算出最小公倍数qq= a*b/p;

#include<stdio.h>
void main()
{ 
    int a,b, temp,p, q; 

    printf("请输入a和b:
");  
    scanf("%d%d",&a,&b); 
 
    if (b<a)   //将输入的两个数中小的放在a中,大的放在b中
    {
        temp=b;
        b=a;
        a=temp;
    }

    p=a;
    while( a%p!=0 || b%p!=0)
        p--;
    printf("这两个数的最大公约数是%d
",p); 

    q=a*b/p;
    printf("这两个数的最小公倍数是%d
",q); 
    system("pause"); //屏幕结果显示
}

(原创)一些常见小程序(C)

方法3:辗转相除(以1397与2413为例)

以大数2413为被除数,以小数1397为除数,相除得:商为1,余数为1016 

以除数1397为被除数,以余数1016为除数,相除得:  商为1,余数为381 

以除数1016为被除数,以余数381为除数, 相除得:   商为2,余数为254 

以除数381为被除数, 以余数254为除数,  相除得:  商为1 ,余数为127 

以除数254为被除数, 以余数127为除数, 
相除得:  商为2,余数为0  
~~发现能整除,则127就是最大公约数。整个计算过程为:

(原创)一些常见小程序(C)

#include<stdio.h>
void main()
{ 
    int a,b, temp,m,r; 

    printf("请输入a和b:
");  
    scanf("%d%d",&a,&b); 

    if (b<a)   //将输入的两个数中小的放在a中,大的放在b中
    {
        temp=b;
        b=a;
        a=temp;
    }

    m=a*b; 
    while(a!=0)
    { 
        r=b%a; 
        b=a;
        a=r;  
    }
    printf("这两个数的最大公约数是:%d
",b); 
    printf("这两个数的最小公倍数是:%d
", m/b);  

    system("pause"); //屏幕结果显示
}

 结果显示:

(原创)一些常见小程序(C)

 7、输出所有“水仙花”数。

注:所谓“水仙花”数是指一个三位数,其各位数字的立方和等于该数本身。如153就是一个“水仙花数”,因为153=13+53+33

#include<stdio.h>
void main()
{ 
    int n,i,j,k;
    printf("所有的水仙花数为:
");
    for(n=100;n<1000;n++)
    {
        i=n/100;
        j=n/10-i*10;
        k=n%10;
        if(n==i*i*i+j*j*j+k*k*k)
        printf("%d  ",n);
    }
    printf("
");

    system("pause"); //屏幕结果显示
}

结果显示:
(原创)一些常见小程序(C)

8、找出1000以内的所有“完数”

注:所谓“完数”是指一个数如果恰好等于它的因子之和,这个数就称为“完数”

如 6的因子是1 2 3,且6=1+2+3,所以6称为“完数”

#include<stdio.h>
void main()
{
    int m,s,i;

    printf("1000以内的所有完数有:
");
    for(m=2;m<=1000;m++)
    {
        s=0;//此处s=0一定要加,因为前几次循环的时候s的值已经改变
        for(i=1;i<m;i++)
            if((m%i)==0)
                s=s+i;
        if(s==m)
        {
            printf("%d 它的因子有:",m);
            for(i=1;i<m;i++)
                if(m%i==0)
                    printf("%d ",i);
            printf("
");
        }
    }
    system("pause");

}

结果显示:

(原创)一些常见小程序(C)

 9-1、求一个数组的逆序排列

#include <stdio.h>
#define N 5
void main()
{
    int a[N],i,temp;
    printf("请输入数组a的元素:");
    for(i=0;i<N;i++)
        scanf("%d",&a[i]);
    printf("数组a为:");
    for(i=0;i<N;i++)
        printf("%d ",a[i]);
    printf("
");
    for(i=0;i<N/2;i++)
    {
        temp=a[i];
        a[i]=a[N-i-1];
        a[N-i-1]=temp;
    }
    printf("数组a重排后为:");
    for(i=0;i<N;i++)
        printf("%d ",a[i]);
    printf("
");
    system("pause");

}

结果显示:

(原创)一些常见小程序(C)

9-2、字符串逆序排列(采用函数调用)

#include <stdio.h>
void main()
{
    void inverse(char str[]); //对inverse函数的声明,如果将main函数放在inverse函数的后面,就不必在main函数中声明
    char string[20];
    printf("请输入一个字符串String:");
    scanf("%s",string);
    printf("
");
    inverse(string);
    printf("反转后的新字符串为:%s",string);
    printf("
");
    system("pause");
}

void inverse(char str[])
{
    int i;
    char temp;
    for(i=0;i<strlen(str)/2;i++)
    {
        temp=str[i];
        str[i]=str[strlen(str)-i-1];
        str[strlen(str)-i-1]=temp;
    }
    
}

结果显示:

(原创)一些常见小程序(C)

10、输出杨辉三角形(要求前N行)

分析:

      杨辉三角形是(a+b)n 展开后各项的系数。如:

      (a+b)0展开后为:1                                            系数为:1

      (a+b)1展开后为:a+b                                        系数为:1,1

      (a+b)2展开后为:a2+2ab+b2                                    系数为:1,2,1

      (a+b)3展开后为:a3+3a2b+3ab2+b3                       系数为:1,3,3,1   

      (a+b)4展开后为:a4+4a3b+6a2b2+4ab3+b4          系数为:1,4,6,4,1

                ..................

杨辉三角形的特点:

(1)各行的第一个数都是1

(2)各行的最后一个数也都是1

(3)从第3行起,除上面指出的第一个数和最后一个数外,其余格数是上一行的同列与前一列两个数之和

      表示为:a[i][j]=a[i-1][j]+a[i-1][j-1],其中i表示行,j表示列

#include <stdio.h>
#define N 11
void main()
{
    int a[N][N],i,j;  //数组为11行11列,0行0列不用
    for(i=1;i<N;i++)
    {
        a[i][1]=1;  //各行第一个元素设为1
        a[i][i]=1;  //对角元素设为1
    }
    for(i=3;i<N;i++)
        for(j=2;j<=i-1;j++)
            a[i][j]=a[i-1][j]+a[i-1][j-1];
    for(i=1;i<N;i++)
    {
        for(j=1;j<i;j++)
            printf("%d ",a[i][j]);
        printf("
");
    }
    printf("
");

    system("pause");

}

结果显示:
(原创)一些常见小程序(C)

11、将两个字符串连接起来(注:不允许用自带函数strcat)

方法1:直接进行

#include <stdio.h>
void main()
{
    char str1[20],str2[20];
    int i=0,j=0;
    printf("
请输入第一个字符串:");
    scanf("%s",str1);
    printf("
请输入第二个字符串:");
    scanf("%s",str2);
    while(str1[i]!='