c语言打印水仙花数及拓展



水仙花数是指一个三位数,其各位数字的立方和确好等于该数本身,如;153=1+5+3,则153是一个“水仙花数”。指一N位数,其各个数之N次方和等于该数。例如153、370、371及407就是三位数的水仙花数,其各个数之立方和等于该数。严格来说,水仙花数指三位数的三次幂各数字的3次方之和等于其本身。以下介绍了如何打印水仙花数及n位数的求解方法。
 首先介绍课本上的方法:

//打印水仙花数

#include <stdio.h>
int main()
{ int i,j,k,n;
printf("水仙花数:",n);

 for(n=100;n<1000;n++)
 { i=n/100;
 j=( n/10)%10;
  k=n%10;
   if(n==i*i*i+j*j*j+k*k*k)
    printf("%d ",n); }
return 0; }
利用该方法打印四叶玫瑰数的样例如下:
//打印四叶玫瑰数

#include <stdio.h>
int main()
{ int i,j,k,m,n;
printf("四叶玫瑰数:");
for(n=1000;n<10000;n++)
 { i=n/1000;
 j=n/100%10;
  k=n/10%10;
  m= n%10;
   if(n==i*i*i*i+j*j*j*j+k*k*k*k+m*m*m*m)
    printf("%d ",n); }
return 0; }

这种方法简单易懂,但是当n值较大时步骤更为繁琐。在此介绍两种相对简单的求解步骤:
//1.打印水仙花数

#include <stdio.h>
int main( )
{
     int i,k,n,sum;
     printf("水仙花数:");
     for(i=100;i<1000;i++)
     {
          for(sum=0,k=i;k;k/=10)
          {
               n=k%10;
               sum+=n*n*n;
          }
          if(i==sum) printf("%d ",i);
     }
return 0;
}

由此可知求解四叶玫瑰数可写为:
//1.打印四叶玫瑰数
#include <stdio.h>
int main( )
{
     int i,k,n,sum;
     printf("四叶玫瑰数:");
     for(i=1000;i<10000;i++)
     {
          for(sum=0,k=i;k;k/=10)
          {
               n=k%10;
               sum+=n*n*n*n;
          }
          if(i==sum) printf("%d ",i);
     }
return 0;
}

这种算法省去了逐个求解的步骤,较为方便。求五角星数等只需改变循环条件和n次幂即可。再介绍另一种求解步骤。

//2.打印水仙花数

#include <stdio.h>
#include <math.h>
int main()
{ int i,m,sum;
printf("水仙花数:");
for(i=100;i<1000;i++)
 { sum=0;
    m=i;
 do {        sum=sum+pow(m%10,3);//pow(a,b)是指a的b次幂是double型的
 m=m/10; } while(m!=0);
 if(sum==i)
 printf("%d ",i); }
  return 0; }

由此可有
//2.打印四叶玫瑰数
#include <stdio.h>
#include <math.h>
int main()
{ int i,m,sum;
printf("四叶玫瑰数:");
for(i=1000;i<10000;i++)
 { sum=0;
    m=i;
 do {  sum=sum+pow(m%10,4);
 m=m/10; } while(m!=0);
 if(sum==i)
 printf("%d ",i); }
  return 0; }

当要打印五角星数,六合数时也是只需改变循环条件及几次幂即可。这两种可以作为求解n位数的自幂数的求解框架,根据个人喜欢套用即可。哈哈哈哈,是不是很好用捏。要是有什么不明白的,欢迎评论咨询哟。


