2020/5/10 C语言——循环控制
循环控制
判断素数
#include<stdio.h>
int main(){
int x;
int i=2;
int isprime=1;//必须初始化1
scanf("%d", &x);
for( i=2; i<x; i++){
if( x%i == 0){
isprime = 0;
break;
}
}
if(isprime==0){
printf("不是素数");
}else{
printf("是素数");
}
return 0;
}
/*if(x<i){
printf("不是素数");
}else{
printf("是素数");
}*/
多重循环
一、输出100以内的素数
#include<stdio.h>
int main(){
int x;
for( x=2; x<100; x++){
int i;
int isprime=1;
for( i=2; i<x; i++){
if(x % i == 0){
isprime = 0;
break;
}
}
if(isprime==1){
printf("%d ",x);
}
}
return 0;
}
输出前50个素数(加计数器)
法一:
#include<stdio.h>
int main(){
int x;
int count = 0;
for( x=2; x<10000; x++){
int i;
int isprime=1;
for( i=2; i<x; i++){
if(x % i == 0){
isprime = 0;
break;
}
}
if(isprime==1 && count<50){
printf("%d ",x);
count ++;
}
}
return 0;
}
法二:
#include<stdio.h>
int main(){
int x;
int count = 0;
for( x=2; count<50; x++){
int i;
int isprime=1;
for( i=2; i<x; i++){
if(x % i == 0){
isprime = 0;
break;
}
}
if(isprime==1 ){
printf("%d ",x);
count ++;
}
}
return 0;
}
拼钱数
#include<stdio.h>
int main(){
int x;
int one, two, five;
scanf("%d", &x);
for(one=1; one<x*10; one++){
for(two=1; two<x*10/2; two++){
for(five=1; five<x*10/5; five++){
if(one*1+two*2+five*5==x*10){
printf("可以用%d个一角和%d个二角和%d个五角组成%d元\n", one, two, five, x);
}
}
}
}
return 0;
}
运行结果是所有情况
若只需一种就可以,则:method1:接力break
#include<stdio.h>
int main(){
int x;
int exit=0;
int one, two, five;
scanf("%d", &x);
for(one=1; one<x*10; one++){
for(two=1; two<x*10/2; two++){
for(five=1; five<x*10/5; five++){
if(one*1+two*2+five*5==x*10){
printf("可以用%d个一角和%d个二角和%d个五角组成%d元\n", one, two, five, x);
exit = 1;
break;
}
if(exit) break;
}
if(exit) break;
}
if(exit) break;
}
return 0;
}
运行结果:
method 2: goto
#include<stdio.h>
int main(){
int x;
int exit=0;
int one, two, five;
scanf("%d", &x);
for(one=1; one<x*10; one++){
for(two=1; two<x*10/2; two++){
for(five=1; five<x*10/5; five++){
if(one*1+two*2+five*5==x*10){
printf("可以用%d个一角和%d个二角和%d个五角组成%d元\n", one, two, five, x);
goto out;
}
}
}
}
out: return 0;
}
break和continue的区别
break是跳出本层循环
continue是跳出本次循环,也就是continue之后的内容不再执行,符合循环条件的下一次循环还会执行
循环应用
前n项求和
++
#include<stdio.h>
int main(){
int n;
int i;
double sum = 0.0;
scanf("%d", &n);
for(i=1; i<=n; i++){
sum += 1.0/i;
}
printf("f(%d)=%f",n,sum);
}
加减
#include<stdio.h>
int main(){
int n;
int i;
int sign=1;
double sum = 0.0;
scanf("%d", &n);
for(i=1; i<=n; i++){
sum += sign*1.0/i;
sign = -sign;
}
printf("f(%d)=%f",n,sum);
}
求最小公约数(枚举)
#include<stdio.h>
int main(){
int a, b;
scanf("%d %d",&a,&b);
int min;
if(a<b){
min = a;
}else{
min = b;
}
int ret = 0;
int i;
for( i=1; i<min; i++){
if(a%i==0 && b%i==0){
ret=i;
printf("%d和%d的最小公约数是%d\n",a,b,ret);
}
}
}
求最大公约数(枚举)
#include<stdio.h>
int main(){
int a, b;
scanf("%d %d",&a,&b);
int min;
if(a<b){
min = a;
}else{
min = b;
}
int ret = 0;
int i;
for( i=1; i<min; i++){
if(a%i==0 && b%i==0){
ret=i;
}
}
printf("%d和%d的最大公约数是%d\n",a,b,ret);
}
求最大公约数(辗转相除)
如下图所示,15和40 的最大公约数是 5
#include<stdio.h>
int main(){
int a, b;
scanf("%d %d",&a,&b);
int t;
while(b!=0){
t = a%b;
a=b;
b=t;
}
printf("最大公约数是%d\n",a);
}
整数分解
一、逆序输出各位数,要求两个数字之间有空格,最后一个数字之后没有空格,并和系统提示输入语句分开
#include<stdio.h>
int main(){
int x;
scanf("%d", &x);
do{
int d = x%10;
printf("%d", d);
if(x>9){
printf(" ");
}
x /= 10;
}while(x>0);
printf("\n");
return 0;
}
二、逆序输出整个数
#include<stdio.h>
int main(){
int x,t=0;
scanf("%d", &x);
do{
int d = x%10;
t = t*10+d;
x /= 10;
}while(x>0);
printf("%d\n",t);
x=t;
do{
int d = x%10;
printf("%d", d);
if(x>9){
printf(" ");
}
x /= 10;
}while(x>0);
printf("\n");
return 0;
}
实际上第二次应该输出7 0 0
三、改进
#include<stdio.h>
int main(){
int x,mask = 1;
scanf("%d", &x);
int t = x;
while (t>9){
t /= 10;
mask *= 10;
}
do{
int d = x/mask;
printf("%d", d);
if(mask > 9){
printf(" ");
}
x %= mask;
mask /= 10;
}while(x>0);
printf("\n");
return 0;
}
编程练习
素数和(5分)
题目内容:
我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。
现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。
输入格式:
输入两个整数,第一个表示n,第二个表示m。
输出格式:
一个整数,表示第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。
输入样例:
2 4
输出样例:
15
时间限制:500ms内存限制:32000kb
#include<stdio.h>
int isPrime(int i,int a[],int count); //判断素数函数
int main()
{
int n,m;
int a[200]={2};
int count=1,i=3,sum=0;
scanf("%d %d",&n,&m);
while(count<m){ //制作一个含有m个素数的素数表
if(isPrime(i,a,count)) a[count++]=i;
i++;
}
for(i=n-1;i<m;i++){
sum+=a[i];
}
printf("%d",sum);
return 0;
}
int isPrime(int x,int a[],int count)
{
int ret=1;
int i;
for(i=0;i<count;i++){ //用已知素数去除当前数,判断是否为素数
if(x%a[i]==0) {
ret=0; break;
}
}
return ret;
}
念整数(5分)
题目内容:
你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。
如输入1234,则输出:
yi er san si
注意,每个字的拼音之间有一个空格,但是最后的字后面没有空格。当遇到负数时,在输出的开头加上“fu”,如-2341输出为:
fu er san si yi
输入格式:
一个整数,范围是[-100000,100000]。
输出格式:
表示这个整数的每一位数字的汉语拼音,每一位数字的拼音之间以空格分隔,末尾没有空格。
输入样例:
-30
输出样例:
fu san ling
时间限制:500ms内存限制:32000kb
#include<stdio.h>
int main(){
long int x;
int a[6],i,n;
i=0;n=0;
scanf("%ld",&x);
if(x<0) {
printf("fu ");
x=-x;
}
do{
a[i]=x%10;
i++;n++;
x/=10;
}while(x>0);
for(i=n-1;i>=0;i--){
switch(a[i]){
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(i>0) printf(" ");
}
return 0;
}