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;
}
}
-
思路:
确定for循环遍历的范围;拆分n位数;判断;输出; -
调试错误原因:
变量初始化错误:变量在哪里定义?是否要有中间变量进行过渡?
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函数
也可用数组