以下是用 Dev - C++(支持 C 语言或 C++ 编译)完成这些题目的代码实现,涵盖 C 语言 版本(部分题目用 C++ 特性更方便的会用 C++ ,也可调整为纯 C ),按题目顺序逐一编写: 题目 1:计算双层生日蛋糕黄油体积(C 语言) c #include <stdio.h> #define PI 3.14159 // 圆柱体积公式:底面积×高(深度),双层则×2 int main() { double r, h, volume; printf("请输入黄油半径 r 和深度 h:"); scanf("%lf %lf", &r, &h); volume = 2 * PI * r * r * h; // 双层,两个圆柱体积相加 printf("双层蛋糕黄油体积为:%.2lf\n", volume); return 0; }   题目 2:解一元二次方程(C 语言,用  math.h  处理开根号 ) c #include <stdio.h> #include <math.h> int main() { double a, b, c, delta, x1, x2; printf("请输入方程系 a、b、c:"); scanf("%lf %lf %lf", &a, &b, &c); delta = b * b - 4 * a * c; // 判别式 if (a == 0) { printf("不是二次方程,a 不能为 0!\n"); } else if (delta > 0) { x1 = (-b + sqrt(delta)) / (2 * a); x2 = (-b - sqrt(delta)) / (2 * a); printf("两个不同实根:x1=%.2lf,x2=%.2lf\n", x1, x2); } else if (delta == 0) { x1 = -b / (2 * a); printf("一个实根(重根):x=%.2lf\n", x1); } else { printf("无实根,有复根(需拓展运算才能显示)\n"); } return 0; }   题目 3:6 人报找报 3000 的人(C 语言,取余简化循环 ) c #include <stdio.h> int main() { // 总人 6,报到 3000,(3000 - 1) % 6 得索引,+1 对应第 n 个人 int person = (3000 - 1) % 6 + 1; printf("报 3000 的是第 %d 个人\n", person); return 0; }   题目 4:判断整不能被 3、5、7 整除(C 语言 ) c #include <stdio.h> int main() { int num; printf("请输入一个:"); scanf("%d", &num); if (num % 3 != 0 && num % 5 != 0 && num % 7 != 0) { printf("%d 不能被 3、5、7 中的任何一个整除\n", num); } else { printf("%d 能被 3、5、7 中至少一个整除\n", num); } return 0; }   题目 5:循环输出字母图形(C 语言,利用 ASCII 码 + 循环控制 ) c #include <stdio.h> int main() { for (int i = 0; i < 7; i++) { // 共 7 行 char start = 'A' + i; // 每行起始字母 for (int j = 0; j < 7; j++) { // 超过 'G' 则循环回 'A',用 % 7 控制 printf("%c ", (start + j - 'A') % 7 + 'A'); } printf("\n"); } return 0; }   题目 6:计算 100! 末尾 0 的个(C 语言,统计因 5 的个 ) c #include <stdio.h> int main() { int count = 0; for (int i = 5; i <= 100; i += 5) { int temp = i; while (temp % 5 == 0) { // 处理含多个 5 因(如 25=5×5) count++; temp /= 5; } } printf("100! 末尾 0 的个:%d\n", count); return 0; }   题目 7:计算 1! + 2! +... + n!(C 语言,n 范围 3 - 20 ) c #include <stdio.h> // 单独写阶乘函 long long factorial(int n) { long long res = 1; for (int i = 1; i <= n; i++) { res *= i; } return res; } int main() { int n; long long sum = 0; printf("请输入 3 - 20 之间的 n:"); scanf("%d", &n); if (n < 3 || n > 20) { printf("n 超出范围!\n"); return 0; } for (int i = 1; i <= n; i++) { sum += factorial(i); } printf("1! + 2! +... + %d! = %lld\n", n, sum); return 0; }   题目 8:猜字游戏(C 语言,用  rand()  生成随机 ,需加  stdlib.h   time.h  ) c #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand((unsigned int)time(NULL)); // 初始化随机种子 int target = rand() % 10 + 1; // 生成 1 - 10 的随机 int guess, count = 0; printf("猜字游戏开始!字在 1 - 10 之间\n"); do { printf("请输入猜测字:"); scanf("%d", &guess); count++; if (guess > target) { printf("猜大了,继续猜~\n"); } else if (guess < target) { printf("猜小了,继续猜~\n"); } } while (guess != target); printf("恭喜猜对!共猜了 %d 次\n", count); return 0; }   题目 9:4 位整逆序(C 语言,函实现 ) c #include <stdio.h> // 定义逆序函 int fun(int n) { int reverse = 0; while (n > 0) { reverse = reverse * 10 + n % 10; n /= 10; } return reverse; } int main() { int n; printf("请输入一个 4 位正整:"); scanf("%d", &n); if (n < 1000 || n > 9999) { printf("不是 4 位正整!\n"); return 0; } printf("逆序为:%d\n", fun(n)); return 0; }   题目 10:输出水仙花(C 语言,遍历三位判断 ) c #include <stdio.h> // 立方函,也可用 pow ,但整运算更高效 int cube(int digit) { return digit * digit * digit; } int main() { printf("水仙花有:"); for (int num = 100; num < 1000; num++) { int百位 = num / 100; int十位 = (num / 10) % 10; int个位 = num % 10; if (cube(百位) + cube(十位) + cube(个位) == num) { printf("%d ", num); } } printf("\n"); return 0; }   题目 11:分解质因(C 语言,循环除质 ) c #include <stdio.h> int main() { int num; printf("请输入一个正整:"); scanf("%d", &num); printf("%d = ", num); for (int i = 2; i <= num; i++) { while (num % i == 0) { printf("%d", i); num /= i; if (num != 1) { printf("*"); } } } printf("\n"); return 0; }   题目 12:计算  s = a + aa + aaa +... (C 语言,构造每一项累加 ) c #include <stdio.h> int main() { int a, n; // a 是字,n 是项(题目没说项,这里假设用户输入 n ,也可按固定逻辑改) printf("请输入字 a(1 - 9)和项 n:"); scanf("%d %d", &a, &n); long long sum = 0, term = 0; for (int i = 0; i < n; i++) { term = term * 10 + a; // 构造每一项(如 a, aa, aaa...) sum += term; } printf("s = %lld\n", sum); return 0; }   题目 13:猴子吃桃问题(C 语言,逆推法 ) c #include <stdio.h> int main() { int day = 10, peach = 1; // 第 10 天剩 1 个,逆推 for (int i = 9; i >= 1; i--) { peach = (peach + 1) * 2; // 前一天桃子 = (后一天 +1)×2 } printf("第一天摘了 %d 个桃子\n", peach); return 0; }   题目 14:判断位并逆序输出(C 语言,用循环取余 / 除 ) c #include <stdio.h> int main() { int num, digitCount = 0, temp; printf("请输入一个不多于 5 位的正整:"); scanf("%d", &num); temp = num; // 统计位 while (temp > 0) { digitCount++; temp /= 10; } printf("它是 %d 位\n", digitCount); // 逆序输出 printf("逆序字:"); temp = num; while (temp > 0) { printf("%d", temp % 10); temp /= 10; } printf("\n"); return 0; }   题目 15:对 10排序(C 语言,用简单选择排序演示 ,也可用  qsort  ) c #include <stdio.h> // 选择排序函 void sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { int minIndex = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } // 交换 int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } } int main() { int arr[10]; printf("请输入 10 个整:"); for (int i = 0; i < 10; i++) { scanf("%d", &arr[i]); } sort(arr, 10); printf("排序后:"); for (int i = 0; i < 10; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }   题目 16:打印杨辉三角(C 语言,二维组存储 ) c #include <stdio.h> // 杨辉三角行 #define ROWS 10 int main() { int triangle[ROWS][ROWS] = {0}; // 初始化杨辉三角 for (int i = 0; i < ROWS; i++) { triangle[i][0] = 1; triangle[i][i] = 1; for (int j = 1; j < i; j++) { triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j]; } } // 打印 for (int i = 0; i < ROWS; i++) { for (int j = 0; j <= i; j++) { printf("%d ", triangle[i][j]); } printf("\n"); } return 0; }   题目 17:1、2、3、4 组成无重复三位(C 语言,三重循环枚举 ) c #include <stdio.h> int main() { int count = 0; printf("能组成的三位:"); // 百位、十位、个位分别枚举 for (int a = 1; a <= 4; a++) { for (int b = 1; b <= 4; b++) { for (int c = 1; c <= 4; c++) { if (a != b && a != c && b != c) { printf("%d%d%d ", a, b, c); count++; } } } } printf("\n共 %d 个\n", count); return 0; }   使用说明 1. 打开 Dev - C++ ,新建  .c  或  .cpp  文件(上述代码是 C 语言为主,存为  .c  更合适 )。 2. 将对应题目代码复制进去,点击 “运行”/“编译运行” 即可测试。 3. 若题目有输入,按提示输入据,观察输出是否符合逻辑。 生成所有C语言程序流程图
最新发布
07-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值