翁恺慕课习题题目&&解析(更新ing)||C语言的一些练习题

一、课程中包含的题目

 01-1. 厘米换算英尺英寸(15)

#include <stdio.h> 
int main(){
	int cm=0;
	scanf("%d",&cm);
	int foot,inch;
	foot=cm/30.48;//int直接要了整数部分 
	//和foot=cm/100/0.3048计算结果不一样,因为除法是只保留整数部分的,就变成1/0.3048 
	inch=(cm/30.48-foot)*12;
	printf("%d %d",foot,inch);
	return 0;
	
}

01-2. 然后是几点(15)

#include <stdio.h> 
int main(){
	int time1=0;//起始时间 
	int time2=0;//流逝的分钟数 
	scanf("%d %d",&time1,&time2);
	int hour=time1/100;	//去掉后两位 11 5
	int minute=hour*60;//小时转换为分钟5*60=300  660
	//要后两位
	int min1=time1%100;//取余30  20
	int min=minute+min1;//小时全部变成分钟 300+30=330  680
	int time;
//时间在同一天也就是说不会出现min-time2<0的情况 
	time=min+time2;//330+110=440  680+110=790
	int hour1=time/60;//440min/60=7h..20  790/60=13h..10
	int minute1=time%60;
	if (hour1<10){
		printf("0%d",hour1);
	}
	else printf("%d",hour1);
	//if else这部分也可以将前两位*100+后两位数得到
	printf("%d",minute1);
	return 0;
}

01-3. 逆序的三位数(10)

#include <stdio.h> 
int main(){
	int z=0;//346
	scanf("%d",&z);
	int a=z/100;//=3..46
	int b=z%100/10; //46/10=4..6 也可以z/10%10=4
	int c=z%100%10; //6 也可以z%10=6
	z=c*100+b*10+a;
	printf("%d",z);
	return 0;
}
//如果用printf("%d%d%d",c,b,a);就会出现007的现象

01-4. BCD解密(10)

十进制的12 = 二进制 0000 1100 = 十六进制 0001 0010 
十六进制 0001 0010(=12) 被当成二进制0001 0010转换为十进制 2+16=18
读入十进制 转换为二进制,把他当作十六进制转换为十进制
BCD数就是十六进制 

#include <stdio.h> 
int main(){
	int N=0;//[0,153]
	scanf("%d",&N);//153/2
	int a[8]={0};
	int i=0; 
	for(i=0;N/2>=0;i++){
		a[i]=N%2;
		if (N/2==0){
//			printf("%d:%d\n",i,a[i]);
			break;
		}
		N=N/2;
//		printf("%d:%d\n",i,a[i]);
	}
	for(i=7;i>=0;i--){
		printf("%d",a[i]);
	}
	
	return 0;
}

01-5. 超速判断(10)

02-1.成绩转换(15)

#include <stdio.h> 
int main(){
	int score;
	scanf("%d",&score);
	int s=score/10;
	switch(s){
        case 10:
		case 9:
			printf("A");
			break;
		case 8:
			printf("B");
			break;
		case 7:
			printf("C");
			break;
		case 6:
			printf("D");
			break;
		default:
			printf("E");
			break;
	}	
	return 0;	
}

02-2.判断一个数字的位数是几?

#include <stdio.h> 
int main(){
	int x=0;
	scanf("%d",&x);
	int n=0;
	n++;
	x/=10;
	while(x>0){
		n++;
		x/=10;
	}
	printf("%d",n);
	return 0;	
}

02-3.猜数游戏1

#include <stdio.h> 
#include <stdlib.h>
#include <time.h> 
int main(){
	int number=0;//计算机随机产生的数 
	srand( (unsigned)time( NULL ) );   //初始化随机数
	number=rand();//rand()会得到一个随机的整数 
	printf("%d\n",number);
	int a=0;//用户输入的数 
	int count=0;//猜的次数 
	do{
		count++;
		printf("请输入你猜的数字:");
		scanf("%d",&a);
		if(number==a) {
			printf("恭喜你猜对了\n");	
		}
		else if(number<a){
			printf("猜大了\n");	
		}		
		else {
			printf("猜小了\n");	
		}
	}while(number!=a);
	printf("%d\n",count);
	return 0;
}

关于随机函数:

