C语言编程笔记

C语言编程笔记

5/24 翁恺b站C语言习题 编程笔记


题1:水仙花数

在这里插入图片描述

#include <stdio.h>
int main()
{ int n;
  int x=1;
  int k;
  scanf("%d",&n);
  for (int i=1;i<n;i++)
    {x=x*10; 
    }
  
  int w=x*10;
  for (int j=x;j<w;j++)
    {int ex=j;
     int sum=0;
     x=w/10;
     while(x>0 && j>0)
         {int mid=1;
          k=j/x;
          j=j%x;
          for (int count=1;count<=n;count++)
            { mid*=k;
	        }
	      sum+=mid; 
	      x=x/10;
         };
    
    if (sum==ex)
      { printf("%d\n",sum);
	  }
	
	j=ex;
   }
}

  1. 思路:
    确定for循环遍历的范围;拆分n位数;判断;输出;

  2. 调试错误原因:
    变量初始化错误:变量在哪里定义?是否要有中间变量进行过渡?
    while语句的判断是否全面?

下面展示 参考代码

#include <stdio.h>
int main()
{  int n;
   scanf("%d",&n);
   int i=1;
   int first=1;
   while(i<n)
     {first*=10;
     i++;
	 }
	i=first;
	while(i<first*10)
	{int t=i;
	 int sum=0;
	 
	 do {
	 	int d=t%10;
	 	t/=10;
	 	int p=d;
	 	int j=1;
	 	while(j<n)
	 	  {p*=d;
	 	   j++;
		 }
	    sum+=p;
	 }while(t>0);
	 
	 if(sum==i)
	   {printf("%d\n",i);
	   }
	 i++;
	}
   
}


题2:给定条件的整数集

在这里插入图片描述

#include <stdio.h>
int main()
{   int a;
    int x=0;
    int num=0;
	scanf("%d",&a);
	int b=a+3;
	for (int i=a;i<=b;i++)
	{for (int j=a; j<=b;j++)
	    { for (int w=a;w<=b;w++)
	       {if (i!=j && j!=w && i!=w)
	           {x=i*100+j*10+w;  // or printf("%d%d%d",i,j,w)  we often use  i,j,k as varieties 
	           num=num+1;
	           printf("%d ",x);
			   if (num%6==0)
	             printf("\n"); //to avoid a tap at the final of a line  
				               //you can change the code to---- if(num==6){printf('\n';num=0;}else{printf(' ')} 
			   }
	        else 
	           continue;
		   }
		}
	 }	 
} 

// ifs 
// count to control enter
//pay attention to {} ,# and ; !!! 
  • 思路: if 的三重嵌套 ;用num计数换行输出

题3:打印九九乘法表

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

题4:统计素数并求和

在这里插入图片描述

#include <stdio.h>
#include <math.h>
int main()
{ int m,n;
  int num=0;
  int sum=0;
  scanf("%d %d",&m,&n);
  int i=m;
  while(i<=n)
    {int k=int(sqrt(i*1.0));
     int isprime=1;
	 for (int j=2;j<=k;j++)
	    { if (i%j==0)
	        {isprime=0;
			} 
		}
		if (isprime==1)
		  { num+=1;
		    sum+=i;
		  }
	 i++;
	}
	printf("%d %d",num,sum);
}
  • 根据测试,有bug:当m=1时,即判断素数时 应当将“1”单独判断;
    故参考程序为:

参考程序

#include <stdio.h>
int main()
{
	int m,n;
	int i;
	int cnt=0;
	int sum=0;
	
	scanf("%d %d",&m,&n);
	if (m==1)
	  m=2;
	for (i=m;i<=n;i++) {
		int isPrime=1;
		int k;
		for(k=2;k<i-1;k++){
			if(i%k==0){
				isPrime = 0;
				break;
			}
		}
		if (isPrime){
			cnt++;
			sum+=i;
		}
		   
	} 
	printf("%d %d\n",cnt,sum);
	return 0;
}

题5:求序列n项和
在这里插入图片描述

注意:计算结果不超过双精度范围:

#include<stdio.h>
int main()
{
	int n;
	double sum=0.0;
	double x=1;
	double y=2;
	int k;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		sum+=y/x;
		k=x;
		x=y;
		y+=k;
		
	}
	printf("%.2f\n",sum);
 } 
  • 注意点:
    分子分母均为整数,“/”表达为商的取证
    故:用double 定义x与y ,则除法结果为浮点数

题6:约分最简分式

#include <stdio.h>
int main()
{ int m,n;
  int r;
  scanf("%d/%d",&m,&n);
  int up=m;
  int down=n;
  if(m<n){
  	int i=m;
  	m=n;
  	n=i;
  }
  do{
  	r=m%n;
  	m=n;
  	n=r;
  }while(r!=0);
  printf("%d/%d",up/m,down/m);
}
  • 辗转相除法:
    r=m%n; m=n; n=r; r=0? ; 最大公约数为 m;

题7:念数字

#include <stdio.h>
int main()
{
	int m;
	scanf("%d",&m);
	if (m<0)
	{printf("fu "); 
	 m=-m;
	}
	int count=1;
	int t=m;
	while(t>9){
		t/=10;
		count*=10;
	}
	do{
		int d=m/count;
		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;
		case 9:printf("jiu");break;
		} 
	    if (m>9) {
		   printf(" ");
		}
	    m%=count;
	    count/=10;
	}while(count>0);
	printf("\n");
	
}
  • 拆分数字
  • switch-case函数
    也可用数组

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值