目录
for循环像一个计数循环:设定一个计数器,初始化它,然后在计数器到达峰值之前,重复执行循环体,而每执行一轮循环,计数器以一定步进进行调整,比如加1或者减1
for循环语法:
for (循环变量初始化; 循环条件判断; 循环变量赋值){
循环体
}
整个for循环按以下步骤执行:
int i;
for (i = 1; i <= 5; i++){
printf("%d,", i);
}
printf("\ni=%d",i);
/*执行结果:
1,2,3,4,5,
i=6
*/
Tips for loops
要求程序读取用户输入的一个整数n,并告诉用户这个数是否是素数。素数:只能被1和自己整除的数,不包括1,比如2,3,5,7,11,17,19...
题目分析:
程序如何判断一个数能被另一个数整除?
将两个数做取余运算符,如果结果为0就表示前者能被后者整除。比如4%2=0 ,就表示4能被2整除。
如何判断一个数只能被1和自身整数?
直接一点的方法就是用1到n之间的数去当做取余数,n作为被取余数,两者做取余运算。1到n之间只要有一个数能被整数,那么这个数就不是素数,否则这个数就是一个素数。当一个数为n时超过n的中间值的那个数都不可能对n做整除了,因此我们可以省掉一半的计算,用1至n/2之间的数和n做取余运算即可。
代码实现:
#include <stdio.h>
void main(int argc, char *argv[]) {
int number = 0;
int isPrimeNumber = 1;
int middle = 0;
printf("请输入一个整数:");
scanf("%d", &number);
if(number == 1){
isPrimeNumber = 0;
} else {
int i = 2;
middle = number/2;
for(; i <= middle; i++){
if(number % i == 0){
isPrimeNumber = 0;
break;
}
}
}
if(isPrimeNumber == 1){
printf("数字%d是一个素数", number);
} else {
printf("数字%d不是一个素数", number);
}
}
测试样例:
请输入一个整数:7
数字7是一个素数
--------------------------------
我们如果想知道100以内的素数改怎么办呢?显然我们需要判断2到100的所有整数,如果是素数我们就输出。
让我们一起来把程序改造下。
程序实现:
#include <stdio.h>
void main(int argc, char *argv[]) {
int j = 2;
int i = 2;
int middle = 0;
int isPrimeNumber = 1;
printf("100以内的素数:\n");
for(; j < 100; j++) {
middle = j/2;
isPrimeNumber = 1;
i = 2;
for(; i <= middle; i++){
if(j % i == 0){
isPrimeNumber = 0;
break;
}
}
if(isPrimeNumber == 1){
printf("%d ", j);
}
}
}
运行样例:
100以内的素数:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
--------------------------------
break vs continue
tips:(vs versus 对比)
逻辑运算
短路
** 例子:凑硬币 **
代码实现:
#include <stdio.h>
void main(int argc, char *argv[]) {
void combination()
{
int zs = 20;
int one = 1;
int two = 2;
int five = 5;
for (int x = 1; x <= (zs - two - five) / one; x++)
{
for (int y = 1; y <= (zs - one - five) / two; y++)
{
for (int z = 1; z <= (zs - one - two) / five; z++)
{
if (x * one + y * two + z * five == zs)
{
printf("可以用%d个一角加%d个两角加%d个五角得到2元\n", x, y, z);
}
}
}
}
}
测试样例:
可以用1个一角加2个两角加3个五角得到2元
可以用1个一角加7个两角加1个五角得到2元
可以用2个一角加4个两角加2个五角得到2元
可以用3个一角加1个两角加3个五角得到2元
可以用3个一角加6个两角加1个五角得到2元
可以用4个一角加3个两角加2个五角得到2元
可以用5个一角加5个两角加1个五角得到2元
可以用6个一角加2个两角加2个五角得到2元
可以用7个一角加4个两角加1个五角得到2元
可以用8个一角加1个两角加2个五角得到2元
可以用9个一角加3个两角加1个五角得到2元
可以用11个一角加2个两角加1个五角得到2元
可以用13个一角加1个两角加1个五角得到2元
--------------------------------
如果我们只想得到一个结果怎么做呢?有读者可能会想到在最里面的for循环也就是z所在的for循环加一个break,实际上我们会发现,即使加上了break,运行的结果还是一样,原因就是break只会跳出离他最近的那一个循环,因此我们需要一点小的技巧来处理。
跳出多重循环:
#include <stdio.h>
void main(int argc, char *argv[]) {
{
int zs = 20;
int one = 1;
int two = 2;
int five = 5;
int exist = 0;
for (int x = 1; x <= (zs - two - five) / one; x++)
{
for (int y = 1; y <= (zs - one - five) / two; y++)
{
for (int z = 1; z <= (zs - one - two) / five; z++)
{
if (x * one + y * two + z * five == zs)
{
printf("可以用%d个一角加%d个两角加%d个五角得到2元\n", x, y, z);
exist=1;
break;
}
}
if (exist) {
break;
}
}
if (exist) {
break;
}
}
}
测试样例:
可以用1个一角加2个两角加3个五角得到2元
--------------------------------
tips:我们还可以使用c语言的goto关键词来实现循环的退出,但是goto容易破坏掉程序的顺序结构,因此不推荐使用。
求两个数的最大公约数
辗转相除法
代码实现:
#include <stdio.h>
void main(int argc, char *argv[]) {
{
int a, b;
int t;
a = 12;
b = 18;
while (b != 0)
{
t = a % b;
a = b;
b = t;
}
printf("gcd=%d\n", a);
}
测试样例:
gcd=6
--------------------------------
正序分解整数
题目分析:
#include <stdio.h>
void main(int argc, char *argv[])
{
int x;
printf("请输入一个正整数:");
scanf("%d",&x);
int mask = 1;
int t = x;
while (t >= 10)
{
t /= 10;
mask *= 10;
}
do
{
int d = x / mask;
printf("%d", d);
if (mask >= 10)
{
printf(" ");
}
x %= mask;
mask /= 10;
} while (mask > 0);
printf("\n");
}
测试样例:
请输入一个正整数:13425
1 3 4 2 5
--------------------------------
请输入一个正整数:500000
5 0 0 0 0 0
--------------------------------
1 .题目内容: 题目内容:
我们认为 2 是第一个素数,3 是第二个素数,5 是第三个素数,依次类推。
现在,给定两个整数 n 和 m,0<n<=m<=200,你的程序要计算第 n 个素数到第 m 个素
数之间所有的素数的和,包括第 n 个素数和第 m 个素数。
输入格式:
两个整数,第一个表示 n,第二个表示 m。
输出格式:
一个整数,表示第 n 个素数到第 m 个素数之间所有的素数的和,包括第 n 个素数和第 m
个素数。
输入样例:
2 4
输出样例:
15
题目分析:
程序实现:
#include "sumPrime.h"
void sumPrime()
{
int j = 2;
int i = 2;
int middle = 0;
int isPrimeNumber = 1;
int index = 0;
int sum = 0;
int n, m;
int isCalcRange = 0;//是否计算一个范围内素数的和,如果m==n 只需计算第n 个素数的值即可,因此当且仅当m>n 时此变量值为1
printf("请输入n和m以空格隔开 0<n<=m<200:\n");
scanf("%d %d", &n, &m);
isCalcRange = m > n;
for (; j < 10000; j++)
{
middle = j / 2;
isPrimeNumber = 1;
i = 2;
for (; i <= middle; i++)
{
if (j % i == 0)
{
isPrimeNumber = 0;
break;
}
}
if (isPrimeNumber == 1)
{
index++;
if (index >= n)
{
if (index == m)
{
sum += j;
break;
}
else
{
sum += j;
}
}
}
}
printf("%d\n",sum);
}
测试样例:
请输入n和m以空格隔开 0<n<=m<200:
2 4
15
--------------------------------
请输入n和m以空格隔开 0<n<=m<200:
200 200
1223
--------------------------------
请输入n和m以空格隔开 0<n<=m<200:
1 200
111587
--------------------------------
请输入n和m以空格隔开 0<n<=m<200:
0 0
5736396
--------------------------------
tips:思考下当我们输入两个0时计算的结果是什么?我们改如何改进我们的程序才不会出现这样的情况?
2.题目内容:
你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数
的每一位输出出来。
如输入 1234,则输出:
yi er san si
注意,每个字的拼音之间有一个空格,但是最后的字后面没有空格。当遇到负数时,在输出
的开头加上“fu”,如-2341 输出为:
fu er san si yi
输入格式:
一个整数,范围是[-100000,100000]。
输出格式:
表示这个整数的每一位数字的汉语拼音,每一位数字的拼音之间以空格分隔,末尾没有空格。
输入样例:
-30
输出样例:
fu san ling
题目分析:
#include <stdio.h>
#include "getDigitPinYin.h"
void main(int argc, char *argv[])
{
int x;
int isNegative = 0;
printf("请输入一个整数[-100000,100000]:");
scanf("%d", &x);
if (x < 0)
{
isNegative = 1;
x = -x;
printf("fu ");
}
int mask = 1;
int t = x;
while (t >= 10)
{
t /= 10;
mask *= 10;
}
do
{
int d = x / mask;
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;
default:
printf("unown");
break;
}
if (mask >= 10)
{
printf(" ");
}
x %= mask;
mask /= 10;
} while (mask > 0);
printf("\n");
}
测试样例:
请输入一个整数[-100000,100000]:-30
fu san ling
--------------------------------
请输入一个整数[-100000,100000]:12345
yi er san si wu
--------------------------------
标题:利用循环变量来判断素数不好吗?
内容:
课程中提到有种“聪明”的做法,可以不设 isPrime,直接利用循环出口处循环变量和终点值
的关系来判断循环是否 break 了。你觉得这种做法好吗?
我认为这种做法不可取,有至少以下两点原因:
程序设计入门-C语言基础知识-翁恺-第四周:循环-详细笔记(四)
原文:https://www.cnblogs.com/simple-blog/p/9500959.html