c语言中的rand()函数和srand()函数产生随机的整数_c语言rand-CSDN博客https://blog.csdn.net/qin_zhangyongheng/article/details/8033936

利用srand((unsigned int)(time(NULL));产生不可预见的随机序列,

1)首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;

//srand( (unsigned)time( NULL ) ); 

2)然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)

//randNumber=rand();      //这里赋值给了randNumber

3)若需要产生1~100的数字,rand()%100+1就是。

x%n 的结果是 [0,n-1] 的一个整数,例如x%100得到的就是一个100以内的数

02-4.算平均数

#include<stdio.h> 
int main(){
	int number=0;
	int sum=0;
	int count=0;
	while(number!=-1){
		sum+=number;
		count++;
		scanf("%d",&number);
	}
	printf("%d %d %f",sum,count-1,1.0*sum/(count-1));
	return 0;
}

02-5.整数求逆

1、输出逆序是个数时会在前面加0的情况:

解法一:

#include<stdio.h> 
int main(){
	int number;
	scanf("%d",&number);
	int ret=0;
	int x=0;
	while(number>0){
		x=number%10;//算个位 
		printf("%d",x);//如果这样输出的话,除了number是0的情况什么都不输出因为不进入while循环,别的都没问题 
		ret=ret*10+x;//逆序输出时把原数个位往前移一位再加原数前面的那个数 
		number=number/10;//去掉最后一位 
	}
	return 0;
}

解法二:

#include<stdio.h> 
int main(){
	int  number=0;
	scanf("%d",&number);// 7
	int x=0;
	int ret=0;
	while(number>0){
		x=number%10;//算个位 
		ret=ret*10+x;//逆序输出时把原数个位往前移一位再加原数前面的那个数
		number/=10;//去掉最后一位 
	}
	printf("%d",ret);//输出ret,什么情况都会正确
	return 0;
}

2、输出逆序是个数时不会在前面加0的情况:

#include<stdio.h> 
int main(){
	int x;
	scanf("%d",&x);
	int ret=0;
	int digit=0;
	while(x>0){
		digit=x%10;//算个位 
		ret=ret*10+digit;//逆序输出时把原数个位往前移一位再加原数前面的那个数 
		x=x/10;//去掉最后一位 
	}
	printf("%d",ret);
	return 0;
}

02-6.计算阶乘

02-6-1.从1到n的阶乘

解法一、while循环:

#include<stdio.h> 
int main(){
	int n=0;
	scanf("%d",&n);
	int i=1;
	int sum=1;
	while(i<=n){
		sum*=i;
		i++;
	}
	printf("%d!=%d",n,sum);
	return 0;
}

解法二、for循环:

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

02-6-2.从n到1的阶乘

#include<stdio.h> 
int main(){
	int n=0;
	scanf("%d",&n);
	int sum=1;
	for(int i=n;i>=1;i--){
		sum*=i;
	}
	printf("%d!=%d",n,sum);
	return 0;
}
  • 乘积的初始值为1,而不是0。

02-7.判断是不是素数

1不是素数,素数是只能被1和自己整除的数

#include<stdio.h>
int main(){
	int digit=0;
	scanf("%d",&digit);
	int isPrime=1;//是素数
	for(int i=2;i<=digit-1;i++) {
		if(digit%i==0){
			isPrime=0; //能被除1和本身以外的数字整除,不是素数 
			break;
		}
		
	}
	if(isPrime==0||digit==1||digit<=0) printf("%d不是素数",digit);
	else printf("%d是素数",digit);	
	return 0;
}
  • 用一个数的值是1还是0判断是不是素数,而不是用循环变量判断素数

  • 利用循环变量来判断素数为什么不好吗?

       答:声明的变量调用的目的越单一越好,减少多处不同目的的调用造成的错误,也便于阅读理解; 使用循环变量需要在循环出口处再判断,可能执行无意义的循环,多次调用时效率低; isPrime值范围更小便于判断,循环变量和终点值的关系的判断更复杂。

  • 从i=2开始循环直到输入的数字-1结束,直接跳过除以1和本身

02-7-1.输出100以内的素数

#include<stdio.h>
int main(){
	int digit=0;
	for(int digit=2;digit<=100;digit++) {//从2-100进入循环判断是不是素数,因为1不是素数 
		int isPrime=1;//是素数,要放在循环体内,因为要重置重新判断,不是才赋值为0 
		for(int i=2;i<=digit-1;i++) {//判断是否能被整除 
			if(digit%i==0){
				isPrime=0; //能被除1和本身以外的数字整除,不是素数 
				continue;
			}
		}
		if(isPrime==1) printf("%d ",digit);	
	}
	return 0;
}

