某不知名学校C语言作业 循环这个玩意 总结一句话就是确定次数用for 不确定用while
想先进行一次循环用do while 不过很少用到 看题先
第一题
两数合并成一个整数
输入两个两位数的正整数a、b,编写程序将a、b合并形成一个整数放在c中,合并的方式是:将a数的十位和个位数依次放在c数的百位和个位上,b数的十位和个位数依次放在c数的十位和千位上,输出c的结果。
分析 首先a,b,都是正整二位数 们要单独提取出十位个位怎么办
假设a是16 我们用整型除法 16/10 就会得到1 也就是十位的数字 如果16%10 会得到6也就是个位数字 假设a是167 我们要得到十位就是a%100/10 小朋友们学会了吗 但是数字大了后期推荐用数组存 这也是为什么只考二位数的原因
提取出来就好办了 对应位数乘以倍率就是对应位数
个人答案如下
# include <stdio.h>
int main()
{
int a,b,c;
scanf("%d %d",&a,&b);
c=a/10*100+a%10+b/10*10+b%10*1000;
printf("%d",c) ;
return 0;
}
老师答案如下
#include "stdio.h"
int main()
{ int a,b,c;
scanf("%d%d",&a,&b);
if (a>=10&&a <=99&&b>=10&&b <=99){//老师多了一个二位正数判断
//感觉没必要 题目已经说明了输入
int i,j,k,l;
i=a/10;
j=a%10;
k=b/10;
l=b%10;
printf("%d\n",i*100+j+k*10+l*1000);
}
else
printf("input error");
return 0;
}
第二题
模拟简单计算器
编写一个模拟简单计算器的程序,计算表达式:a1 op a2的值,要求 a1.op、a2从盘输入。其中a1.a2(作除数时不能为0)为数值,op为运算符+、-、*、/。 输出结果要求为double类型,如输入:1+1,程序应该返回2.000000。
分析
加减乘除 仅四种情况 可以用if 也可以 swich 要注意运算符号是字符用%c就好了 同时答案也是犯病 明明都用double了还只输出两位小数
个人代码如下
# include <stdio.h>
int main()
{
double a1,a2;
char op;
scanf("%lf %c %lf",&a1,&op,&a2);
if(op=='+')printf("%.2lf",a1+a2);
else if(op=='-')printf("%.2lf",a1-a2);
else if(op=='*')printf("%.2lf",a1*a2);
else printf("%.2lf",a1/a2);
return 0;
}
老师答案如下 多了无关紧要的判断句 感觉答案是书上的不是自己手打的
#include "stdio.h"
int main()
{
double a1,a2;
char op;
scanf("%lf%c%lf",&a1,&op,&a2);
switch(op){
case '+':printf("%lf",a1+a2);break;
case '-':printf("%lf",a1-a2);break;
case '*':printf("%lf",a1*a2);break;
case '/':
if (a2!=0) printf("%lf",a1/a2);
else printf("input error");
break;
default:printf("input error");
}
return 0;
}
第三题
三天打鱼两天晒网
中国有句俗语叫“三天打鱼两天晒网”。某人从2000年1月1日起开始“三天打鱼两天晒网”,编写程序判断这个人在以后的某一天中是“打鱼”还是“晒网”
分析
首先判断是不是闰年 闰年可以被4整除但不能被100整除或者可以被400整除
其次要算出当年过去的天数 比较复杂
然后算出一共几年加起来的天数time
最后对5取余 余数是1 2 3则打鱼 其他情况则晒网
而且 这出题每次不告诉你输入输出 蒸乌鱼 日期要2022/11/1 输出是fishing和sleeping
个人代码如下(其实可以分出函数或者结构体来优化好看一点,后面再试试)
#include<stdio.h>
main()
{
int year, month, day, time, i;
int each_month[12] = {31, 29, 31, 30, 31, 30 ,31, 31, 30, 31, 30, 31};
scanf("%d/%d/%d", &year, &month, &day);
time = 0;
for(i = 2000; i < year; i++)
{
if((i % 400 == 0) || (i % 4 == 0) && (i % 100 != 0))
{
time += 366;
}
else
{
time += 365;
}
}
//判断闰年
if((year % 400 == 0) || (year % 4 == 0) && (year % 100 != 0))
{
if(month > 2)
{
for(i = 0; i < (month - 1) ; i++)
{
time += each_month[i];
}
time += day;
}
else if(month < 2)
{
time += day;
}
else
{
time = time + 31 + day;
}
}
else
{
each_month[1] = 28;
if(month > 2)
{
for(i = 0; i < (month - 1) ; i++)
{
time += each_month[i];
}
time += day;
}
else if(month < 2)
{
time += day;
}
else
{
time = time + 31 + day;
}
}
//判断处于打鱼日还是晒网
if(0 < (time % 5) && (time % 5) < 4)
printf("fishing");
else
printf("sleeping");
}
老师答案如下
#include "stdio.h"
int main()
{
int y,m,d,days=0;
scanf("%d/%d/%d",&y,&m,&d);
days=365*(y-2000);//计算整年的天数
for (int i=2000;i <y;i++) //修正闰年的366天
if((i%400==0)||((i%100!=0)&&(i%4==0)))
days++;
for (int i=1;i <m;i++){ //计算整月的天数
switch (i){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days=days+31;break;
case 4:
case 6:
case 9:
case 11:
days=days+30;break;
case 2:
days=days+28;
if((y%400==0)||((y%100!=0)&&(y%4==0))) days++;
break;
}
}
days=days+d; //计算当月已经过去的天数
if (days%5==1||days%5==2||days%5==3)
printf("fishing\n");
else
printf("sleeping\n");
return 0;
}
第四题
求两数的最大公约数和最小公倍数
输入两个正整数m和n,求其最大公约数和最小公倍数
最小公约数 使用欧几里得算法 最大公倍数 就是两数相乘除以最小公约数
思路简单明了 欧几里得算法实例如下(百度百科)
假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:
1997 ÷ 615 = 3 (余 152)
615 ÷ 152 = 4(余7)
152 ÷ 7 = 21(余5)
7 ÷ 5 = 1 (余2)
5 ÷ 2 = 2 (余1)
2 ÷ 1 = 2 (余0)
至此,最大公约数为1
以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。
# include <stdio.h>
int main()
{
int m;//数学原理转化成程序 欧几里得算法
int n;
scanf("%d %d",&m,&n);
int i;
if(m<n) {
i=m;m=n;n=i;}//这是防止除数大于被除数 进行交换
int t1 ,t2;
t1=m;t2=n;
int r=m%n;
if(m>=n){
while(r!=0){
r=m%n;
m = n;
n = r;
r = m%n;
}
printf("最大公约数:%d\n最小公倍数:%d",n,t1*t2/n);
}else{
printf("程序错误");
}
return 0;
}
老师答案如下(这次的确答案更好 自己写没有大局观 总是少哪一步加哪一步
include "stdio.h"
int main()
{
int p,r,n,m,temp;
scanf("%d %d",&n,&m);
if (n <m) {
temp=n;
n=m;
m=temp;
}
p=n*m;
while(m!=0) {
r=n%m;
n=m;
m=r;
}
printf("最大公约数:%d\n",n);
printf("最小公倍数:%d\n",p/n);
return 0;
}
第五题
循环次数确定 用for 这题感觉没什么值得分析的,c语言经典100题之一
个人代码如下
#include<stdio.h>
int main()
{
float h,s;
h=s=100;
h=h/2; //第一次反弹高度
for(int i=2;i<=10;i++)
{
s=s+2*h;
h=h/2;
}
printf("第10次落地时共经过%f米\n第10次反弹%f米",s,h);
return 0;
}
老师代码如下
#include "stdio.h"
int main()
{
double sn=100,hn=sn/2;
int n;
for (n=2; n <=10; n++) {
sn=sn+2*hn;
hn=hn/2;
}
printf("第10次落地时共经过%.6lf米\n",sn);
printf("第10次反弹%.6lf米\n",hn);
return 0;
}
第六题
求1到100数字相加之和
用while语句编写程序求1+2+3+…+100
分析:这还分析个啥 直接干啊
个人代码如下(当然 你也可以用等差数列求和公式 不过那就不是循环了
#include<stdio.h>
int main()
{
int sum=0;
int i;
for(i=1;i<=100;i++)sum+=i;
printf("%d",sum);
return 0;
}
老师答案如下(正好我for他while
#include "stdio.h"
int main() {
int i=1,sum=0;
while (i <=100) {
sum=sum+i;
i++;
}
printf("%d\n",sum);
return 0;
}
第七题
计算不大于正整数n值的所有正偶数的和
编写一个sum函数求和:输入一个正整数n,统计不大于n值的所有正偶数的和,在主函数中完成输入输出。要求用 do-while 语句实现。
分析:用循环遍历1~n 然后如果%2=0 就计数进去sum 而且这题目不是说不大于n吗 n自己居然不算 。。。。
个人代码如下(我都确定是n-1次循环了还用do while干啥子勒
#include<stdio.h>
int main()
{
int sum=0;
int n;
scanf("%d",&n);
for(int i=1;i<n;i++){
if(i%2==0)sum+=i;
}
printf("%d",sum);
老师答案如下
#include "stdio.h"
int main() {
int n,sum=0,i ;
scanf("%d",&n) ;
i = 2;
do {
sum=sum+i;
i+=2;
} while(i <n);
printf("%d\n",sum) ;
}
第八题
韩信点兵
韩信有一队兵,他想知道有多少人,便让士兵排队报数:按从1至5报数,最末一个士兵报的数为1;按从1至6报数,最末一个士兵报的数为5;按从1至7报数,最末一个士兵报的数为4;最后再按从1至11报数,最末一个士兵报的数为10。编程求韩信至少有多少兵?
分析:这道题用for没搞错吧 也不给数据范围 报数1到5 最后一个是1 意思就是n%5==1条件判断 依次类推 但是其实这题有很多答案 但是他输出只要2111一个答案吐了 所以for遍历范围在3000到4000就好(**题目)
个人代码如下
#include<stdio.h>
int main()
{
for(int i=11;i<4000;i++){
if( i%5==1&&i%6==5&&i%7==4&&i%11==10)
printf("%d ",i);
}
return 0;
}
老师答案(他也输出了很多答案 但只取第一个 啥玩意
#include "stdio.h"
int main() {
int i;
for(i=1;; i++) {
if(i%5==1&&i%6==5&&i%7==4&&i%11==10) {
printf("%d",i);
break;
}
}
}
其他部分答案如下
最后 本人也只是一只大一菜狗 如有错误 请多包涵 谢谢观看
好耶 作业做完了