C语言上机课for嵌套和循环算法题目

1-利用for嵌套证明哥德巴赫的猜想

题目:

哥德巴赫猜想中写到,一个充分大的偶数(大于等于4),它可以分解为两个素数(质数)的和。

任务是将输入的偶数n ,分解为两个素数的所有可能打印出来。

例如:

8 = 3 + 5.

20 = 3 + 17  20 = 7 + 13. 

42 = 5 + 37  40= 11 + 31  40= 13 + 29  40= 19 + 23.

先分解成c=a+b;在依次对a和b进行判断是否是质数,如果同时是质数,就打印。

一个数是否是质数,就是一个数只能被1和它自身整除,没有其他因子。就需要尝试它能否被从2到它的平方根之间的数整除。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/qq_34660409/article/details/80245719

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
void main()
{
	long m, n, num, i, j;//num=m+n,num>=6&&num为偶数
	scanf("%ld",&num);
	for (m = 3; m <= num / 2; m += 2)//c=a+b,那么,其中的一个数必定奇数,直接m=3开始我们的循环
	{
		for (i = 2; i <= sqrt(m); i++)//判断拆分出来c=m+n;,m质数的判断
			if (m % i == 0)break;
		if (i > sqrt(m))
		{
			n = num - m;//n是否为质数的判断
			for (j = 2; j <= sqrt(n); j++)
				if (n % j == 0)
					break;
			if (j > sqrt(n))
				printf("%ld=%ld+%ld\n",num,m,n);

		}
	}
}

这里打印的数是num=m+n>=6的偶数

运行结果如下:

2-水仙花问题

该数本身等于个位数,十位数,百位数的立方之和

类如:153=1*3+5*3+3*3

153=1+125+27;

这是经典的水仙花问题

分析题目,得到方法1:

输入一个数字num

百位数a=num/100;

十位数b=num/10%10;

个位数c=num/10;

num=a*3+b*3+c*3;判断是否满足

void main()
{
	int num, a, b, c;//a为百位数,b为十位数,c为个位数
	scanf("%d",&num);
	a = num / 100;
	b = num / 10 % 10;
	c = num % 10;
	
	if (num == a * a * a + b * b * b + c * c * c)
	{
		printf("yes,num=%d,%d=%d+%d+%d\n", num, num, a, b, c);
	}
	else
		printf("NO\n,a=%d,b=%d,c=%d",a,b,c);
}

初始代码想法与编程的实现,下一步我们需要用for循环来寻找100--999的三位数中的所有满足“水仙花”的数字

只需改变num用于循环的判断,设定条件100-999;

2.还需要把else 给删去;(程序中不是满足的条件就直接不要,不然信息太多了)

代码的实现如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void main()
{
	int num, a, b, c;

	for (num = 100; num<= 999; num++)
	{//a为百位数,b为十位数,c为个位数

		a = num / 100;
		b = num / 10 % 10;
		c = num % 10;
		
		if (num == a * a * a + b * b * b + c * c * c)
		{

			printf("yes,num=%d,%d=%d+%d+%d\n", num, num, a, b, c);
		}

	}
			

}

运行结果如下:

4-利用for循环嵌套打印菱形

问题分析:

实际输出的效果用“*”组成我们的菱形

需要用两个for循环

第一个for循环为外循环代表行数,第二个for循环为内循环打印的“*”的个数;

由菱形图案可知:

(图先欠着)

行数

1                       *

2                      ***

3                     *****

4                    ******* 

可得到设i为行数,j为打印的个数

i,j=i*2-1;    

并且每打完一行,需要换行。

由此可得,初步设想

void main()
{
	 int i, j;
	 for(i=1;i<=10;i++)
	 {
		 for (j = 1; j <= i * 2 - 1; j++)
		 {
			 printf("*");
		 }
		     printf("\n");
	 }

}

附上运行结果

                                                                  

我们这时候只打印了4分之一个图像。

第二步:

那我们此时需要在加入一个for来去输出printf(" ")( 空格)

第一

弄出位子打印空格

第二

打印*

第三

换行

下半部分

我们需要for去改变一些

改变m的值

m为m=10;m>=1;m--

运行结果如下:

如果大家喜欢就多多点赞,谢谢了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值