int isPrime=1;//要放在循环体内,因为要重置重新判断,不是素数才赋值为0 。

02-7-2.输出从2开始的前50个素数

#include<stdio.h>
int main(){
	int digit=2;
	int j=0;
	while(j<=50){
		int isPrime=1;//是素数,要在循环体内,因为要重置重新判断,不是才赋值为0 
		for(int i=2;i<=digit-1;i++) {//判断是否能被整除 
			if(digit%i==0){
				isPrime=0; //能被除1和本身以外的数字整除,不是素数 
				break;//不是素数 ->跳出for循环,不进入下面的if语句(不输出),继续while循环 
			}
		}
		//遇到一个素数时,for循环里不会进入if语句->判断完不是素数,直接进入下一步-> if(isPrime==1) 输出 
		if(isPrime==1) {
			printf("%d ",digit);//是素数 
			j++;
		}
		digit++;//放在前面的话,2就不在范围内 
	}
	return 0;
}
  • 注意j++、digit++、输出素数的位置。

02-8.凑硬币

输入一个小于10的金额,让计算机输出如何用1角、2角、5角凑出这个金额。

#include<stdio.h>
int main(){
	int amount=0;
	scanf("%d",&amount);//3元 30角 
	int one,two,five;
	for(one=1;one<amount*10;one++){
		for(two=1;two<amount*10/2;two++){
			for(five=1;five<amount*10/5;five++){
				if(one+two*2+five*5==amount*10){
					printf("可以用%d个1角、%d个2角%d个5角凑成%d\n",one,two,five,amount);
				}
			}	
		}
	}
	return 0;
}

找到第一种情况就退出所有循环不再继续:

解法一、变换exit的值,查看是否是从最里层循环退出的:

