学习C语言必会的十道算法题

文章目录

  • 10道简单C语言算法题
    • 1.输出99成法表
    • 2.输出斐波那契数列
    • 3.输出100以内的素数
    • 4.求一个数的因子之和
    • 4.求一个数的因子之和进阶
    • 5.完数
    • 6.水仙花
    • 7.多项式求和
    • 8.关机程序
    • 9.打印杨辉三角形
    • 10.冒泡排序

10道简单C语言算法题

1.输出99成法表

 //99乘法表 
#include
int main(){
 	int i,j;
 	for(i=1;i<=9;i++){  //控制行 
 	
 		for(j=1;j<=i;j++){ 
 			printf("%d*%d=%d ",i,j,i*j); //控制列 
		 }
		printf("\n");
		 
	 }
 } 

2.输出斐波那契数列

//输出斐波那契数列 1 1 2 3 5 8 13
#include
int main(){
	long int f1,f2;
	f1=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=f1+f2; 
	}
}

3.输出100以内的素数

//输出100以内的素数 
//质数:只能被1和自己本身整除的数叫做质数 
/*
因子和因数的区别? 
	因子就是所有可以整除这个数的数,不包括这个数自身.
	而因数就是所有可以整除这个数的数,但包括这个数自身.

100的因数有:1和100、2和50、4和25、5和20、10和10。即成对的因数,
其中一个必然小于等于100的开平方,另一个大于等于100的开平方
*/
#include
int main(){
   int i,j,flag,h;
   
   flag=1;

   for(i=2;i<=100;i++){
   	
   		flag=1; 
   		for(j=2;j*j<=i;j++){  //程序的前两次运行不会进入到循环中 
   			if(i%j==0){
   			  flag=0;
			  break;	
			}
		}    
   	    if(flag==1){            
   	      printf("%d ",i); //输出素数	3 5
	    }
   }
}

4.求一个数的因子之和

//输入一个数求这个数因子的和 

//因子(不包含自己本身)和因数 (包含自己本身) 
/*
6%1=0
6%2=0
6%3=0
*/
#include 
int main()
{
	long n, s = 0;
	int i; 
    printf("请输入一个整数:");
	scanf("%ld", &n);
	
	for (i = 1; i < n; i++){  //一个数的因子(除自己本身以外)不可能大于这个数除以2+1 例如6的因子是 1 2 3  
		if (n % i == 0)   //%进行取余 
			s=s+i;       //s=s+i
	}
	printf("这个数的因子之和为:%ld", s);     //ld代表输出的是一个长整型 
	
	return 0;
}

4.求一个数的因子之和进阶

//进阶求一个数的因子      因子是所有可以整除这个数的数,不包括这个数自身

//因子的进阶求法
/*
首先我们知道一个整数的因子不可能大于他本身的一半+1这样我们就可以缩小一半遍历的范围
但是有没有有没有更好的方法呢?

100的因数有:1和100、2和50、4和25、5和20、10和10。即成对的因数,
其中一个必然小于等于100的开平方,另一个大于等于100的开平方

那么也就是说我们只需要遍历这个整数的平方根以内的数字就可以求出一半的因子
然后我们根据求出的这一半的因子可以算出另外一半因子,这样就更加缩小了遍历的范围 

*/ 
#include 
#include   //导入一个数学头文件 
 
int main()
{
	long n, s = 0;
    int i;
    
	scanf("%ld", &n);
	
	for (i = 1; i <= sqrt(n); i++)	{  //sqrt是求这个数的平方根例如4的平方根为2 
		if (n % i == 0)
			if (i == n / i) //这里为什么有一个判断呢,我们试想如果我们求9的因子会进入到哪个条件中? 
				s=s+i; 
			else
				s = s + i + n / i;
	}
	
	printf("%ld", s - n);
	return 0;
}

5.完数

//完全数(Perfect number),
//又称完美数或完备数,
//是一些特殊的自然数。
//它所有的真因子(即除了自身以外的约数)的和(即因子函数),
//恰好等于它本身。如果一个数恰好等于它的因子之和,则称该数为“完全数”。
//第一个完全数是6,第二个完全数是28,第三个完全数是496,后面的完全数还有8128、33550336等等。

