C语言第五章-循环结构程序设计
第五章 循环结构程序设计
1、2题都是根据流程图写代码,略
3.输人两个正整数m和n,求其最大公约数和最小公倍数(这道题重点留意)
#include <stdio.h>
//输入两个整数,求两个数的最大公约数__使用的是辗转相除法
int gcd(int m, int n)
{
int temp;
int mod;
printf("m=%d,n=%d\n",m,n);
//保证m最大
if(m<n)
{
temp = m;
m = n;
n = temp;
}
printf("m=%d,n=%d\n",m,n);
//用辗转相除法求最大公约数
while (n!=0)
{
mod = m%n;
m = n;
n = mod;
}
printf("最大公约数为:%d\n",m);
return m;
}
//输入两个整数,求两个数的最小公倍数
//注意:两个数相乘 = 两数最大公约数 * 两数最小公倍数
int lcm(int m, int n)
{
int gcd_value;
int lcm_value;
gcd_value = gcd(m, n);
lcm_value = (m*n)/gcd_value;
printf("最小公倍数为:%d\n",lcm_value);
return 0;
}
//输人两个正整数m和n,求其最大公约数和最小公倍数
int main()
{
int m,n;
int gcd_value;
printf("请输入整数m和n,用空格隔开:\n");
scanf("%d %d",&m,&n);
gcd(m, n);
lcm(m, n);
return 0;
}
4.输人一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
#include<stdio.h>
int main()
{
int i;
int letter=0,space=0,digit=0,other=0;
char char_value;
printf("请输入字符串:\n");
while ((char_value = getchar()) != '\n')
{
// printf("char_value:%c\n",char_value);
if((char_value>='a'&&char_value<='z')||(char_value>='A'&&char_value<='Z'))
letter++;
else if(char_value==' ')
space++;
else if(char_value>='0'&&char_value<='9')
digit++;
else
other++;
}
printf("字母数为:%d,数字数为%d,空格数为%d,其它字符数为%d\n",letter,digit,space,other);
return 0;
}
#include <stdio.h>
#include <math.h>
int main()
{
int a=2;
int n;//手动输入
int sum=0;
int i,next_result=0;
printf("请输入位数n:\n");
scanf("%d",&n);
printf("a为:%d,n为:%d\n",a,n);
//计算式子
for(i=0;i<n;i++)
{
next_result = a * pow(10,i) + next_result;
printf("结果next_result为:%d\n",next_result);
sum = sum + next_result;
}
printf("结果sum为:%d",sum);
return 0;
}
#include <stdio.h>
//阶乘模块
double jiecheng(int k)
{
double result=1;
int j;
int n=k;
int k_value = k;
for(j=0;j<n;j++) //阶乘k次
{
result = k_value*result;
k_value--;
}
printf("%d的阶乘为:%lf\n",k,result);
return result;
}
int main()
{
int i;
int n=20;
double sum=0;
double pre_sum;
for(i=1;i<=n;i++)
{
pre_sum = jiecheng(i);
sum = sum + pre_sum;
}
printf("最终的结果为sum=%lf\n",sum);
return 0;
}
7、
#include <stdio.h>
#include <math.h>
int main()
{
double k;
float sum1=0,sum2=0,sum3=0,sum=0;
//第一块
for(k=1;k<=100;k++)
{
sum1 = sum1 + k;
}
printf("sum1的值为:%f\n",sum1);
//第2块
for(k=1;k<=50;k++)
{
sum2 = sum2 + pow(k,2);
}
printf("sum2的值为:%f\n",sum2);
//第3块
for(k=1;k<=10;k++)
{
sum3 = sum3 + 1/k;
}
printf("sum3的值为:%f\n",sum3);
//总和
sum = sum1+sum2+sum3;
printf("总和sum的值为:%f\n",sum);
return 0;
}
8、输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是水仙花数,因为153=13+53+3^3。
#include <stdio.h>
#include <math.h>
int main()
{
int i,j;
int baiwei,shiwei,gewei;
for(i=100;i<1000;i++)
{
//获取三位数的百位、十位、个位
j=i;
gewei = j%10;
shiwei = ((j-gewei)/10)%10; //也可以直接shiwei = (j/10)%10
baiwei = ((((j-gewei)/10)-shiwei)/10)%10; //也可以直接baiwei = j/100
if(i == (pow(baiwei,3)+ pow(shiwei,3)+ pow(gewei,3)))
{
printf("数:%d为水仙花数\n",i);
}
}
return 0;
}
9、一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子:6 its factors are 1,2,3
按照提议,这里的因子应该是除了本身以外的约数了
#include <stdio.h>
int main()
{
int i,j,k;
int a[1000];
int index=0;//作为数组下标
for(i=0;i<1000;i++)//让数组元素全为0
{
a[i]=0;
//printf("%d",a[i]);
}
printf("\n");
int sum=1;
//找出一个数的因子(因子不包括1和本身),1不是完数
for(i=2;i<=1000;i++)//1-1000的数
{
for(j=2;j<=(i/2);j++)//从2开始,因为除以1都是本身,而本身不能算上去,最终在后面加1即可
{
if((i%j)==0)//判断是不是因子
{
if(j<=(i/j))//去掉重复的
{
if(j==(i/j))//一样时只需要一个
{
//printf("数%d的因子为:%d\n",i,j);
a[index]=j;//保存到数组,同时下标后移一位
index++;
}
else//两个因子不一样时
{
//printf("数%d的因子为:%d,%d\n",i,j,i/j);
a[index]=j;//保存到数组,同时下标后移2位
a[index+1]=(i/j);
index++;
index++;
}
}
}
}
for(k=0;k<1000;k++)
{
sum = sum + a[k];
}
if(sum==i)//一个数如果恰好等于它的因子之和,这个数就称为“完数”
{
printf("数%d是完数,除本身外因子的和为:%d\n",i,sum);
//打印
printf("数%d its factors are:1,",i,sum);
for(k=0;k<1000;k++)
{
if(a[k]!=0)
{
printf("%d,",a[k]);
}
}
printf("\n");
}
sum = 1;//和归1
index=0;//数组下标归0
for(k=0;k<1000;k++)//让数组元素归0
{
a[k]=0;
}
}
}
这里打印其实还可以排序一下,这里不搞了。而且我的方法复杂了,其实没必要把每次因子具体算出来
10、
#include <stdio.h>
int main()
{
int i;
int n=20;
float sum=0;
float up_value=2,load_value=1,temp;
for(i=1;i<=n;i++)
{
sum=sum + up_value/load_value;
//下一项时
temp = load_value;
load_value = up_value;
up_value = up_value+temp;
}
printf("和sum为:%f\n",sum);
return 0;
}
11、一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高。
#include <stdio.h>
int main()
{
int i;
double init_high=100;
int rebound_time=10;//反弹次数
double temp_high=0;
double path=0;
temp_high = init_high;
for(i=1;i<=rebound_time;i++)
{
if(i==1)//第一次落地
{
path = init_high;
printf("第%d次落地时共经过:%f米\n",i,path);
}
else//第二次开始直接+temp_highx2
{
path = path + temp_high*2;
printf("第%d次落地时共经过:%f米\n",i,path);
}
temp_high = temp_high/2;
printf("第%d次反弹高度为:%f米\n",i,temp_high);
}
return 0;
}
12、猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个桃子。
#include <stdio.h>
int main()
{
int number=1;
int flag= 1;
int day;
int temp;
int last_number=1;
//从1开始搜索,搜索到就停止
while (flag)
{
temp = number;
printf("桃子数搜索到第%d个\n",temp);
for(day=1;day<=9;day++)
{
last_number = (last_number/2)-1;
printf("第%d天吃完后桃子剩下:%d个\n",day,last_number);
}
if(last_number==1)//搜索到就退出
{
flag = 0;
}
else
{
number++;
last_number = number;
}
}
printf("第一天共摘了%d个桃子\n",temp);
return 0;
}
这种方法也能做出来,直接暴力从1开始搜索。这种坏处是时间复杂度很高很高,但基本上不用什么逻辑就能实现。
方法二、书本方法,直接推出关系式子进行求解
#include <stdio.h>
int main()
{
int day = 9;
int prev_day_count;
int cur_day_count = 1;
while (day > 0)
{
prev_day_count = (cur_day_count + 1) * 2;
cur_day_count = prev_day_count;
day--;
}
printf("total count : %d\n", cur_day_count);
return 0;
}
这种方法相比来说还是特别简单的,速度也快,时间复杂度小。刚开始没想这样子做~~~
13、
剩下先不做,去练一下数组先
第六章 利用数组处理批量数据
第七章 用函数实现模块化程序设计
第八章 善于利用指针
第九章 用户自己建立数据类型
第十章 对文件的输入输出
本文来自博客园,作者:JaxonYe,转载请注明原文链接:https://www.cnblogs.com/yechangxin/articles/16093909.html
侵权必究