#include<stdio.h>
int main(){
	int amount=0;
	scanf("%d",&amount);//3元 30角 
	int exit=0;
	int one,two,five;
	for(one=1;one<amount*10;one++){
		for(two=1;two<amount*10/2;two++){
			for(five=1;five<amount*10/5;five++){
				if(one+two*2+five*5==amount*10){
					printf("可以用%d个1角、%d个2角%d个5角凑成%d\n",one,two,five,amount);
					exit=1;
					break;//只让他离开了这个循环而进入了下一层循环
				}
			}
			if(exit==1) break;
		}
		if(exit==1) break;
	}
	return 0;
}

    解法二、使用goto从最里层循环退出到最外层循环:

    #include<stdio.h>
    int main(){
    	int amount=0;
    	scanf("%d",&amount);//3元 30角 
    	int one,two,five;
    	for(one=1;one<amount*10;one++){
    		for(two=1;two<amount*10/2;two++){
    			for(five=1;five<amount*10/5;five++){
    				if(one+two*2+five*5==amount*10){
    					printf("可以用%d个1角、%d个2角%d个5角凑成%d\n",one,two,five,amount);
    					goto out; 
    				}
    			}	
    		}
    	}
    out:
    	return 0;
    }

    03-1.求前n和

    03-1.1.上图式子前n项和

    解法一、设置为double型

    #include<stdio.h>
    int main(){
    	int n=0;
    	scanf("%d",&n);
    	double sum=0;
    	for(double i=1;i<=n;i++){
    		sum+=1/i;
    	}
    	printf("%f",sum);
    	return 0;
    }

    解法二、除号两边设置有一个1.0自动转换类型:

    i也可以是int型,这样就会变成:

    • 1.0/i        1.0是浮点数,i是整型,会把i变成浮点数再计算
    #include<stdio.h>
    int main(){
    	int n=0;
    	scanf("%d",&n);
    	double sum=0;
    	for(int i=1;i<=n;i++){
    		sum+=1.0/i;//自动类型转换 当运算符的两边出现不一致的类型时,会自动转换成范围大的类型。
    	}
    	printf("f(%d)=%f\n",n,sum);
    	return 0;
    }

    03-1.2.求上图式子前n项和

    解法一、判断奇偶项改变加减号:

    #include<stdio.h>
    int main(){
    	int n=0;
    	scanf("%d",&n);
    	double sum=0;
    	for(int i=1;i<=n;i++){
    		if(i%2==0){//偶数项是- 
    			sum-=1.0/i; 
    		}
    		else	sum+=1.0/i; 		
    	}
    	printf("f(%d)=%f\n",n,sum);
    	return 0;
    }

    解法二、用sign设定加减:

    #include<stdio.h>
    int main(){
    	int n=0;
    	scanf("%d",&n);
    	double sum=0;
    	int sign=1;
    	for(int i=1;i<=n;i++){
    		sum+=sign*1.0/i;
    		sign=-sign;
    	}
    	printf("f(%d)=%f\n",n,sum);
    	return 0;
    }
    
    也可以将sign定义为double,计算sum的时候就不需要*1.0了
    
    #include<stdio.h>
    int main(){
    	int n=0;
    	scanf("%d",&n);
    	double sum=0;
    	double sign=1;
    	for(int i=1;i<=n;i++){
    		sum+=sign/i;
    		sign=-sign;
    	}
    	printf("f(%d)=%f\n",n,sum);
    	return 0;
    }

    03-2.正序分解整数

    解法一、不适用于700这样的数字:

    #include<stdio.h>
    int main(){
    	int x=0;
    	scanf("%d",&x);//13425
    	//让x倒序
    	int t=0;
    	do{
    		int d=x%10;//d=3  1
    		t=t*10+d;//52431
    		x/=10;//13 1 0
    	}while(x>0);
        x=t;
    	//拆开输出
    	do{
    		int d=x%10;//1
    		printf("%d",d);//1
    		if(x>9){
    			printf(" ");
    		}
    		x/=10;
    	}while(x>0);
    	printf("\n");
    	return 0;
    }

    解法二:

    #include<stdio.h>
    int main(){
    	int x=0;
    	scanf("%d",&x);
    	//看x是几位数
    	int i=0;
    	for(i=10;;i*=10) {
    		if(x/i<1){
    			break;
    		}
    	}
    	i/=10;
    	do{
    		int d=x/i;
    		printf("%d",d);
    		if(i>0){
    			printf(" ");
    		}
    		x=x%i;
    		i/=10;
    	}while(i>0);
    	
    	return 0;
    }

    03-3.逆序分解整数

    800的逆序是“0 0 8”,最后一位后面不输出空格

    #include<stdio.h>
    int main(){
    	int x=0;
    	scanf("%d",&x);//13425
    	do{
    		int d=x%10;
    		printf("%d",d);
    		if(x>=10){
    			printf(" ");
    		}
    		x=x/10;
    	}while(x>0);
    	return 0;
    }

    800的逆序是8而不是008

    #include<stdio.h> 
    int main(){
    	int x=0;
    	scanf("%d",&x);
    	int ret=0;
    	do{
    		int d=x%10;
    		ret=ret*10+d;
    		x=x/10;
    	}while(x>0);
    	printf("%d",ret);
    	
    	return 0;
    }

    在头文件math.h中,调用sqrt函数求平方根,调用pow函数求幂。

    result = pow(10, -2) # 计算10的-次幂次幂,结果为0.01。

    sqrt表示开平方根,计算公式为:若一个非负数x的平方等于a,即x²=a,则这个数x叫做a的非负平方根,表示为sqrt(a)=x

    03-4.求最大公约数

    解法一:枚举

    #include<stdio.h>
    int main(){
    	int a=0;
    	int b=0;
    	scanf("%d %d",&a,&b);
    	//求ab中的最小值 
    	int min=0;
    	if(a>=b){
    		min=b;
    	}
    	else min=a;
    	int t=0;
    	for(int i=1;i<=min;i++){
    		if(a%i==0&&b%i==0){
    			t=i;
    		}
    	}
    	printf("%d和%d的最大公约数是%d",a,b,t);
    	return 0;
    }

    解法二:辗转相除法或者也叫欧几里得演算法

    运作原理:

    如果b==0,计算结束,a就是最大公约数;

    否则,计算a%b,让a等于b,而b等于那个余数,回到第一步。

    动画演示:欧几里得演算法(辗转相除法)_哔哩哔哩_bilibili

    #include<stdio.h>
    int main(){
    	int a=0;
    	int b=0;
    	scanf("%d %d",&a,&b);
    	int t=0;
    	while(b!=0){
    		t=a%b;
    		a=b;
    		b=t;
    	}
    	printf("最大公约数是%d",a);
    	return 0;
    }

    04-0.求给定条件的整数集

    给定一个不超过6的正整数A,考虑从A开始的连续4个数字,请输出所有由他们组成的无重复的3位数。

    while循环:
    #include<stdio.h>
    int main(){
    	int a=0;//2
    	scanf("%d",&a);//2345
    	int i,j,k;
    	i=a;
    	int t=0;
    	while(i<=a+3){
    		j=a;
    		while(j<=a+3){
    			k=a;
    			while(k<=a+3){
    				if(i!=j&&i!=k&&j!=k){
    					printf("%d",i*100+j*10+k);
    					t++;
    					if(t%6==0){
    						printf("\n");
    					}
    					else printf(" ");
    				}
    				k++;
    			}
    			j++;
    		}
    		i++;
    	}
    	return 0;
    }
    
    for循环:
    #include<stdio.h>
    int main(){
    	int a=0;//2
    	scanf("%d",&a);//2345
    	int i,j,k;
    	int t=0;
    	for(i=a;i<=a+3;i++){
    		for(j=a;j<=a+3;j++){
    			for(k=a;k<=a+3;k++){
    				if(i!=j && i!=k && k!=j){					
    					printf("%d",i*100+j*10+k);
    					t++;
    					if(t%6==0){
    						printf("\n");
    					}
    					else printf(" ");
    				}
    			}
    		}
    	}
    	return 0;
    }

    04-1.水仙花数

    #include<stdio.h>
    #include<math.h>
    int main(){
    	int n=0;
    	int sum=0;
    	scanf("%d",&n);
    //	[100,999],1000)
    	int digit=pow(10,n-1);//100
    	for(int number=pow(10,n-1)+1;number<pow(10,n);number++){
    		int num=number;
    		sum=0;
    		do{
    			int d=num/digit;//101/100=1 1/10=0 1/1=1
    			sum+=pow(d,n);//1 +0^3+1^3 
    			num%=digit;//101%100=1 1%10=1 1%1=0
    			digit/=10;//10  1 0
    		}while(digit>=1);
    		digit=pow(10,n-1);//100
    		if(sum==number){
    			printf("%d\n",sum);
    		}
    //		else printf("不是水仙花数\n") ; 
    	}
    	return 0;
    }

    04-2.打印九九口诀表

    输出一个下三角的九九乘法表:

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

    04-3.统计素数求和

    #include<stdio.h>
    int main(){
    	int m=0;
    	int n=0;
    	scanf("%d %d",&m,&n);
    	//判断是不是素数 
    	//4 6 8 9 10,1不是素数,能整除  除了1和本身以外的数
    	//2 3 5 7
    	int j=0;
    	int sum=0;
    	for(int number=m;number<=n;number++) {
    		int isPrime=1;//是素数
    		for(int i=2;i<number;i++){//i<number和i<=number-1都可以,因为只要判断到根号number就可以了,4、9这样的数字也一样 
    			if(number%i==0){//能被1和本身以外的数字整除,不是素数 
    				isPrime=0;//不是素数
    				break;
    			}
    		}
    		if(isPrime==0||number==1){
    			printf("%d不是素数\n",number);
    		}
    		else {
    			printf("%d是素数\n",number);
    			j++;
    			sum+=number; 
    		}
    	}
    	printf("%d %d\n",j,sum);
    	return 0;
    }

    04-4.猜数游戏2

    输入样例:

    58 4
    70
    50
    56
    58
    60
    -2

    输出样例:

    Too big
    Too small
    Too small
    Good Guess!
    #include<stdio.h>
    int main(){
    	int randNumber=0;
    	int n=0;
    	scanf("%d %d",&randNumber,&n); //系统产生的随机数,猜测的最大次数n 
    	int i=0;
    	int digit=1;
    	while(digit>0&&i<=n){
    		scanf("%d",&digit);
    		i++;
    		if(digit>0&&digit>randNumber)	printf("Too big\n");
    		else if(digit>0&&digit<randNumber)	printf("Too small\n");
    		else if(digit>0&&digit==randNumber) break;
    	}
    //	printf("i=%d\n",i);
    	if(digit>0&&i==1)				printf("Bingo!\n");
    	else if(digit>0&&i==2||i==3)		printf("Lucky You!\n");
    	else if(digit>0&&i>73&&i<=n)		printf("Good Guess!\n");
    	else if(digit>0&&i>n)			printf("Game Over\n");
    	else if(i<n&&digit<=0)	printf("Game Over\n");
    	return 0;
    }

    05-0.n项求和

    #include<stdio.h>
    int main(){
    	int n=0;
    	scanf("%d",&n); //系统产生的随机数,猜测的最大次数n 
    	double a=2;//分子
    	double b=1;//分母
    	double sum=0;
    //a	2 3 5 
    //b	1 2 3
    //t	2 3 5
    	for(int i=0;i<n;i++){
    		sum+=a/b;
    		double t=a;
    		a=a+b;
    		b=t;
    	}
    	printf("%.2f",sum);
    	return 0;
    }

    05-1.约分最简分式

    输出样例 

    1/2

    解法一、枚举求最大公约数:

    #include<stdio.h>
    int main(){
    	int a=0;//分子
    	int b=0;//分母
    	scanf("%d/%d",&a,&b);
    	//a和b的求最大公约数
    	//法一、枚举:
    	int min=0;
    	if(a<b)	min=a;
    	else min=b;
    	int num;//公约数
    	for(int i=1;i<=min;i++){
    		if(a%i==0&&b%i==0){
    			num=i;
    		}
    	}
    	//num是最大公约数
    	a/=num;
    	b/=num;
    	
    	printf("num=%d,a/b=%d/%d",num,a,b);
    	return 0;
    }
    

    解法二、用辗转相除法求最大公约数

    #include<stdio.h>
    int main(){
    	int a=0;//分子
    	int b=0;//分母
    	scanf("%d/%d",&a,&b);
    	int c=a;
    	int d=b;
    	while(b!=0){
    		int t=a%b;
    		a=b;
    		b=t;
    	}
    	c/=a;
    	d/=a;
    	printf("%d/%d",c,d);
    	
    	return 0;
    }
    

    05-2念数字

    #include<stdio.h>
    int main(){
    	int number=0;
    	scanf("%d",&number);
    	//如果是负数,提前输出负号,然后变为正数
    	
    	if(number<0) {
    		printf("fu ");
    		number=-number;
    	}
    	//判断number是几位数
    	int i=10;
    	for(;number/i>=1;i*=10){
    	}
    	i=i/10;
    //	printf("%d",i);//1000
    	
    	//正序拆开 一位一位循环
    	for(int j=i;j>=1;j/=10){//1000 100 10 1 0
    		int d=number/j;//最高位 d=1234/1000=1 234/100=2 34/10=3 4/1=4
    		number%=j;//number=1234%1000=234 234%100=34 34%10=4 4%1=0
    //		printf("%d",d);//1234
    		switch(d){
    			case 0:printf("ling");break;
    			case 1:printf("yi");break;
    			case 2:printf("er");break;
    			case 3:printf("san");break;
    			case 4:printf("si");break;
    			case 5:printf("wu");break;
    			case 6:printf("liu");break;
    			case 7:printf("qi");break;
    			case 8:printf("ba");break;
    			default:printf("jiu");break;//9
    		}
    		if(j!=1)	printf(" ");//不是最后一位
    	}
    	
    	return 0;
    }
    

    05-3求a的连续和

    #include<stdio.h>
    int main(){
    	int a=0;
    	int n=0;
    	scanf("%d %d",&a,&n);//2 4
    	int sum=0;
    	int t=a;//t=2
    	for(int i=1;i<=n;i++){//i=1 2 3 4
    		sum+=t;//sum=2+22+
    		t=t*10+a;//t=22 222
    	}
    	printf("%d",sum);
    	return 0;
    }

    开始学习函数

    06-1计算圆柱的体积

    输入圆柱的高和半径,求原著的体积volume=Π*r^2*h,要求定义和调用函数cylinder(r,h)计算圆柱的体积。

    #include<stdio.h>
    #define PI 3.1415926
    double cylinder(double r,double h){
    	double volume; 
    	volume=PI*r*r*h;
    	return volume;
    }
    int main(){
    	double r,h;
    	scanf("%lf %lf",&r,&h);
    	double volume=cylinder(r,h);
    	printf("%.3f",volume);
    	return 0;
    }
    

    06-2判断n是否是完全平方数

    #include<stdio.h>
    int IsSquare(int n) {
    	//若n是完全平方数,则存在正整数m,使得m^2=n ,也有n=1+3+5+...+(2m-1)
    	for(int i=1;n>0;i+=2){
    		n=n-i;
    	}//25=1+3+5+7+9+11
    	if(n==0)	return 1;//是完全平方数 
    	else return 0;//不是完全平方数 
    	
    }
     
    int main(){
    	int n=0;
    	scanf("%d",&n);
    	if(IsSquare(n)==1)	printf("是");
    	else printf("不是") ;
    	return 0;
    }

    06-3采用辗转相除法求最大公约数

    定义函数gcd(int m,int n),计算m和n的最大公约数。

    #include<stdio.h>
    int gcd (int m,int n) {
    //  m   n
    //	30 36 30%36=30
    //  36 30
    	while(n!=0){
    		int t=m%n;
    		m=n;
    		n=t;
    	}
    	return m;
    }
    int main(){
    	int numerator,denominator;//分子 分母
    	scanf("%d %d",&numerator,&denominator);
    	int a=gcd(numerator,denominator);
    	printf("%d",a);
    	return 0;
    }
    

    06-4数字金字塔

    输入一个整数n,输出如下金字塔型的数字。金字塔样式如下:

    #include<stdio.h>
    void pyramid(int n){
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n-i;j++){
    			printf(" ");
    		}
    		for(int k=1;k<=i;k++){
    			printf("%d ",i);
    		}
    		printf("\n");
    	}
    }
    int main(){
    	int n;
    	scanf("%d",&n);
    	pyramid(n);
    	
    	return 0;
    }
    

    06-5复数运算

    分别输入两个复数的实部与虚部,用函数实现计算两个复数之和与之积。

    c1=x1+y1*i,c2=x2+y2*i,

    则:c1+c2=(x1+x2)+(y1+y2)i;c1*c2=(x1*x2-y1*y2)+(x1*y2+x2*y1)i,代码如下

    #include<stdio.h>
    double add(double x1,double y1,double x2,double y2){
    	double x=x1+x2;
    	double y=y1+y2;
    	printf("addition is %f+%fi\n",x,y);
    	return 0;
    }
    double prod(double x1,double y1,double x2,double y2){
    	double x=x1*x2-y1*y2;
    	double y=x1*y2+x2*y1;
    	printf("product is %f+%fi\n",x,y);
    }
    
    int main(){
    	double x1,x2,y1,y2;
    //	double c1=x1+y1*i;
    //	double c2=x2+y2*i;
    	scanf("%lf %lf",&x1,&y1);
    	scanf("%lf %lf",&x2,&y2);
    	add(x1,y1,x2,y2);
    	prod(x1,y1,x2,y2);
    	
    	return 0;
    }
    

    开始学习数组

    07-1输出所有大于平均值的数

    07-2判断素数

    之前的判断一个数x是否是素数,要从2~n-1,依次遍历,看是否有除了1和本身以外的数能被整除,这样的循环要循环n-1遍

    现在可以一次性判断n个数字是否是素数,先将1、偶数(能被2整除)判断为不是素数;再从3开始每次+2,到sqrt(x)判断,剩下的奇数能否被除1和本身以外的数整除。

    也可以用已经得到的素数,判断新的x是否是素数。适合用于正在构造素数表的同时使用。例如求前一百个素数,初始化数组只有一个素数2,然后从3开始判断是否是素数。

    题目:输出前100个素数(用已经得到的素数,判断新的x是否是素数。)

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #define Number 100
    int isPrime(int x, int arr[], int count) {
    	int ret = 1;//是素数
    	for (int i = 0; i < count; i++) {
    		if (x % arr[i] == 0) {
    			ret = 0;//不是素数
    			break;
    		}
    	}
    
    	return ret;
    }
    int main() {
    	int arr[Number] = { 2 };//其余元素初始值=0
    	int count = 1;//下标
    	int x = 3;//需要判断的数
    	//调试
    	//{
    	//	int i;
    	//	printf("\t");
    	//	//输出下标
    	//	for (i = 0; i < Number; i++) {
    	//		printf("%d\t", i);
    	//	}
    	//	printf("\n");
    	//}
    	
    	while (count < Number) {//0~99 就是100个
    		if (isPrime(x, arr, count)) {
    			arr[count++] = x;//count先输出 后++ 
    		}
    		//调试代码
    	/*	{
    			printf("x=%d \t", x);
    			int i;
    			for (i = 0; i < Number; i++) {
    				printf("%d\t", arr[i]);
    			}
    			printf("count=%d\t",count);
    			printf("\n");
    		}*/
    		x++;
    	}
    	//输出
    	for (int i = 0; i < Number; i++) {
    		printf("%d", arr[i]);
    		if ((i + 1) % 5)	printf("\t");
    		else printf("\n");
    	}
    	return 0;
    }

    还有更进一步的优先算法来判断素数——欧拉筛

    构造n以内(不含n)的素数表:

    • 开辟prime[n],里面只有0或1,依次表示不是素数、是素数;下标表示数。初始化所有元素为1。
    • 令x=2,若x是素数,则对(i=2;x * i < n ;i++)令prime[x * i] = 0 //以i++的形式将x的倍数筛出是素数的范围。
    • 令x++,若x<n,重复上一步,否则结束。

    可以只用一个数组解决,不需要用函数

    #include <stdio.h>
    #define Number 25
    int main() {
    	int prime[Number];
    	//初始化
    	for (int i = 0; i < Number; i++) {
    		prime[i] = 1;//假设都是素数
    	}
    	//{1,1,/1,1,1,1,1,1,1,1,1 ,1 ,1 ,1,1}
    	// 0 1 /2 3 4 5 6 7 8 9 10 11 12 13
    	int x = 2;
    	while (x < Number) {
    		if (prime[x]) {
    			for (int i = 2; x * i < Number; i++) {//i是倍数,将x的i倍赋值为0
    				prime[x * i] = 0;
    			}
    		}
    		x++;
    	}
    	for (int i = 2; i < Number; i++) {
    		if (prime[i])	printf("%d ",i);
    	}
    	return 0;
    }

      ### 翁恺 C语言 第一周 练习题 翁恺的C语言程第一周练习题主要围绕基础语法和简单程序设计展开,通常包括以下几类问题:输入输出操作、基本运算符使用、条件语句以及简单的循环结构。以下是根据程内容推测的第一周练习题类型及示例[^1]。 #### 示例题目 1:计算圆的面积 编写一个程序,要求用户输入圆的半径,然后计算并输出圆的面积。 公式为:`面积 = π * 半径^2`,其中π取3.14159。 ```c #include <stdio.h> int main() { double radius, area; printf("请输入圆的半径:"); scanf("%lf", &radius); area = 3.14159 * radius * radius; printf("圆的面积为:%.2f\n", area); return 0; } ``` #### 示例题目 2:判断奇偶数 编写一个程序,要求用户输入一个整数,然后判断并输出该数是奇数还是偶数。 ```c #include <stdio.h> int main() { int num; printf("请输入一个整数:"); scanf("%d", &num); if (num % 2 == 0) { printf("这是一个偶数。\n"); } else { printf("这是一个奇数。\n"); } return 0; } ``` #### 示例题目 3:温度转换 编写一个程序,要求用户输入一个华氏温度值,将其转换为摄氏温度并输出。 公式为:`摄氏温度 = (华氏温度 - 32) * 5 / 9`。 ```c #include <stdio.h> int main() { double fahrenheit, celsius; printf("请输入华氏温度:"); scanf("%lf", &fahrenheit); celsius = (fahrenheit - 32) * 5 / 9; printf("对应的摄氏温度为:%.2f\n", celsius); return 0; } ``` #### 示例题目 4:两个数的比较 编写一个程序,要求用户输入两个整数,然后比较并输出较大的那个数。 ```c #include <stdio.h> int main() { int a, b; printf("请输入两个整数:"); scanf("%d%d", &a, &b); if (a > b) { printf("较大的数是:%d\n", a); } else { printf("较大的数是:%d\n", b); } return 0; } ``` #### 示例题目 5:交换两个变量的值 编写一个程序,要求用户输入两个整数,然后交换它们的值并输出。 ```c #include <stdio.h> int main() { int a, b, temp; printf("请输入两个整数:"); scanf("%d%d", &a, &b); temp = a; a = b; b = temp; printf("交换后的值为:a=%d, b=%d\n", a, b); return 0; } ``` --- ###
      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

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

      抵扣说明:

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

      余额充值