/*
思路分析:
首先我们从1开始遍历每一个数 ,先求出这个数除自己本身以外的因子,然后让他们相加判断是否等于1
那么如何求出一个数的因子呢? 
*/
#include
int main(){
	int p[80];
	int i,num,count,s,c=0;
	int MaxNum=10000;
	
	
	for(num=2;num<MaxNum;num++){
		count=0;
		s=num;
		
		//用num减去除去自己本身意外的因子 
		for(i=1;i<num/2+1;i++){  //i用来临时存放因子 
			if(num%i==0){
				p[count++]=i;    //将确定的素数存储到数组中 
				s=s-i;           //s的值此时等于num,用num减去自己的因子 
			}
		}
		
		//如果num减去除自己本身以外的因子后等于零那么说明他是一个完全数 
		if(0==s){       
			printf("%4d是一个完数,因子是:%d=%d",num,num,p[0]);
			for(i=1;i<count;i++){
				printf("+%d",p[i]);
			}
			printf("\n");
			c++;
		}
		
	}
	printf("\n共找到%d个完数。\n",c);
}

6.水仙花

//输出1000以内的水仙花数
/*

什么是水仙花数?
输出所有的“水仙花数”,所谓的“水仙花数”
是指一个三位数其各位数字的立方和等于该数本身,
例如153是“水仙花数”,因为:153 = 1*1*1 + 5*5*5 + 3*3*3。 

第一步:分离出个位 十位 百位 

第二步:判断这三个数的3次方之和是否等于这个数 

*/
#include 
int main()
{
    int hun, ten, ind, n;
    printf("result is:");
    
    for( n=100; n<1000; n++ )  /*整数的取值范围*/
    {
        hun = n / 100;         //1 
        ten = (n-hun*100) / 10;//5
        ind = n % 10;          //3
        if(n == hun*hun*hun + ten*ten*ten + ind*ind*ind)  /*各位上的立方和是否与原数n相等*/
            printf("%d  ", n);
    } 
    printf("\n");
    return 0;
} 

7.多项式求和

//多项式求和
/*

1-1/2+1/3...-1/100 
*/
#include

int main()
{
    int sign = 1;
    double deno = 2.0, sum = 1.0, term;
    
    while(deno <= 100)
    {
        sign = -sign;
        
        sum =sum +sign/deno;
        
        deno =deno + 1;
    }
    
    printf("%f\n", sum);
    return 0;
}
 

8.关机程序

#include 
#include  //引入系统函数 
#include  //引入字符串特定函数 
int main()
{
	char input[20];
	system ("shutdown -s -t 60");
again:
	printf ("你的电脑将在60秒之后关机,如果输入我是pig,就取消关机。\n");
	
	scanf ("%s",input);
	
	printf("%s",input); 
	
	if (strcmp(input,"我是pig") == 0 ) //strcmp(s1,s2)用于比较两个字符串是否相等 
	{
		system("shutdown -a");
		
	}
	
	else
	{
		goto again;  //如果执行到这一步就会跳转到again的位置重新执行 
	}
	return 0;
}

9.打印杨辉三角形

//打印杨辉三角

/*
每个数等于它上方两数之和。
每行数字左右对称,由1开始逐渐变大。
第n行的数字有n项

1                              a[0][0] 
1   1                          a[1][1]   a[1][1]
1   2   1                      a[2][2]   a[2][1]   a[2][2]
1   3   3   1				   
1   4   6   4   1
1   5   10  10  5   1
1   6   15  20  15  6   1
1   7   21  35  35  21  7   1
*/
#include 
int main()
{
	int i,j,triangle[8][8];  //i代表行 1代表列 
	
	for(i = 0; i < 8; i++)     //将整个二维矩阵内的数字变为1 
		for(j = 0; j < 8; j++)
			triangle[i][j] = 1;
 
	for(i = 2; i < 8; i++) //从第二行开始 
	{
		for(j = 1; j < i; j++) //从第一列开始 
		{	
			triangle[i][j] = triangle[i-1][j]+triangle[i-1][j-1];   
		}
	}
	
	for(i = 0; i < 8; i++)  //控制行 
	{
		for(j = 0; j <= i; j++) //控制列 
			printf("%-4d",triangle[i][j]);
		printf("\n");
	}
 
}

10.冒泡排序

#include 
#include  //传给要被命令处理器执行的主机环境
 
int main()
{
	int a[10] = {5,1,6,9,8,3,4,6,10,7};//待排序整型数组
 
	int temp= 0; //中间变量
 
	//冒泡法排序实现从小到大排序
	for(int i=0;i<10;i++) //进行10次循环
	{
		for(int j=i+1;j<10;j++) //循环比较剩余的变量
		{
			if(a[i] > a[j]) //如果前面一个数比后面数大,交换两个数的值
			{
				temp = a[i];
				a[i] = a[j];
				a[j] = temp;
			}
		}
	}
 
	for(int i=0;i<10;i++) //循环输出排序以后的结果
	{
		printf("%d  ",a[i]);
	}
 
	system("pause");//暂停 
} 

学习C语言必会的十道算法题_第1张图片

你可能感兴趣的:(算法入门到进阶,1024程序员节)